CLB支持在ACK集群中使用,通過LoadBalancer類型Service暴露應用。通過阿里云傳統型負載均衡CLB(Classic Load Balancer)暴露的服務(Service),在集群外可通過域名或<IP:服務端口>
的方式訪問服務,在集群內可通過<服務名:服務端口>
的方式訪問服務。本文以Nginx應用為例,介紹如何通過使用已有CLB的服務來公開應用。
前提條件
已存在通過CLB控制臺創建的CLB實例,且該實例與Kubernetes集群處于同一地域。如果沒有創建,請參見創建和管理CLB實例。
背景信息
如果您集群的Cloud Controller Manager(CCM)組件版本大于等于v1.9.3,對于指定已有CLB,CCM默認不再為該CLB處理監聽。您可以通過設置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
參數來啟用監聽配置,或者手動配置該CLB的監聽規則。
查看CCM版本的方法:
使用控制臺:在集群組件管理頁面查看CCM組件版本。
登錄容器服務管理控制臺。
在控制臺左側導航欄,單擊集群。
在集群列表頁面,在目標集群右側,選擇
,進入組件管理頁簽查看CCM的版本信息。
使用kubectl命令行(僅適用于專有版集群):執行以下命令查看CCM組件版本。
kubectl get pod -n kube-system -o yaml|grep image:|grep cloud-con|uniq
注意事項
被復用的CLB需要滿足以下限制條件:
支持復用通過CLB控制臺創建的CLB,不支持復用CCM自動創建的CLB。
如果您需要在Kubernetes集群中復用私網類型的CLB,則該CLB需要和Kubernetes集群處于同一VPC下。
復用CLB的地址類型必須與服務的訪問類型一致。當服務為公網訪問(即
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet"
)時,所用CLB的地址類型必須為公網;當服務為內部訪問(即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
)時,所用CLB的地址類型必須為私網。多個服務不能同時使用一個CLB的同一個監聽端口。
CCM只為
Type=LoadBalancer
類型的服務配置CLB。對于非LoadBalancer類型的服務,則不會為其配置負載均衡。重要當
Type=LoadBalancer
的服務變更為其他類型時,CCM會刪除為該CLB添加的配置,從而造成無法通過該CLB訪問服務。CCM使用聲明式API,會在一定條件下自動根據服務的配置刷新CLB配置。當
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners:
設置為true
時,您自行在CLB控制臺上修改的配置均存在被覆蓋的風險。重要請勿在CLB控制臺上手動修改Kubernetes創建并維護的CLB的任何配置,否則有配置丟失的風險,造成服務不可訪問。
已創建的LoadBalancer類型Service不支持重新指定CLB。如果您需要更換CLB,請重新創建Service。
CLB配額限制
步驟一:部署示例應用
以下應用部署通過kubectl命令行方式進行。如果您需要通過控制臺部署應用,請參見創建無狀態工作負載Deployment。
使用以下示例應用的YAML內容,創建名為my-nginx.yaml文件。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: my-nginx #示例應用的名稱。 labels: app: nginx spec: replicas: 3 #設置副本數量。 selector: matchLabels: app: nginx #對應服務中Selector的值需要與其一致,才可以通過服務公開此應用。 template: metadata: labels: app: nginx spec: # nodeSelector: # env: test-team containers: - name: nginx image: registry.aliyuncs.com/acs/netdia:latest #替換為您實際的鏡像地址,格式為:<image_name:tags>。 ports: - containerPort: 80 #需要在服務中暴露該端口。
執行以下命令,部署示例應用my-nginx。
kubectl apply -f my-nginx.yaml
執行以下命令,確認示例應用狀態正常。
kubectl get deployment my-nginx
返回結果示例:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 50s
步驟二:通過使用已有CLB的服務公開應用
您可以通過控制臺和kubectl兩種方式來創建LoadBalancer類型的服務,并通過其公開應用。
控制臺方式
登錄容器服務管理控制臺。
在控制臺左側導航欄,單擊集群。
在集群列表頁面,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄,選擇 。
在服務頁面,單擊右上角的創建。
在創建服務對話框中,設置服務的相關參數,然后單擊創建。
參數
描述
服務名稱
輸入服務的名稱。
服務類型
選擇服務類型,即服務訪問的方式。
強制覆蓋已有監聽:選擇是否強制覆蓋CLB上的已有監聽或者為沒有監聽的CLB自動創建監聽。
說明如果已有負載均衡的監聽上綁定了業務,強制覆蓋可能會引發業務中斷。
由于CCM目前支持的后端配置有限,無法處理一些復雜配置。如果有復雜的后端配置需求,可以在不覆蓋監聽的情況下,通過控制臺自行配置監聽。
如存在以上兩種情況不建議強制覆蓋監聽;如果已有負載均衡的監聽端口不再使用,則可以強制覆蓋。
外部流量策略
設置外部流量策略。
Local:流量只發給本機的Pod。
Cluster:流量可以轉發到集群中其他節點上的Pod。
說明您的服務類型為節點端口或負載均衡時,才能設置外部流量策略。
服務關聯
選擇關聯該服務要綁定的后端應用。
端口映射
添加服務端口(對應Service YAML文件中的
port
)和容器端口(對應Service YAML文件中的targetPort
),容器端口需要與后端的Pod中暴露的容器端口一致。注解
為該服務添加一個注解(Annotation),配置負載均衡的參數。
標簽
為該服務添加一個標簽,標識該服務。
在服務頁面,可以看到新創建的服務。
在服務頁面,單擊目標服務名稱,進入服務詳情頁面,在基本信息區域,單擊該服務的外部端點,例如39.106.XX.XX:80,訪問示例應用。
Kubectl方式
使用以下示例服務的YAML內容,創建名為my-nginx-svc.yaml的文件。
修改
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id
,請替換${YOUR_LB_ID}為您通過負載均衡管理控制臺創建的CLB實例ID。使用已有的CLB實例時,默認情況下不會為該CLB創建監聽或覆蓋已有監聽。如有需要,請設置
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners
為true
。本示例中,CLB實例為新創建,需要為其創建監聽,因此設為true
。更多注解請參見通過Annotation配置傳統型負載均衡CLB。將selector修改為my-nginx.yaml示例應用文件中matchLabels的值(即:
app: nginx
),從而將該服務關聯至后端應用。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true' labels: app: nignx name: my-nginx-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer
執行以下命令創建名為my-nginx-svc的服務,并通過其公開應用。
kubectl apply -f my-nginx-svc.yaml
執行以下命令確認LoadBalancer類型的服務創建成功。
kubectl get svc my-nginx-svc
返回結果示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.21.5.82 39.106.XX.XX 80:30471/TCP 5m
執行curl <YOUR-External-IP>命令訪問示例應用,請將
YOUR-External-IP
替換為上面獲取到的EXTERNAL-IP
地址。