概念
Ingress是一種HTTP方式的路由轉發機制,為K8S服務配置HTTP負載均衡器,通常會將服務暴露給K8S群集外的客戶端。
Ingress是一個允許入站連接到達集群服務的規則集合。Ingress能把K8S service配置成外網可訪問集群service的URL、負載均衡、SSL、基於名稱的虛擬主機等。
單純創建一個Ingress沒有任何意義,需要部署一個Ingress Controller(Ingress控制器,下文簡稱IC)來實現Ingress。
在GCE/GKE環境下,會自動在master節點上部署一個IC。在非GCE/GKE的環境中,必須部署和運行一個IC。
IC是通過輪詢實時監聽K8S apiserver監視Ingress資源的應用程序,一旦資源發生了變化(包括增加、刪除和修改),將ingress資源存儲到本地緩存,並通知HTTP代理服務器(例如nginx)進行實時更新轉發規則。
這與其他類型的控制器不同,其他類型的控制器通常作為kube-controller-manager二進制文件的一部分運行,在集群啟動時自動啟動。而IC通常使用負載平衡器,它還可以配置邊界路由和其他前端,這有助於以HA方式處理流量。HTTP代理服務器有GCE Load-Balancer、HaProxy、Nginx等開源方案,不同的HTTP代理服務器需要不同的Ingress控制器實現。
如果與HAProxy進行比較:
ingress是配置文件部分,例如haproxy.conf
IC是前端,實現配置文件中的frontend **部分
frontend fe_web1
mode http
maxconn 20000
bind web1:80
acl web1_acl hdr_reg(host) -i ^/web1
use_backend be_web1if web1_acl
HTTP代理服務器是后端,實現配置文件中的backend **部分
backend be_web1
mode http
option httpchk GET / HTTP/1.1\r\nHost:\ web1
balance roundrobin
server testdmp test-dmp-v1:80 check
通訊拓撲圖
通過下面的例子,總結下面的通訊圖(通訊方向從左至右)
VIP:為了防止node出現單點故障,使用LVS+keepalived等軟件實現的。
kube node的docker把IC(ingress controller) pod開啟443和80端口映射到公網,實現外部訪問。
ICpod的作用是ingress的規則發現,根據規則轉發流量給后端的BackendLB。
創建Ingress的yaml文件參數說明
1 apiVersion:extensions/v1beta1 2 kind:Ingress 3 metadata: 4 name: lykops-ingress 5 spec: 6 rules: 7 - http: 8 paths: 9 - path:/lykops 10 backend: 11 serviceName: lykops 12 servicePort:80

