Alibaba Cloud Provider
Alibaba Cloud Provider簡介
CloudProvider 提供kubernetes與雲廠商基礎服務的對接能力,由 cloud-controller-manager元件實作。
通過這個元件,可以讓使用者在建立k8s LoadBalancer 類型的service的時候自動的為使用者建立一個阿裡雲SLB,同時動态的綁定與解綁SLB後端,并且提供了豐富的配置允許使用者自定義生成的LoadBalancer.
參考ReleaseNotes.基本使用方式 cloudprovider通過service上的annotation來控制建立Type: LoadBalancer類型的service時的行為。一個基本的annotation示例如下:
apiVersion: v1
kind: Service
metadata:
annotations:
# 這裡填寫相應的annotation, 用例
service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-bp1hfycf39bbeb019pg7m
name: nginx
namespace: default
spec:
ports:
- name: web
port: 443
protocol: TCP
targetPort: 443
type: LoadBalancer
>> 注意事項:
- 如果您的叢集的cloud-controller-manager版本大于等于v1.9.3,對于指定已有SLB的時候,系統預設不再為該SLB處理監聽,使用者需要手動配置該SLB的監聽規則。
執行以下指令,可檢視cloud-controller-manager的版本。
root@master # kubectl get po -n kube-system -o yaml|grep image:|grep cloud-con|uniq
image: registry-vpc.cn-....-controller-manager-amd64:v1.9.3
- 當您的叢集cloudprovider不是最新版的時候,可能無法使用某些功能。參考 如何手動更新CloudProvider 。
建立LoadBalancer的正确姿勢
前置條件。
- 一個可用的阿裡雲容器服務建立的叢集。 參考
- 如何通過kubectl 連接配接到叢集。
- 建立一個普通的nginx應用。 ,後面的示例以改nginx應用為前提。
>> 注意
- 儲存以下yaml為svc.1.yaml , 然後使用 kubectl apply -f svc.1.yaml的方式來建立service.
1. 建立一個公網類型的負載均衡
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
2. 建立一個私網類型的負載均衡
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: "intranet"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
3. 建立HTTP類型的負載均衡
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "http:80"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
4. 建立HTTPS類型的負載均衡
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "https:443"
service.beta.kubernetes.io/alicloud-loadbalancer-cert-id: ${YOUR_CERT_ID}
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
>> 說明:
- 建立https類型的負載均衡需要您提供一個證書ID,如果還沒有證書,請前往SLB控制台建立一個。
5. 限制負載均衡的帶寬。
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth: "100"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
- 隻限制負載均衡的帶寬。所有listener 共享該負載均衡的帶寬。參考 共享執行個體帶寬
6. 指定負載均衡規格
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-spec: "slb.s1.small"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
7. 綁定已有的負載均衡到Service
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
- 預設情況下,綁定已有SLB的時候CloudProvider隻會為您的綁定和解綁SLB後端Server,不會處理監聽。您需要指定service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: "true"來強制覆寫監聽。注意這會删除您已有SLB上的非預期的監聽。
8. 綁定已有負載均衡,并強制覆寫已有監聽
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: "true"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
9. 讓SLB挂載具有指定label的worker節點作為後端server
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-backend-label: "failure-domain.beta.kubernetes.io/zone:ap-southeast-5a"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
- 多個label以逗号分隔。 "k1:v1,k2:v2"
- 多個label之間是and的語義。
10. 為TCP類型的SLB配置會話保持SessionSticky
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-persistence-timeout: "1800"
name: nginx
namespace: default
spec:
ports:
- port: 443
protocol: TCP
targetPort: 443
selector:
run: nginx
type: LoadBalancer
- 該參數僅對TCP監聽起作用。
- 如果service配置了多個TCP的監聽端口,該會話保持預設應用到所有TCP監聽端口
11. 為HTTP&HTTPS類型的SLB配置會話保持SessionSticky(insert cookie)
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session: "on"
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session-type: "insert"
service.beta.kubernetes.io/alicloud-loadbalancer-cookie-timeout: "1800"
service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "http:80"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
- 僅HTTP & HTTPS。
- 會話保持類型為insert,植入Cookie.
- 如果service配置了多個HTTP或者HTTPS的監聽端口,該會話保持預設應用到所有HTTP&HTTPS監聽端口
12. 為HTTP&HTTPS類型的SLB配置會話保持SessionSticky(server cookie)
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session: "on"
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session-type: "server"
service.beta.kubernetes.io/alicloud-loadbalancer-cookie: "${YOUR_COOKIE}"
service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port: "http:80"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
- 會話保持類型為server, 重寫Cookie.
13. 建立的SLB時,指定其主備可用區
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-master-zoneid: "ap-southeast-5a"
service.beta.kubernetes.io/alicloud-loadbalancer-slave-zoneid: "ap-southeast-5a"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
- 某些region的SLB不支援主備可用區,如ap-southeast-5
- 一旦建立,不支援修改主備可用區。
13. 指定SLB僅挂載Pod所在節點作為後端Server
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
externalTrafficPolicy: Local
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
附件:可用的Annotation參數及其說明
- 所有的annotation均為字元類型,使用雙引号括起來。
可用注釋(annotation) | 描述 | 預設值 |
---|---|---|
service.beta.kubernetes.io/alicloud-loadbalancer-protocol-port | 多個值之間由逗号分隔, 比如: https:443,http:80 | 無 |
service.beta.kubernetes.io/alicloud-loadbalancer-address-type | 建立公網類型或者私網類型的SLB, 取值可以是 internet 或者 intranet | "internet" |
service.beta.kubernetes.io/alicloud-loadbalancer-slb-network-type | 負載均衡的網絡類型, 取值可以是 classic 或者 vpc | "classic" |
service.beta.kubernetes.io/alicloud-loadbalancer-charge-type | 取值可以是 paybytraffic 或者 paybybandwidth | "paybytraffic" |
service.beta.kubernetes.io/alicloud-loadbalancer-id | 指定已有負載均衡執行個體的 ID。 删除 service 時該 SLB 不會被删除。 | |
service.beta.kubernetes.io/alicloud-loadbalancer-backend-label | 通過 label 指定 SLB 後端挂哪些節點。 | |
service.beta.kubernetes.io/alicloud-loadbalancer-spec | SLB的規格。 slb.s1.small , slb.s2.small...... 參考API | |
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session | 是否開啟會話保持。 (僅對HTTP和HTTPS類型監聽) 取值:on / off | "off" |
service.beta.kubernetes.io/alicloud-loadbalancer-sticky-session-type | cookie的處理方式。 取值: insert:植入Cookie。 server:重寫Cookie。 (當StickySession的值為on時,必須指定該參數)(僅對HTTP和HTTPS類型監聽) | |
service.beta.kubernetes.io/alicloud-loadbalancer-cookie-timeout | Cookie逾時時間。 取值: 1-86400(秒) 當StickySession為on且StickySessionType為insert時,該參數必選。 | |
service.beta.kubernetes.io/alicloud-loadbalancer-cookie | 伺服器上配置的Cookie。 長度為1-200個字元,隻能包含ASCII英文字母和數字字元, 不能包含逗号、分号或空格,也不能以$開頭。 當StickySession為on且StickySessionType為server時,該參數必選。 | |
service.beta.kubernetes.io/alicloud-loadbalancer-persistence-timeout | 會話保持時間。 (僅對TCP監聽)取值:0-3600(秒) 預設值為0,關閉會話保持。 | "0" |
service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners | 當指定已有SLB的時候,是否強制覆寫該SLB的listener. 預設不覆寫 | "false" |
service.beta.kubernetes.io/alicloud-loadbalancer-region | 負載均衡所在的地域 | |
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth | 負載均衡的帶寬 | “50” |
service.beta.kubernetes.io/alicloud-loadbalancer-cert-id | 阿裡雲上的認證 ID。您需要先上傳證書 | “” |
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-flag | 取值是 on 或者 off 1.預設為 off。 2.TCP 協定預設on, 且不可修改 | off |
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-type | 參見 HealthCheck tcp / http | tcp |
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-uri | ||
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-connect-port | ||
service.beta.kubernetes.io/alicloud-loadbalancer-healthy-threshold | ||
service.beta.kubernetes.io/alicloud-loadbalancer-unhealthy-threshold | ||
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-interval | ||
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-connect-timeout | ||
service.beta.kubernetes.io/alicloud-loadbalancer-health-check-timeout |