Distributed Cloud Container Platform for Kubernetes (ACK One) memungkinkan Anda menggunakan kluster terdaftar untuk menghubungkan kluster Kubernetes eksternal yang diterapkan di pusat data lokal atau penyedia cloud lainnya ke dalam Container Service for Kubernetes (ACK). Ini mendukung pengelolaan terpusat kluster dan sumber daya serta memfasilitasi penyebaran cepat lingkungan hybrid cloud. Jika sumber daya komputasi di pusat data lokal terbatas, Anda dapat membuat kelompok node untuk memperluas sumber daya komputasi di cloud, memenuhi permintaan pertumbuhan bisnis dinamis. Topik ini menjelaskan cara membuat skrip kustom yang diperlukan untuk menyediakan kelompok node cloud.
Prasyarat
Kluster terdaftar ACK One telah dibuat dan kluster Kubernetes eksternal yang diterapkan di pusat data lokal telah terhubung ke kluster terdaftar ACK One.
Jaringan dari kluster Kubernetes eksternal terhubung ke virtual private cloud (VPC) dari kluster terdaftar ACK One. Untuk informasi lebih lanjut, lihat Penggunaan jaringan berbasis skenario untuk koneksi VPC.
Impor konfigurasi proxy dari kluster Kubernetes eksternal ke kluster terdaftar ACK One dalam mode jaringan pribadi. Untuk informasi lebih lanjut, lihat Asosiasikan kluster Kubernetes eksternal dengan kluster terdaftar ACK One.
Prosedur
Anda dapat menggunakan skrip node sampel atau membuat skrip kustom berdasarkan lingkungan aktual dan kondisi pada gambar sebelumnya.
Skrip sampel hanya mendukung sistem operasi yang menggunakan Yellowdog Updater, Modified (YUM) sebagai manajer paket.
Langkah 1 (A): Tambahkan variabel lingkungan Alibaba Cloud ke skrip kustom
Periksa apakah sebuah node adalah node GPU-accelerated. Langkah ini opsional.
Gunakan skrip berikut untuk memeriksa apakah sebuah node Elastic Compute Service (ECS) adalah node GPU-accelerated.
#!/bin/bash # Periksa apakah Ispci terinstal. if ! which lspci &>/dev/null; then yum -y install pciutils fi # Periksa apakah node dilengkapi dengan GPU. if lspci | grep -i nvidia &>/dev/null; then echo "Instal driver yang relevan karena node adalah node GPU-accelerated." fiBerbeda dengan node ECS biasa, Anda harus menginstal driver dan plugin perangkat untuk node GPU-accelerated. Untuk informasi lebih lanjut, lihat Memperbarui driver NVIDIA node secara manual.
Siapkan skrip kustom untuk memastikan bahwa kelompok node dari kluster terdaftar dapat menyinkronkan status node secara normal untuk penjadwalan sumber daya. Skrip kustom perlu mendapatkan variabel lingkungan yang dikeluarkan oleh kluster terdaftar. Metode untuk mendapatkan variabel lingkungan bergantung pada cara kluster Kubernetes eksternal dibuat. Anda dapat menggunakan metode kubeadm atau binari untuk membuat kluster Kubernetes.
Kluster Kubernetes dibuat menggunakan metode kubeadm
Metode kubeadm direkomendasikan oleh Kubernetes, di mana kluster Kubernetes disiapkan menggunakan alat resmi kubeadm. Tambahkan konten berikut ke skrip node kustom:
.... ####### <Tambahkan konten berikut. # Konfigurasikan label node, taints, nama node, dan ID penyedia node. KUBELET_CONFIG_FILE="/etc/sysconfig/kubelet" if [[ $ALIBABA_CLOUD_LABELS != "" ]];then option="--node-labels" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_LABELS},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_TAINTS != "" ]];then option="--register-with-taints" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_TAINTS},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_NODE_NAME != "" ]];then option="--hostname-override" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_NODE_NAME},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME}\"" $KUBELET_CONFIG_FILE fi fi if [[ $ALIBABA_CLOUD_PROVIDER_ID != "" ]];then option="--provider-id" if grep -- "${option}=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_PROVIDER_ID},@g" $KUBELET_CONFIG_FILE elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE &> /dev/null;then sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID} @g" $KUBELET_CONFIG_FILE else sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID}\"" $KUBELET_CONFIG_FILE fi fi ####### Tambahkan konten sebelumnya. # Mulai ulang runtime dan kubelet. ....Kluster Kubernetes dibuat menggunakan metode binari
Jika kluster Anda dibuat menggunakan file binari Kubernetes, modifikasi konfigurasi boot kubelet dalam skrip node kustom untuk mendapatkan variabel lingkungan. Biasanya, file
kubelet.servicedisimpan di direktori/usr/lib/systemd/system/.cat >/usr/lib/systemd/system/kubelet.service <<EOF # Konfigurasi kustom tidak ditampilkan. ... [Service] ExecStart=/data0/kubernetes/bin/kubelet \\ # Modifikasi konfigurasi berikut. --node-ip=${ALIBABA_CLOUD_NODE_NAME} \\ --hostname-override=${ALIBABA_CLOUD_NODE_NAME} \\ --node-labels=${ALIBABA_CLOUD_LABELS} \\ --provider-id=${ALIBABA_CLOUD_PROVIDER_ID} \\ --register-with-taints=${ALIBABA_CLOUD_TAINTS} \\ .... --v=4 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
Tabel berikut menjelaskan variabel lingkungan yang dikeluarkan oleh kluster terdaftar.
Variabel lingkungan | Deskripsi | Contoh |
ALIBABA_CLOUD_PROVIDER_ID | Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, kluster terdaftar tidak dapat berjalan secara normal. | ALIBABA_CLOUD_PROVIDER_ID=cn-shenzhen.i-wz92ewt14n9wx9mo*** |
ALIBABA_CLOUD_NODE_NAME | Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, node dalam kelompok node mungkin berjalan dalam keadaan abnormal. | ALIBABA_CLOUD_NODE_NAME=cn-shenzhen.192.168.1.*** |
ALIBABA_CLOUD_LABELS | Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, kesalahan mungkin terjadi selama pengelolaan kelompok node dan penjadwalan beban kerja antara node cloud dan on-premises. | ALIBABA_CLOUD_LABELS=alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142***,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670***,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu Label workload=cpu adalah label kustom yang didefinisikan dalam konfigurasi kelompok node. Label lainnya adalah label sistem. |
ALIBABA_CLOUD_TAINTS | Skrip node kustom harus mendapatkan variabel lingkungan ini. Jika tidak, taints yang ditambahkan ke kelompok node tidak akan berlaku. | ALIBABA_CLOUD_TAINTS=workload=ack:NoSchedule |
Setelah menyelesaikan langkah-langkah sebelumnya, lanjutkan ke Langkah 2: Simpan dan unggah skrip ke server file.
Langkah 1 (B): Tambahkan skrip node
Dapatkan informasi sistem yang relevan.
Versi Kubernetes kluster adalah 1.18 atau lebih baru
Jalankan perintah berikut untuk memeriksa versi Kubernetes dari kluster eksternal. Versi Kubernetes akan ditentukan dalam variabel lingkungan
KUBE_VERSIONdari skrip sampel di langkah-langkah berikutnya.kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'Output yang diharapkan:
v1.14.10Jalankan perintah berikut untuk memeriksa runtime dan versi runtime dari kluster eksternal. Runtime dan versi runtime akan ditentukan dalam variabel lingkungan
RUNTIME_VERSIONdari skrip sampel di langkah-langkah berikutnya.kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'Output yang diharapkan:
docker://18.6.3 # Docker digunakan. containerd://1.4.3 # containerd digunakan.Jalankan perintah berikut untuk memeriksa perintah kubeadm yang digunakan untuk menambahkan node. Perintah tersebut akan ditentukan dalam variabel lingkungan
KUBEADM_JOIN_CMDdari skrip sampel di langkah-langkah berikutnya.# --ttl 0 sangat penting. Atur TTL ke 0 (tidak ada waktu kedaluwarsa) sehingga penskalaan otomatis kelompok node tidak menjadi tidak valid. kubeadm token create --ttl 0 --print-join-commandOutput yang diharapkan:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
Versi Kubernetes kluster lebih lama dari 1.18
Jalankan perintah berikut untuk memeriksa versi Kubernetes dari kluster eksternal. Versi Kubernetes akan ditentukan dalam variabel lingkungan
KUBE_VERSIONdari skrip sampel di langkah-langkah berikutnya.kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'Output yang diharapkan:
v1.14.10Jalankan perintah berikut untuk memeriksa runtime dan versi runtime dari kluster eksternal. Runtime dan versi runtime akan ditentukan dalam variabel lingkungan
RUNTIME_VERSIONdari skrip sampel di langkah-langkah berikutnya.kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'Output yang diharapkan:
docker://18.6.3 # Docker digunakan. containerd://1.4.3 # containerd digunakan.Jalankan perintah berikut untuk memeriksa perintah kubeadm yang digunakan untuk menambahkan node. Perintah tersebut akan ditentukan dalam variabel lingkungan
KUBEADM_JOIN_CMDdari skrip sampel di langkah-langkah berikutnya.# --ttl 0 sangat penting. Atur TTL ke 0 (tidak ada waktu kedaluwarsa) sehingga penskalaan otomatis kelompok node tidak menjadi tidak valid. kubeadm token create --ttl 0 --print-join-commandOutput yang diharapkan:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
Dapatkan skrip sampel.
CatatanSkrip sampel hanya berlaku untuk node ECS biasa. Untuk node ECS GPU-accelerated, submit a ticket ke tim R&D.
Tentukan versi Kubernetes, runtime, versi runtime, dan perintah kubeadm dari kluster eksternal yang Anda dapatkan dalam variabel lingkungan skrip sampel.
Docker
containerd
Langkah 2: Simpan dan unggah skrip ke server file
Unggah skrip node kustom atau skrip node sampel yang telah dimodifikasi ke server file, seperti bucket Object Storage Service (OSS). Contoh: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh.
Langkah 3: Modifikasi konfigurasi ack-cluster-agent
Selesaikan langkah ini sebelum membuat kelompok node. Jika tidak, skrip kustom tidak dapat diperoleh saat Anda memperluas kelompok node, sehingga operasi perluasan gagal.
Setelah skrip diunggah dan jalur skrip dicatat, tentukan jalur tersebut di bidang addNodeScriptPath dari konfigurasi ack-agent-config di namespace kube-system.
# Gunakan kubectl untuk memodifikasi konfigurasi ack-agent-config.
kubectl edit cm ack-agent-config -n kube-system
# Modifikasi bidang addNodeScriptPath sebagai berikut:
apiVersion: v1
data:
addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
kind: ConfigMap
metadata:
name: ack-agent-config
namespace: kube-system