apiVersion:extensions/v1beta1 kind:Ingress metadata: name: lykops-ingress spec: rules: - http: paths: - path:/lykops backend: serviceName: lykops servicePort:80
如果沒有配置Ingress controller就將其POST到API server不會有任何用處
配置說明
1-4行:跟K8S的其他配置一樣,ingress的配置也需要apiVersion,kind和metadata字段。
5-7行: Ingress spec 中包含配置一個LB或proxy server的所有信息。最重要的是,它包含了一個匹配所有入站請求的規則列表。目前ingress只支持http規則。
8-9行:每條http規則包含以下信息:一個host配置項(比如for.bar.com,在這個例子中默認是*),path列表(比如:/testpath),每個path都關聯一個backend(比如test:80)。在LB將流量轉發到backend之前,所有的入站請求都要先匹配host和path。
10-12行:正如 services doc中描述的那樣,backend是一個service:port的組合。Ingress的流量被轉發到它所匹配的backend。
部署例子
這是例子基於名稱的虛擬主機的ingess。
部署http負載均衡器
cat << EOF > lykops-ingess-backup-l7lb.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: lykops-ingess-backup-l7lb labels: software: apache project: test app: backup-l7lb version: v1 spec: template: metadata: labels: name: lykops-ingess-backup-l7lb software: apache project: lykops app: backup-l7lb version: v1 spec: terminationGracePeriodSeconds: 60 containers: - name: lykops-ingess-backup-l7lb image: docker.io/googlecontainer/defaultbackend:1.0 #livenessProbe: # httpGet: # port: 80 # scheme: HTTP # initialDelaySeconds: 30 # timeoutSeconds: 5 ports: - containerPort: 80 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi EOF kubectl create -f lykops-ingess-backup-l7lb.yaml cat << EOF > lykops-ingess-backup-l7lb-svc.yaml apiVersion: v1 kind: Service metadata: name: test-ingess-backup-l7lb labels: software: apache project: lykops app: backup-l7lb version: v1 spec: selector: name: lykops-ingess-backup-l7lb software: apache project: lykops app: backup-l7lb version: v1 ports: -name: http port: 80 protocol: TCP EOF kubectl create -f lykops-ingess-backup-l7lb-svc.yaml
注意:
注釋部分用途,注釋之后telnet 這個service clusterIP 80,會立即斷開;訪問頁面,提示“連接被重置”,無法訪問。
如果不注釋,livenessProbe檢測認為失敗,會不斷創建pod
配置ingress-controller
cat << EOF > lykops-inging-control.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: lykops-inging-control labels: software: apache project: lykops app: inging-control version: v1 spec: template: metadata: labels: name: lykops-inging-control software: apache project: lykops app: inging-control version: v1 spec: terminationGracePeriodSeconds: 60 containers: - image: docker.io/googlecontainer/nginx-ingress-controller:0.8.3 name: lykops-inging-control #readinessProbe: # httpGet: # path: /healthz # port: 80 # scheme: HTTP #livenessProbe: # httpGet: # path: /healthz # port: 80 # scheme: HTTP # initialDelaySeconds: 10 # timeoutSeconds: 1 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://192.168.20.128:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller #- --default-backend-service=${POD_NAMESPACE}/default-http-backend - --default-backend-service=default/test-ingess-backup-l7lb EOF kubectl create -f lykops-inging-control.yaml
注意:
注釋部分用途,注釋之后訪問頁面,頁面返回502錯誤。
如果不注釋,livenessProbe檢測認為失敗,會不斷創建pod。
配置ingress
cat << EOF > lykops-inging.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: lykops-inging labels: project: lykops app: inging version: v1 spec: rules: - host: web1 http: paths: - path: / backend: serviceName: dpm-web-v1 servicePort: 80 - host: web2 http: paths: - path: / backend: serviceName: dpm-web-v2 servicePort: 80 EOF kubectl create -f test-inging.yaml
測試
測試方法有兩種 1、curl -v http://kube-node的IP地址 -H 'host: web3'
curl -v http://192.168.20.131 -H 'host: web3' * About to connect() to 192.168.20.131 port 80 (#0) * Trying 192.168.20.131... * Connected to 192.168.20.131 (192.168.20.131) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Accept: */* > host: web3 > < HTTP/1.1 200 OK < Server: nginx/1.11.3 < Date: Thu, 10 Aug 2017 07:30:15 GMT < Content-Type: text/html; charset=UTF-8 < Content-Length: 122 < Connection: keep-alive < Last-Modified: Tue, 01 Aug 2017 07:48:36 GMT < ETag: "e03d22-7a-555ac5ff23d00" < Accept-Ranges: bytes < <h1>Kubernetes v1.5.2</h1> <h1>Host Name : 9f16cf3bba3a</h1> <h1>IP Address : 172.16.58.2</h1> <h1>app version: v3 </h1> * Connection #0 to host 192.168.20.131 left intact
2、將訪問url的主機的host中加上:nodeip web1
其他參考:
Kubernetes - 配置Nginx-Ingress 作為服務發現 http://www.cnblogs.com/BenWong/p/7372406.html
Kubernetes Ingress解析:http://blog.csdn.net/qq_34463875/article/details/72730404
初試 Kubernetes 暴漏服務類型之 Nginx Ingress:http://blog.csdn.net/aixiaoyang168/article/details/78485581?locationNum=5&fps=1