Saat sumber daya komputasi on-premises mencapai kapasitas maksimum, Anda dapat membuat kelompok node di ACK One untuk memperluas kapasitas dengan node Elastic Compute Service (ECS) berbasis cloud. Topik ini menjelaskan cara menulis dan menerapkan skrip bootstrap kustom yang menyediakan node ECS tersebut ke kluster terdaftar Anda.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki kluster terdaftar ACK One dengan kluster Kubernetes eksternal yang terhubung dengannya. Lihat Create an ACK One registered cluster.
Jaringan kluster Kubernetes eksternal terhubung ke virtual private cloud (VPC) kluster terdaftar ACK One. Lihat Scenario-based networking for VPC connections.
Konfigurasi proxy kluster Kubernetes eksternal telah diimpor ke kluster terdaftar ACK One (mode jaringan pribadi). Lihat Associate an external Kubernetes cluster with an ACK One registered cluster.
Batasan
Skrip contoh dalam topik ini hanya mendukung sistem operasi yang menggunakan YUM (Yellowdog Updater, Modified) sebagai manajer paket.
Skrip contoh ini hanya berlaku untuk node ECS reguler. Untuk node yang dipercepat GPU, submit a ticket ke tim R&D untuk mendapatkan skrip khusus.
Berbeda dengan node ECS reguler, Anda harus menginstal driver dan plug-in perangkat untuk node yang dipercepat GPU. Untuk informasi selengkapnya, lihat Manually update the NVIDIA driver of a node.
Ikhtisar
Proses ini terdiri dari tiga langkah:
Siapkan skrip node — sesuaikan skrip kustom yang sudah ada atau mulai dari skrip contoh.
Unggah skrip ke server file yang dapat diakses dari kluster terdaftar Anda.
Daftarkan path skrip dalam ConfigMap
ack-agent-configagar kelompok node dapat mengambilnya saat melakukan skala keluar.
Langkah mana yang harus diambil pada Langkah 1:
| Situasi | Tindakan |
|---|---|
| Anda memiliki skrip bootstrap yang sudah ada | Gunakan Langkah 1(A): tambahkan variabel lingkungan Alibaba Cloud yang diperlukan ke dalamnya. |
| Anda memulai dari awal | Gunakan Langkah 1(B): unduh dan sesuaikan skrip contoh. |
Langkah 1(A): Tambahkan variabel lingkungan Alibaba Cloud ke skrip yang sudah ada
Kelompok node Anda memerlukan empat variabel lingkungan dari kluster terdaftar untuk mengelola node dengan benar. Kluster terdaftar menyuntikkan variabel ini saat skala keluar.
ALIBABA_CLOUD_PROVIDER_ID wajib digunakan agar kluster terdaftar berfungsi. Jika skrip Anda tidak menggunakan variabel ini, kluster tidak dapat berjalan secara normal.
Keempat variabel lingkungan tersebut adalah:
| Variabel | Wajib | Dampak jika tidak ada | Contoh nilai |
|---|---|---|---|
ALIBABA_CLOUD_PROVIDER_ID | Ya | Kluster terdaftar tidak dapat berjalan secara normal | cn-shenzhen.i-wz92ewt14n9wx9mo*** |
ALIBABA_CLOUD_NODE_NAME | Ya | Node dalam kelompok node mungkin masuk ke status abnormal | cn-shenzhen.192.168.1.*** |
ALIBABA_CLOUD_LABELS | Ya | Pengelolaan kelompok node dan penjadwalan workload antara node cloud dan on-premises 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 | Taint yang ditentukan dalam konfigurasi kelompok node tidak berlaku | workload=ack:NoSchedule |
DalamALIBABA_CLOUD_LABELS, labelworkload=cpuadalah label kustom yang Anda definisikan dalam konfigurasi kelompok node. Semua label lainnya adalah label sistem yang ditambahkan secara otomatis.
Tambahkan blok penyuntikan variabel ke skrip Anda berdasarkan cara instalasi kluster Anda.
Kluster dibuat menggunakan kubeadm
Sisipkan blok berikut ke dalam skrip Anda. Tempatkan setelah konfigurasi utama node dan sebelum me-restart 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 injectionSetelah menambahkan blok ini, lanjutkan ke Langkah 2: Unggah skrip.
Kluster diinstal menggunakan file biner
Jika kluster Anda diatur dengan menginstal file biner Kubernetes secara langsung, ubah konfigurasi boot kubelet dalam skrip Anda. 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
EOFSetelah menambahkan flag tersebut, lanjutkan ke Langkah 2: Unggah skrip.
Langkah 1(B): Gunakan skrip contoh
Jika Anda tidak memiliki skrip bootstrap yang sudah ada, gunakan salah satu skrip contoh di bawah ini sebagai titik awal. Contoh ini mencakup dua runtime kontainer yang paling umum: Docker dan containerd.
Kumpulkan nilai yang diperlukan
Sebelum mengisi skrip, kumpulkan tiga nilai dari kluster eksternal Anda.
Langkah 1: Dapatkan versi Kubernetes
Jalankan perintah yang sesuai berdasarkan versi Kubernetes kluster Anda.
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.10Catat ini sebagai nilai KUBE_VERSION Anda.
Langkah 2: Dapatkan runtime kontainer dan versinya
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 runtimeCatat nomor versinya (tanpa awalan docker:// atau containerd://) sebagai nilai RUNTIME_VERSION Anda.
Langkah 3: Hasilkan perintah kubeadm join
Flag --ttl 0 wajib digunakan. Tanpa flag ini, token join akan kedaluwarsa dan autoscaling berhenti bekerja.
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***Catat perintah lengkap ini sebagai nilai KUBEADM_JOIN_CMD Anda.
Skrip contoh: Docker
Ganti tiga placeholder di bagian atas skrip 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 di bagian atas skrip 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 diakses oleh kluster terdaftar Anda. Object Storage Service (OSS) merupakan pilihan umum.
Contoh URL setelah diunggah:
https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.shCatat URL tersebut — Anda akan membutuhkannya pada langkah berikutnya.
Langkah 3: Daftarkan path skrip
Lakukan langkah ini sebelum membuat kelompok node. Jika path skrip tidak didaftarkan, kelompok node tidak dapat mengambil skrip saat skala keluar dan operasi akan gagal.
Atur field addNodeScriptPath dalam ConfigMap ack-agent-config di namespace kube-system.
kubectl edit cm ack-agent-config -n kube-systemPerbarui field addNodeScriptPath dengan URL skrip yang telah Anda unggah:
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-systemSimpan dan tutup file tersebut. Kluster terdaftar kini menggunakan skrip ini untuk bootstrap node ECS saat Anda melakukan skala keluar pada kelompok node.