全部产品
Search
文档中心

Elastic Container Instance:Terapkan CCM

更新时间:Jul 06, 2025

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.

Catatan

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.

  1. 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.0

    Untuk informasi lebih lanjut, kunjungi Dokumentasi OpenKruise.

  2. Gunakan BroadcastJob untuk mengonfigurasi providerID dari instance ECS.

    1. 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: 3
    2. Terapkan BroadcastJob.

      kubectl apply -f provider.yaml
  3. Lihat hasil eksekusi BroadcastJob.

    kubectl get pods -o wide

    Jika semua pod yang namanya mengandung create-ecs-node-provider-id mencapai status Completed, providerID dari instance ECS telah dikonfigurasi. Gambar berikut menunjukkan contoh keluaran.

    部署CCM1

  4. (Opsional) Hapus BroadcastJob.

    kubectl delete -f provider.yaml

Prosedur

  1. Buat ConfigMap.

    1. 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.

    2. 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.yaml
      bash configmap-ccm.sh

      Setelah skrip dijalankan, ConfigMap bernama cloud-config dibuat di namespace kube-system.

  2. Terapkan CCM.

    1. Ganti ${ImageVersion} dan {$ClusterCIDR}, buat file bernama ccm.yaml, lalu salin template berikut ke dalam file tersebut.

      • Anda bisa mendapatkan nilai dari ImageVersion berdasarkan catatan pembaruan CCM. Untuk informasi lebih lanjut, lihat Cloud Controller Manager.

      • Anda bisa menjalankan perintah kubectl cluster-info dump | grep -m1 cluster-cidr untuk melihat ClusterCIDR.

      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-config
    2. Jalankan perintah berikut untuk menerapkan CCM:

      kubectl create -f ccm.yaml

Verifikasi hasil

  1. Buat Service dengan Type=LoadBalancer dan endpoint dari Service tersebut.

    1. 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.2
    2. Jalankan perintah berikut untuk membuat Service dan Deployment:

      kubectl create -f ccm-test.yaml

      Setelah Service dan Deployment dibuat, CCM secara otomatis membuat instance CLB untuk Service tersebut dan mengonfigurasi listener serta grup vServer backend untuk instance CLB.

  2. 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.

    ccm

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