kubernetes資源對象--ingress


概念

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
View Code

如果沒有配置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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM