Kluster terdaftar ACK One memungkinkan Anda menghubungkan kluster Kubernetes on-premises atau pihak ketiga ke platform kontainer Alibaba Cloud untuk manajemen terpadu dan operasi cloud hibrida. Saat kapasitas komputasi lokal terbatas, lakukan scale-out dengan cloud node pools pada ECS. Topik ini menjelaskan cara membuat skrip kustom untuk cloud node pools.
Prasyarat
Sebelum memulai:
-
ACK One registered cluster dengan kluster Kubernetes eksternal yang telah terhubung.
-
Jaringan kluster Kubernetes eksternal terhubung ke VPC ACK One registered cluster.
-
Konfigurasi proxy kluster Kubernetes eksternal telah diimpor ke ACK One registered cluster (mode jaringan pribadi).
Batasan
-
Skrip contoh hanya mendukung sistem operasi yang menggunakan YUM (Yellowdog Updater, Modified) sebagai package manager.
-
Skrip contoh hanya berlaku untuk node ECS reguler. Untuk node yang dipercepat GPU, submit a ticket ke tim R&D untuk mendapatkan skrip khusus.
Node yang dipercepat GPU memerlukan driver dan device plug-in. Lihat Manually update the NVIDIA driver of a node.
Ikhtisar
Tiga langkah:
-
Siapkan skrip node — sesuaikan skrip kustom yang sudah ada atau mulai dari contoh.
-
Unggah skrip ke server file yang dapat diakses dari kluster terdaftar Anda.
-
Daftarkan path skrip dalam ConfigMap
ack-agent-configuntuk pengambilan saat scale-out.
Pilih jalur untuk langkah 1:
| Situasi | Tindakan |
|---|---|
| Skrip bootstrap yang sudah ada | Gunakan Langkah 1(A): tambahkan variabel lingkungan Alibaba Cloud yang diperlukan |
| Tidak ada skrip bootstrap yang ada | Gunakan Langkah 1(B): unduh dan sesuaikan contoh skrip |
Langkah 1(A): Tambahkan variabel lingkungan Alibaba Cloud ke skrip yang sudah ada
Kluster terdaftar menyuntikkan empat variabel lingkungan saat scale-out untuk manajemen kelompok node.
ALIBABA_CLOUD_PROVIDER_ID wajib digunakan agar kluster terdaftar berfungsi. Tanpa variabel ini dalam skrip Anda, kluster tidak dapat berjalan normal.
Empat variabel lingkungan:
| Variabel | Wajib | Dampak jika tidak ada | Contoh nilai |
|---|---|---|---|
ALIBABA_CLOUD_PROVIDER_ID |
Ya | Kluster terdaftar tidak dapat berjalan normal | cn-shenzhen.i-wz92ewt14n9wx9mo*** |
ALIBABA_CLOUD_NODE_NAME |
Ya | Node mungkin masuk ke status abnormal | cn-shenzhen.192.168.1.*** |
ALIBABA_CLOUD_LABELS |
Ya | Manajemen kelompok node dan penjadwalan workload mungkin gagal | alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142*,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670*,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu |
ALIBABA_CLOUD_TAINTS |
Ya | Taints kelompok node tidak berlaku | workload=ack:NoSchedule |
DalamALIBABA_CLOUD_LABELS, hanyaworkload=cpuyang bersifat kustom (didefinisikan dalam konfigurasi kelompok node). Semua label lainnya adalah label sistem.
Tambahkan blok penyuntikan variabel berdasarkan metode instalasi kluster Anda.
Kluster dibuat dengan kubeadm
Sisipkan blok ini setelah konfigurasi utama node dan sebelum merestart kubelet.
####### Begin: Alibaba Cloud environment variable injection
# Configure node labels, taints, node name, and provider ID.
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
####### End: Alibaba Cloud environment variable injection
Lanjutkan ke Langkah 2: Unggah skrip.
Kluster diinstal dengan file biner
Untuk kluster yang diinstal dengan file biner Kubernetes, modifikasi konfigurasi boot kubelet. File kubelet.service biasanya berada di /usr/lib/systemd/system/.
cat /usr/lib/systemd/system/kubelet.service EOF
# Custom configurations are not shown.
...
[Service]
ExecStart=/data0/kubernetes/bin/kubelet \
# Add the following flags:
--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
Lanjutkan ke Langkah 2: Unggah skrip.
Langkah 1(B): Gunakan skrip contoh
Jika tidak memiliki skrip bootstrap yang ada, mulailah dari contoh di bawah. Contoh mencakup Docker dan containerd.
Kumpulkan nilai yang diperlukan
Kumpulkan tiga nilai dari kluster eksternal Anda:
Langkah 1: Dapatkan versi Kubernetes
Dapatkan versi Kubernetes:
Untuk Kubernetes 1.18 dan yang lebih baru (gunakan label control-plane):
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'
Untuk Kubernetes sebelum 1.18 (gunakan label master):
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.10
Simpan sebagai KUBE_VERSION.
Langkah 2: Dapatkan runtime dan versi kontainer
Untuk Kubernetes 1.18 dan yang lebih baru:
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'
Untuk Kubernetes sebelum 1.18:
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 runtime
containerd://1.4.3 # containerd runtime
Simpan nomor versi (tanpa awalan docker:// atau containerd://) sebagai RUNTIME_VERSION.
Langkah 3: Hasilkan perintah kubeadm join
Flag --ttl 0 wajib digunakan. Tanpa flag ini, token join akan kedaluwarsa dan auto scaling berhenti.
kubeadm token create --ttl 0 --print-join-command
Output yang diharapkan:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** \
--discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
Simpan sebagai KUBEADM_JOIN_CMD.
Skrip contoh: Docker
Ganti tiga placeholder dengan nilai yang telah Anda kumpulkan:
-
KUBE_VERSION— versi Kubernetes (misalnya,1.21.0) -
RUNTIME_VERSION— versi Docker (misalnya,18.6.3) -
KUBEADM_JOIN_CMD— perintah lengkapkubeadm join ...
Skrip contoh: containerd
Ganti tiga placeholder dengan nilai yang telah Anda kumpulkan:
-
KUBE_VERSION— versi Kubernetes (misalnya,1.21.0) -
RUNTIME_VERSION— versi containerd (misalnya,1.4.3) -
KUBEADM_JOIN_CMD— perintah lengkapkubeadm join ...
Langkah 2: Unggah skrip
Unggah skrip ke server file yang dapat dijangkau dari kluster terdaftar Anda. Object Storage Service (OSS) umum digunakan.
Contoh URL:
https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
Simpan URL tersebut untuk langkah berikutnya.
Langkah 3: Daftarkan path skrip
Lengkapi langkah ini sebelum membuat kelompok node. Tanpa path skrip yang terdaftar, scale-out tidak dapat mengambil skrip dan akan gagal.
Tetapkan addNodeScriptPath dalam ConfigMap ack-agent-config (namespace kube-system).
kubectl edit cm ack-agent-config -n kube-system
Tetapkan addNodeScriptPath ke URL skrip Anda:
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
Simpan dan tutup file tersebut. Kluster terdaftar menggunakan skrip ini untuk bootstrap node ECS selama scale-out.