Untuk mempersingkat durasi sebuah node mencapai status Ready di cloud, disarankan untuk menginstal paket perangkat lunak yang diperlukan menggunakan gambar kustom. Hal ini dapat secara signifikan mengurangi waktu yang dibutuhkan dan meningkatkan efisiensi startup sistem. Topik ini menjelaskan cara membangun kelompok node elastis untuk kluster terdaftar menggunakan gambar kustom.
Prasyarat
Kluster terdaftar telah dibuat dan kluster Kubernetes mandiri telah terhubung ke kluster terdaftar. Untuk informasi lebih lanjut, lihat Buat Kluster Terdaftar ACK One.
Jaringan dari kluster Kubernetes mandiri terhubung ke Virtual Private Cloud (VPC) dari kluster terdaftar. Untuk informasi lebih lanjut, lihat Skenario Berbasis Jaringan untuk Koneksi VPC.
Object Storage Service (OSS) telah diaktifkan dan Bucket OSS telah dibuat. Untuk informasi lebih lanjut, lihat Aktifkan OSS dan Buat Bucket.
Klien kubectl telah terhubung ke kluster terdaftar. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
Langkah-langkah
Contoh ini menggunakan sistem operasi CentOS 7.9 untuk membangun kelompok node elastis dengan gambar kustom. Versi kluster Kubernetes 1.28.3 dihubungkan menggunakan file biner.
Lanjutkan ke Langkah 3 jika Anda sudah memiliki gambar kustom siap digunakan.
Langkah 1: Buat kelompok node cloud dan tambahkan node ke dalamnya
Pilih Bucket OSS, buat file bernama join-ecs-node.sh, salin konten berikut ke dalam file tersebut, lalu unggah.
echo "ID penyedia node adalah $ALIBABA_CLOUD_PROVIDER_ID" echo "Nama node adalah $ALIBABA_CLOUD_NODE_NAME" echo "Label node adalah $ALIBABA_CLOUD_LABELS" echo "Taints node adalah $ALIBABA_CLOUD_TAINTS"Dapatkan URL file join-ecs-node.sh (Anda dapat menggunakan URL yang ditandatangani) dan modifikasi skrip konfigurasi kustom di kluster.
Jalankan perintah berikut untuk mengedit ack-agent-config:
kubectl edit cm ack-agent-config -n kube-systemModifikasi bidang addNodeScriptPath. Konfigurasi yang diperbarui adalah 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
Buat kelompok node cloud bernama cloud-test dan atur parameter Expected Nodes menjadi 1. Untuk informasi lebih lanjut, lihat Buat dan Kelola Kelompok Node.
PentingSebuah node baru akan berada dalam status Gagal karena belum diinisialisasi dengan tugas pengaturan, seperti menginstal paket perangkat lunak node. Pastikan Anda dapat masuk ke node melalui SSH untuk inisialisasi pada langkah-langkah selanjutnya.
Langkah 2: Konfigurasikan node dan ekspor gambar kustom
Masuk ke node dan jalankan perintah berikut untuk memeriksa informasi node:
cat /var/log/acs/init.logOutput yang Diharapkan:
ID penyedia node adalah cn-zhangjiakou.i-xxxxx Nama node adalah cn-zhangjiakou.192.168.66.xx Label node adalah alibabacloud.com/nodepool-id=npf9fbxxxxxx,ack.aliyun.com=c22b1a2e122ff4fde85117de4xxxxxx,alibabacloud.com/instance-id=i-8vb7m7nt3dxxxxxxx,alibabacloud.com/external=true Taints node adalahOutput yang diharapkan menunjukkan bahwa skrip kustom dapat memperoleh informasi node. Catat informasi ini dan tambahkan ke parameter startup kubelet pada langkah-langkah berikutnya.
Jalankan perintah berikut untuk mengonfigurasi lingkungan dasar:
# Instal paket alat. yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl # Nonaktifkan firewall. systemctl disable --now firewalld # Nonaktifkan SELinux. setenforce 0 sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config # Nonaktifkan partisi swap. sed -ri 's/.*swap.*/#&/' /etc/fstab swapoff -a && sysctl -w vm.swappiness=0 # Konfigurasi jaringan. systemctl disable --now NetworkManager systemctl start network && systemctl enable network # Sinkronisasi waktu. ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime yum install ntpdate -y ntpdate ntp.aliyun.com # Konfigurasikan ulimit. ulimit -SHn 65535 cat >> /etc/security/limits.conf <<EOF * soft nofile 655360 * hard nofile 131072 * soft nproc 655350 * hard nproc 655350 * seft memlock unlimited * hard memlock unlimitedd EOFCatatanSetelah menyelesaikan konfigurasi lingkungan di atas, tingkatkan kernel ke versi 4.18 atau lebih baru dan instal ipvsadm.
Instal containerd.
Jalankan perintah berikut untuk mengunduh plug-in jaringan dan paket containerd:
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz mkdir -p /etc/cni/net.d /opt/cni/bin # Ekstrak paket binari cni tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/ wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz tar -xzf cri-containerd-cni-*-linux-amd64.tar.gz -C /Jalankan perintah berikut untuk membuat file konfigurasi startup layanan:
cat > /etc/systemd/system/containerd.service <<EOF [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=infinity TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target EOFJalankan perintah berikut untuk mengonfigurasi modul yang diperlukan oleh containerd:
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF systemctl restart systemd-modules-load.serviceJalankan perintah berikut untuk mengonfigurasi kernel yang diperlukan oleh containerd:
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF # Muat kernel sysctl --systemJalankan perintah berikut untuk membuat file konfigurasi untuk containerd:
mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml # Modifikasi file konfigurasi containerd sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml cat /etc/containerd/config.toml | grep SystemdCgroup sed -i "s#registry.k8s.io#m.daocloud.io/registry.k8s.io#g" /etc/containerd/config.toml cat /etc/containerd/config.toml | grep sandbox_image sed -i "s#config_path\ \=\ \"\"#config_path\ \=\ \"/etc/containerd/certs.d\"#g" /etc/containerd/config.toml cat /etc/containerd/config.toml | grep certs.d # Konfigurasikan akselerator mkdir /etc/containerd/certs.d/docker.io -pv cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF server = "https://docker.io" [host."https://hub-mirror.c.163.com"] capabilities = ["pull", "resolve"] EOFJalankan perintah berikut untuk mengatur containerd agar berjalan saat startup sistem:
systemctl daemon-reload # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut. systemctl enable --now containerd.service systemctl start containerd.service systemctl status containerd.serviceJalankan perintah berikut untuk mengonfigurasi perintah crictl:
wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz tar xf crictl-v*-linux-amd64.tar.gz -C /usr/bin/ # Hasilkan file konfigurasi cat > /etc/crictl.yaml <<EOF runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF # Uji systemctl restart containerd crictl info
Instal kubelet dan kube-proxy.
Dapatkan file biner, masuk ke Master node, lalu salin file biner ke node.
scp /usr/local/bin/kube{let,-proxy} $NODEIP:/usr/local/bin/Dapatkan sertifikat dan jalankan perintah berikut untuk membuat direktori penyimpanan sertifikat secara lokal:
mkdir -p /etc/kubernetes/pkiMasuk ke master node dan salin sertifikat ke node.
for FILE in pki/ca.pem pki/ca-key.pem pki/front-proxy-ca.pem bootstrap-kubelet.kubeconfig kube-proxy.kubeconfig; do scp /etc/kubernetes/$FILE $NODE:/etc/kubernetes/${FILE}; doneJalankan perintah berikut untuk mengonfigurasi Layanan kubelet. Isi variabel terkait kelompok node yang diperoleh di Langkah 2.
mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/ # Konfigurasikan layanan kubelet di semua node k8s cat > /usr/lib/systemd/system/kubelet.service << EOF [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/kubernetes/kubernetes After=network-online.target firewalld.service containerd.service Wants=network-online.target Requires=containerd.service [Service] ExecStart=/usr/local/bin/kubelet \\ --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} \\ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \\ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\ --config=/etc/kubernetes/kubelet-conf.yml \\ --container-runtime-endpoint=unix:///run/containerd/containerd.sock [Install] WantedBy=multi-user.target EOFJalankan perintah berikut untuk membuat file konfigurasi startup untuk kubelet:
cat > /etc/kubernetes/kubelet-conf.yml <<EOF apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration address: 0.0.0.0 port: 10250 readOnlyPort: 10255 authentication: anonymous: enabled: false webhook: cacheTTL: 2m0s enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.pem authorization: mode: Webhook webhook: cacheAuthorizedTTL: 5m0s cacheUnauthorizedTTL: 30s cgroupDriver: systemd cgroupsPerQOS: true clusterDNS: - 10.96.0.10 clusterDomain: cluster.local containerLogMaxFiles: 5 containerLogMaxSize: 10Mi contentType: application/vnd.kubernetes.protobuf cpuCFSQuota: true cpuManagerPolicy: none cpuManagerReconcilePeriod: 10s enableControllerAttachDetach: true enableDebuggingHandlers: true enforceNodeAllocatable: - pods eventBurst: 10 eventRecordQPS: 5 evictionHard: imagefs.available: 15% memory.available: 100Mi nodefs.available: 10% nodefs.inodesFree: 5% evictionPressureTransitionPeriod: 5m0s failSwapOn: true fileCheckFrequency: 20s hairpinMode: promiscuous-bridge healthzBindAddress: 127.0.0.1 healthzPort: 10248 httpCheckFrequency: 20s imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 80 imageMinimumGCAge: 2m0s iptablesDropBit: 15 iptablesMasqueradeBit: 14 kubeAPIBurst: 10 kubeAPIQPS: 5 makeIPTablesUtilChains: true maxOpenFiles: 1000000 maxPods: 110 nodeStatusUpdateFrequency: 10s oomScoreAdj: -999 podPidsLimit: -1 registryBurst: 10 registryPullQPS: 5 resolvConf: /etc/resolv.conf rotateCertificates: true runtimeRequestTimeout: 2m0s serializeImagePulls: true staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 4h0m0s syncFrequency: 1m0s volumeStatsAggPeriod: 1m0s EOFJalankan perintah berikut untuk memulai kubelet:
systemctl daemon-reload # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut. systemctl enable --now kubelet.service systemctl start kubelet.service systemctl status kubelet.serviceJalankan perintah berikut untuk memeriksa informasi kluster:
kubectl get nodeMasuk ke master node dan dapatkan KubeConfig yang diperlukan oleh kube-proxy.
scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfigJalankan perintah berikut untuk menambahkan konfigurasi untuk Layanan kube-proxy:
cat > /usr/lib/systemd/system/kube-proxy.service << EOF [Unit] Description=Kubernetes Kube Proxy Documentation=https://github.com/kubernetes/kubernetes After=network.target [Service] ExecStart=/usr/local/bin/kube-proxy \\ --config=/etc/kubernetes/kube-proxy.yaml \\ --v=2 Restart=always RestartSec=10s [Install] WantedBy=multi-user.target EOFJalankan perintah berikut untuk menambahkan konfigurasi startup untuk kube-proxy:
cat > /etc/kubernetes/kube-proxy.yaml << EOF apiVersion: kubeproxy.config.k8s.io/v1alpha1 bindAddress: 0.0.0.0 clientConnection: acceptContentTypes: "" burst: 10 contentType: application/vnd.kubernetes.protobuf kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig qps: 5 clusterCIDR: 172.16.0.0/12,fc00:2222::/112 configSyncPeriod: 15m0s conntrack: max: null maxPerCore: 32768 min: 131072 tcpCloseWaitTimeout: 1h0m0s tcpEstablishedTimeout: 24h0m0s enableProfiling: false healthzBindAddress: 0.0.0.0:10256 hostnameOverride: "" iptables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 0s syncPeriod: 30s ipvs: masqueradeAll: true minSyncPeriod: 5s scheduler: "rr" syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 127.0.0.1:10249 mode: "ipvs" nodePortAddresses: null oomScoreAdj: -999 portRange: "" udpIdleTimeout: 250ms EOFJalankan perintah berikut untuk memulai kube-proxy:
systemctl daemon-reload # Digunakan untuk memuat ulang file unit yang dikelola oleh systemd. Saat Anda menambahkan atau memodifikasi file unit (seperti file .service, file .socket, dll.), Anda perlu menjalankan perintah ini untuk menyegarkan konfigurasi systemd dari file tersebut. systemctl enable --now kube-proxy.service systemctl restart kube-proxy.service systemctl status kube-proxy.service
Sinkronkan status kelompok node.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Di sebelah kanan halaman Node Pools, klik Sync Node Pool. Tunggu hingga sinkronisasi selesai dan Anda akan melihat tidak ada node yang berada dalam status Kegagalan.

Ekspor gambar kustom.
Masuk ke Konsol ECS.
Di panel navigasi kiri, pilih .
Klik Instance ID, lalu buka tab Instance Details, dan klik Create Custom Image.

Di panel navigasi kiri, pilih .
Di halaman gambar, Anda akan melihat Custom Image yang telah dibuat dengan kolom Status sebagai Available.
Langkah 3: Gunakan gambar kustom untuk memodifikasi atau membuat kelompok node cloud
Jika Anda menggunakan gambar kustom yang ada dan melewati Langkah 1 dan Langkah 2, Anda harus menggunakan gambar kustom untuk membuat kelompok node terlebih dahulu. Untuk informasi lebih lanjut, lihat Buat dan Kelola Kelompok Node.
Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Di halaman Node Pools, temukan Node Pool, klik Edit di sebelah kanan di kolom Aksi, perluas Advanced Options dan ubah gambar kelompok node dengan memilih gambar kustom di samping Custom Image.

Anda dapat melihat bahwa kolom Operating System di halaman Node Pools diperbarui menjadi Custom Image.

Langkah 4: Modifikasi skrip inisialisasi untuk node agar menerima parameter terkait Alibaba Cloud
Anda harus membersihkan sertifikat kubelet residu di gambar kustom seperti yang ditunjukkan pada baris ketujuh skrip.
Jika Anda memiliki kelompok node kustom yang ada, lihat Langkah 1 untuk mengonfigurasi URL unduhan skrip kustom.
Gunakan konten berikut untuk membuat atau memperbarui file join-ecs-node.sh. Karena gambar kustom berisi paket alat dan dependensi yang diperlukan untuk node, skrip kustom hanya menerima dan memperbarui parameter kelompok node.
echo "ID penyedia node adalah $ALIBABA_CLOUD_PROVIDER_ID" echo "Nama node adalah $ALIBABA_CLOUD_NODE_NAME" echo "Label node adalah $ALIBABA_CLOUD_LABELS" echo "Taints node adalah $ALIBABA_CLOUD_TAINTS" systemctl stop kubelet.service echo "Hapus sertifikat kubelet lama" # Perlu menghapus sertifikat node lama rm -rf /var/lib/kubelet/pki/* echo "Tambahkan konfigurasi layanan kubelet" # Konfigurasikan layanan kubelet cat > /usr/lib/systemd/system/kubelet.service << EOF [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/kubernetes/kubernetes After=network-online.target firewalld.service containerd.service Wants=network-online.target Requires=containerd.service [Service] ExecStart=/usr/local/bin/kubelet \\ --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} \\ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \\ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\ --config=/etc/kubernetes/kubelet-conf.yml \\ --container-runtime-endpoint=unix:///run/containerd/containerd.sock [Install] WantedBy=multi-user.target EOF systemctl daemon-reload # Mulai Layanan Kubelet systemctl start kubelet.servicePerbarui skrip join-ecs-node.sh di OSS.
Langkah 5: Skalakan kelompok node
Di halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih .
Pergi ke halaman Node Pools, temukan kelompok node, klik di sebelah kanan di kolom Aksi, dan tambahkan node baru.

Status menunjukkan bahwa kedua node normal, yang menunjukkan bahwa kelompok node elastis telah dibangun.
Anda dapat mengonfigurasi kebijakan penskalaan otomatis untuk kelompok node. Untuk informasi lebih lanjut, lihat Konfigurasikan Penskalaan Otomatis.