天天看點

Alibaba Cloud Provider簡介Alibaba Cloud Provider

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           

建立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           

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

繼續閱讀