當Kubernets遇上阿里雲 -之七層負載均衡(一).


我們知道Kubernetes的service只能實現基於4層的負載均衡,無法提供7層之上的許多特性,諸如基於URL的負載均衡,SSL支持,三方授權等等;Ingress可以實現七層負載均衡的許多功能,唯一的遺憾就是無法提供一個固定的接入IP。想想當你為業務申請了一個域名后准備將域名綁定到IngressIP上的時候,卻發現后端IP會時不時的變一下是怎樣的心情。本文結合阿里雲SLB為Kubernetes服務提供7層之上的負載均衡。本文假設您已經有一個支持阿里雲的Kubernetes部署,參考

本教程為系列教程,會陸續介紹如何在阿里雲上實現kubernetes的七層負載均衡,並支持諸如健康檢查,帶寬控制,SSL,白名單管理,三方權限驗證,限流,URL重寫等特性。

前置條件

  • 對Kubernetes Service及Ingress有一定的了解。
  • 對NginxIngressController有一定的了解。
  • 已經按照當 Kubernetes 遇到阿里雲部署好一個可用的Kubernetes集群。
  • 阿里雲賬號

七層負載均衡服務拓撲

使用hostNetwork的模式部署兩個NginxIngressController Pod作為七層負載均衡服務,然后為該Nginx Pod提供一個阿里雲SLB接入點。
ali_ingress_slb

部署IngressController

運行NginxIngressController

NginxIngressController的運行需要有一個默認的http后端服務器用來返回自定義的404與200頁面,因此通過下面的yaml文件可以創建一個default_http_server服務,一個NginxIngressController RC.

  • 監聽端口為宿主機的80和443,確保該端口沒有占用。
  • 注意自定義--ingress-class="nginx-1",這個用來設定NginxController會處理哪些Ingress. 請留意這個值
  • --publish-service 指定使用CloudProvider提供的IP。
root@iZbp:~# curl -L http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/ingress/0.9.0/nginx-ingress-controller.yaml -o nginxcontroller-0.9.0-beta.yml
root@iZbp:~# vi nginxcontroller-0.9.0-beta.yml
root@iZbp:~# kubectl apply -f nginxcontroller-0.9.0-beta.yml

為NginxIngressController創建阿里雲SLB。

由於NginxIngressController又RC啟動,無固定IP。因此需要在NginxIngressController上堆疊一個阿里雲SLB。通過使用annotationservice.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort: "http:80,http:443"service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag: off來啟用阿里雲SLB的Http協議,並關閉SLB的健康檢查,健康檢查相關功能交給NginxIngressControllerPod.阿里雲SLB配置參見

root@iZbp:~# curl -L http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/ingress/0.9.0/static-ip-svc.yaml -o alicloud-slb-4nginxingress.yml
root@iZbp:~# vi alicloud-slb-4nginxingress.yml
root@iZbp:~# kubectl apply -f alicloud-slb-4nginxingress.yml
root@iZbp:~# kubectl get svc --namespace=kube-system
NAME                   CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
default-http-backend   172.19.7.83    <none>         80/TCP                       14h
nginx-ingress-lb       172.19.13.53   116.62.82.64   80:32047/TCP,443:31655/TCP   14h

現在116.62.82.64就是阿里雲為您提供的SLB地址,訪問http://116.62.82.64, 您會被重定向到一個404頁面,就是我們剛才創建的default_http_server.

到此,我們就部署好了一個可用的安全的IngressController了,接下來部署實際應用來測試一下。

運行示例應用

首先創建demo應用echoserver及其service.

按照如下命令創建一個阿里雲SLB,然后您以后所有annotations包含kubernetes.io/ingress.class: "nginx-1"的Ingress流量都會通過這個SLB進入。

root@iZbp:~# curl -L http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/ingress/0.9.0/http-svc.yaml -o echoservers.yml
root@iZbp:~# vi echoservers.yml
root@iZbp:~# kubectl apply -f echoservers.yml
root@iZbp:~# kubectl get svc
root@iZbp:~# kubectl get po

為echoserver創建Ingress

使用下面列出的Ingress文件創建一個Ingress,后端指向http-svc. 注意設置annotation為kubernetes.io/ingress.class: "nginx-1"來使用前面創建的NginxIngressController和阿里雲SLB。 本節先忽略tls配置,但nginx默認包含一個自帶證書。

root@iZbp:~# cat << EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx-1"
spec:
  #tls:
  # This assumes tls-secret exists.
  #- secretName: tls-secret
  rules:
  - http:
      paths:
      - backend:
          # This assumes http-svc exists and routes to healthy endpoints.
          serviceName: http-svc
          servicePort: 80
EOF

root@iZbp:~# kubectl get ing
NAME            HOSTS     ADDRESS        PORTS     AGE
nginx-ingress   *         116.62.82.64   80        13h

現在再次訪問http://116.62.82.64,您會被重定向到https並且瀏覽器給出一個安全提示,這是因為我們並未配置自己的證書。選擇忽略,然后您會看到一個打印了請求信息的頁面,說明應用運行成功。然后您可以將這個IP地址綁定到您購買的域名上了。

小結

本文介紹了如何在阿里雲上為Kubernetes創建七層負載均衡服務。這是一個一個簡單的示例,接下來我們將介紹更加復雜的配置,包含SSL支持,七層URI路由,及多節點負載均衡應對大流量訪問策略等等


免責聲明!

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



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