Cloud Controller Manager (CCM) memungkinkan Anda mengintegrasikan Kubernetes dengan layanan Alibaba Cloud seperti Classic Load Balancer (CLB) dan Virtual Private Cloud (VPC). Dengan CCM, Anda dapat mengaitkan instance CLB dengan node dalam klaster Kubernetes serta instance Elastic Compute Service (ECS) di luar klaster. Ini membantu mencegah gangguan lalu lintas selama migrasi layanan. CCM juga dapat mengarahkan lalu lintas ke beberapa klaster Kubernetes untuk cadangan data dan pemulihan bencana, memastikan ketersediaan tinggi layanan Anda. Topik ini menjelaskan cara menerapkan CCM di klaster Kubernetes yang dikelola sendiri.
Prasyarat
VNode telah diterapkan di klaster Kubernetes yang dikelola sendiri.
Jika klaster Kubernetes yang dikelola sendiri diterapkan di pusat data, pastikan pusat data tersebut terhubung ke Alibaba Cloud.
Informasi latar belakang
CCM adalah komponen yang disediakan oleh Alibaba Cloud untuk mengintegrasikan Kubernetes dengan layanan Alibaba Cloud. CCM menyediakan fitur-fitur berikut:
Kelola instance Server Load Balancer (SLB)
Jika Anda menetapkan Type ke LoadBalancer untuk sebuah Service, CCM secara otomatis membuat instance CLB untuk Service tersebut dan mengonfigurasi listener serta grup vServer backend untuk instance CLB. Ketika titik akhir dari instance ECS dalam grup vServer untuk sebuah Service diubah atau node klaster diubah, CCM secara otomatis memperbarui grup vServer dari instance CLB.
Aktifkan komunikasi antar-node
Jika Flannel digunakan sebagai plugin jaringan klaster Kubernetes, CCM dapat mengaktifkan koneksi jaringan antara kontainer dan node serta menambahkan blok CIDR pod ke tabel rute VPC tempat klaster diterapkan. Ini memungkinkan kontainer berkomunikasi satu sama lain melintasi node. Fitur ini siap digunakan setelah CCM diinstal.
Untuk informasi lebih lanjut, lihat Cloud Controller Manager.
CCM bersifat open source. Untuk informasi lebih lanjut tentang proyek ini, lihat cloud-provider-alibaba-cloud.
Persiapan
Jika instance ECS tidak digunakan sebagai node dalam klaster Kubernetes yang dikelola sendiri, lewati langkah persiapan ini. Jika instance ECS digunakan sebagai node dalam klaster Kubernetes yang dikelola sendiri, lakukan operasi berikut untuk mengonfigurasi providerID dari instance ECS agar CCM dapat mengelola rute dari instance ECS.
Terapkan OpenKruise untuk menggunakan BroadcastJob.
Contoh perintah:
helm repo add openkruise https://openkruise.github.io/charts/ helm repo update helm install kruise openkruise/kruise --version 1.3.0Untuk informasi lebih lanjut, kunjungi Dokumentasi OpenKruise.
Gunakan BroadcastJob untuk mengonfigurasi providerID dari instance ECS.
Buat file bernama provider.yaml dan salin template berikut ke dalam file tersebut.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ecs-node-initor rules: - apiGroups: - "" resources: - nodes verbs: - get - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ecs-node-initor --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ecs-node-initor subjects: - kind: ServiceAccount name: ecs-node-initor namespace: default roleRef: kind: ClusterRole name: ecs-node-initor apiGroup: rbac.authorization.k8s.io --- apiVersion: apps.kruise.io/v1alpha1 kind: BroadcastJob metadata: name: create-ecs-node-provider-id spec: template: spec: serviceAccount: ecs-node-initor restartPolicy: OnFailure affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet tolerations: - operator: Exists containers: - name: create-ecs-node-provider-id image: registry.cn-beijing.aliyuncs.com/eci-release/provider-initor:v1 command: [ "/usr/bin/init" ] env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName completionPolicy: type: Never failurePolicy: type: FailFast restartLimit: 3Terapkan BroadcastJob.
kubectl apply -f provider.yaml
Lihat hasil eksekusi BroadcastJob.
kubectl get pods -o wideJika semua pod yang namanya mengandung create-ecs-node-provider-id mencapai status Completed, providerID dari instance ECS telah dikonfigurasi. Gambar berikut menunjukkan contoh keluaran.

