我們知道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接入點。
部署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路由,及多節點負載均衡應對大流量訪問策略等等