(Opsional) Hapus BroadcastJob.
kubectl delete -f provider.yaml
Prosedur
Buat ConfigMap.
Simpan pasangan AccessKey akun Alibaba Cloud Anda ke variabel lingkungan.
export ACCESS_KEY_ID=LTAI******************** export ACCESS_KEY_SECRET=HAeS**************************Untuk informasi lebih lanjut tentang cara mendapatkan ID AccessKey dan rahasia AccessKey, lihat Dapatkan pasangan AccessKey.
Jalankan skrip berikut untuk membuat ConfigMap.
Buat skrip bernama configmap-ccm.sh, salin template berikut ke dalam skrip, dan ganti nilai region dengan nilai sebenarnya Anda. Lalu, jalankan skrip tersebut.
#!/bin/bash ## buat ConfigMap kube-system/cloud-config untuk CCM. accessKeyIDBase64=`echo -n "$ACCESS_KEY_ID" |base64 -w 0` accessKeySecretBase64=`echo -n "$ACCESS_KEY_SECRET"|base64 -w 0` cat <<EOF >cloud-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: cloud-config namespace: kube-system data: cloud-config.conf: |- { "Global": { "accessKeyID": "$accessKeyIDBase64", "accessKeySecret": "$accessKeySecretBase64", "region": "cn-hangzhou" } } EOF kubectl create -f cloud-config.yamlbash configmap-ccm.shSetelah skrip dijalankan, ConfigMap bernama cloud-config dibuat di namespace kube-system.
Terapkan CCM.
Ganti
${ImageVersion}dan{$ClusterCIDR}, buat file bernama ccm.yaml, lalu salin template berikut ke dalam file tersebut.Anda bisa mendapatkan nilai dari
ImageVersionberdasarkan catatan pembaruan CCM. Untuk informasi lebih lanjut, lihat Cloud Controller Manager.Anda bisa menjalankan perintah
kubectl cluster-info dump | grep -m1 cluster-cidruntuk melihatClusterCIDR.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:cloud-controller-manager rules: - apiGroups: - coordination.k8s.io resources: - leases verbs: - get - list - update - create - apiGroups: - "" resources: - persistentvolumes - services - secrets - endpoints - serviceaccounts verbs: - get - list - watch - create - update - patch - apiGroups: - "" resources: - nodes verbs: - get - list - watch - delete - patch - update - apiGroups: - "" resources: - services/status verbs: - update - patch - apiGroups: - "" resources: - nodes/status verbs: - patch - update - apiGroups: - "" resources: - events - endpoints verbs: - create - patch - update --- apiVersion: v1 kind: ServiceAccount metadata: name: cloud-controller-manager namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:cloud-controller-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cloud-controller-manager subjects: - kind: ServiceAccount name: cloud-controller-manager namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:shared-informers roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cloud-controller-manager subjects: - kind: ServiceAccount name: shared-informers namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:cloud-node-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cloud-controller-manager subjects: - kind: ServiceAccount name: cloud-node-controller namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:pvl-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cloud-controller-manager subjects: - kind: ServiceAccount name: pvl-controller namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:route-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:cloud-controller-manager subjects: - kind: ServiceAccount name: route-controller namespace: kube-system --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: cloud-controller-manager tier: control-plane name: cloud-controller-manager namespace: kube-system spec: selector: matchLabels: app: cloud-controller-manager tier: control-plane template: metadata: labels: app: cloud-controller-manager tier: control-plane annotations: scheduler.alpha.kubernetes.io/critical-pod: '' spec: serviceAccountName: cloud-controller-manager tolerations: - effect: NoSchedule operator: Exists key: node-role.kubernetes.io/master - effect: NoSchedule operator: Exists key: node.cloudprovider.kubernetes.io/uninitialized nodeSelector: node-role.kubernetes.io/master: "" containers: - command: - /cloud-controller-manager - --leader-elect=true - --cloud-provider=alicloud - --use-service-account-credentials=true - --cloud-config=/etc/kubernetes/config/cloud-config.conf - --configure-cloud-routes=true - --route-reconciliation-period=3m - --leader-elect-resource-lock=endpoints # replace ${cluster-cidr} with your own cluster cidr # example: 172.16.0.0/16 - --cluster-cidr=${ClusterCIDR} # replace ${ImageVersion} with the latest release version # example: v2.1.0 image: registry.cn-hangzhou.aliyuncs.com/acs/cloud-controller-manager-amd64:${ImageVersion} livenessProbe: failureThreshold: 8 httpGet: host: 127.0.0.1 path: /healthz port: 10258 scheme: HTTP initialDelaySeconds: 15 timeoutSeconds: 15 name: cloud-controller-manager resources: requests: cpu: 200m volumeMounts: - mountPath: /etc/kubernetes/ name: k8s - mountPath: /etc/ssl/certs name: certs - mountPath: /etc/pki name: pki - mountPath: /etc/kubernetes/config name: cloud-config hostNetwork: true volumes: - hostPath: path: /etc/kubernetes name: k8s - hostPath: path: /etc/ssl/certs name: certs - hostPath: path: /etc/pki name: pki - configMap: defaultMode: 420 items: - key: cloud-config.conf path: cloud-config.conf name: cloud-config name: cloud-configJalankan perintah berikut untuk menerapkan CCM:
kubectl create -f ccm.yaml
Verifikasi hasil
Buat Service dengan Type=LoadBalancer dan endpoint dari Service tersebut.
Buat file bernama ccm-test.yaml dan salin template berikut ke dalam file tersebut.
Ganti alamat gambar dengan alamat wilayah tempat VNode berada untuk mencegah kegagalan unduhan gambar.
apiVersion: v1 kind: Service metadata: name: nginx namespace: default annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet" spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: test-nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2Jalankan perintah berikut untuk membuat Service dan Deployment:
kubectl create -f ccm-test.yamlSetelah Service dan Deployment dibuat, CCM secara otomatis membuat instance CLB untuk Service tersebut dan mengonfigurasi listener serta grup vServer backend untuk instance CLB.
Periksa apakah Service bekerja sesuai harapan.
Jalankan perintah curl untuk mengakses alamat Service. Layanan backend NGINX dapat diakses melalui alamat Service, seperti ditunjukkan pada gambar berikut.

Untuk informasi lebih lanjut tentang cara menggunakan Service, kunjungi Penggunaan CCM.