Menggunakan custom image yang telah dipra-instal dengan paket perangkat lunak dapat secara signifikan mengurangi waktu startup node cloud dengan meminimalkan waktu pengunduhan paket.
Prasyarat
-
Anda telah membuat kluster terdaftar dan menghubungkan kluster Kubernetes yang dikelola sendiri dari pusat data lokal ke kluster terdaftar melalui jaringan pribadi. Untuk informasi selengkapnya, lihat Create an ACK One registered cluster.
-
Jaringan kluster Kubernetes yang dikelola sendiri di pusat data lokal Anda terhubung ke Virtual Private Cloud (VPC) yang digunakan oleh kluster terdaftar. Untuk informasi selengkapnya, lihat Use scenario-based networking to connect multiple VPCs.
-
Anda telah mengaktifkan Object Storage Service (OSS) dan membuat bucket. Untuk informasi selengkapnya, lihat Activate OSS dan Create a bucket.
-
Anda telah terhubung ke kluster terdaftar menggunakan kubectl. Untuk informasi selengkapnya, lihat Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster.
Prosedur
-
Topik ini menggunakan sistem operasi CentOS 7.9 dan kluster Kubernetes v1.28.3 yang terhubung menggunakan biner sebagai contoh cara membuat custom image untuk kelompok node elastis.
-
Jika Anda sudah memiliki custom image, Anda dapat langsung menuju Langkah 3.
Langkah 1: Buat kelompok node dan tambahkan node
-
Pilih bucket OSS, buat file bernama
join-ecs-node.shdengan konten berikut, lalu unggah file tersebut ke bucket.echo "The node providerid is $ALIBABA_CLOUD_PROVIDER_ID" echo "The node name is $ALIBABA_CLOUD_NODE_NAME" echo "The node labels are $ALIBABA_CLOUD_LABELS" echo "The node taints are $ALIBABA_CLOUD_TAINTS" -
Dapatkan URL file
join-ecs-node.sh(Anda dapat menggunakan signed URL), lalu modifikasi konfigurasi skrip kustom di kluster.-
Jalankan perintah berikut untuk mengedit ConfigMap
ack-agent-config:kubectl edit cm ack-agent-config -n kube-system -
Modifikasi field
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 bernama
cloud-testdan atur Expected Nodes menjadi 1. Untuk informasi selengkapnya, lihat Create and manage a node pool.PentingNode baru akan memiliki status
Failedkarena tidak memiliki paket perangkat lunak yang diperlukan. Anda harus login ke node ini untuk inisialisasi, jadi pastikan node tersebut dapat diakses melalui SSH.
Langkah 2: Konfigurasi node dan ekspor custom image
-
Login ke node dan jalankan perintah berikut untuk melihat informasi node:
cat /var/log/acs/init.logOutput yang diharapkan:
The node providerid is cn-zhangjiakou.i-xxxxx The node name is cn-zhangjiakou.192.168.66.xx The node labels are alibabacloud.com/nodepool-id=npf9fbxxxxxx,ack.aliyun.com=c22b1a2e122ff4fde85117de4xxxxxx,alibabacloud.com/instance-id=i-8vb7m7nt3dxxxxxxx,alibabacloud.com/external=true The node taints areOutput ini mengonfirmasi bahwa skrip kustom dapat memperoleh informasi node Alibaba Cloud. Catat informasi ini untuk parameter startup kubelet.
-
Jalankan perintah berikut untuk mengonfigurasi lingkungan dasar:
# Install tool packages. yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl # Disable the firewall. systemctl disable --now firewalld # Disable SELinux. setenforce 0 sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config # Disable swap partitions. sed -ri 's/.*swap.*/#&/' /etc/fstab swapoff -a && sysctl -w vm.swappiness=0 # Configure the network. systemctl disable --now NetworkManager systemctl start network && systemctl enable network # Synchronize the time. ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime yum install ntpdate -y ntpdate ntp.aliyun.com # Configure 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, upgrade kernel ke versi 4.18 atau lebih baru dan instal ipvsadm.
-
Instal containerd.
-
Jalankan perintah berikut untuk mengunduh plugin CNI 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 # Decompress the CNI binary package. 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 containerd-*-linux-amd64.tar.gz -C / -
Jalankan perintah berikut untuk membuat 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 EOF -
Jalankan 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.service -
Jalankan perintah berikut untuk mengonfigurasi parameter 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 # Load the kernel parameters. sysctl --system -
Jalankan perintah berikut untuk membuat file konfigurasi containerd:
mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml # Modify the containerd configuration file. 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 # Configure a registry mirror. 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"] EOF -
Jalankan perintah berikut untuk mengaktifkan containerd agar otomatis dimulai saat sistem startup:
systemctl daemon-reload # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket). systemctl enable --now containerd.service systemctl start containerd.service systemctl status containerd.service -
Jalankan perintah berikut untuk mengonfigurasi crictl:
wget 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/ # Generate the configuration file. cat > /etc/crictl.yaml <<EOF runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false EOF # Test the configuration. systemctl restart containerd crictl info
-
-
Instal kubelet dan kube-proxy.
-
Dapatkan file biner. Login ke node master dan salin file biner ke node saat ini.
scp /usr/local/bin/kube{let,-proxy} $NODEIP:/usr/local/bin/ -
Dapatkan sertifikat. Jalankan perintah berikut untuk membuat direktori penyimpanan sertifikat di mesin lokal:
mkdir -p /etc/kubernetes/pkiLogin ke node master dan salin sertifikat ke node saat ini.
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}; done -
Jalankan perintah berikut untuk mengonfigurasi layanan kubelet. Gunakan variabel kelompok node Alibaba Cloud yang Anda peroleh di Langkah 2.
mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/ # Configure the kubelet service on all Kubernetes nodes. 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 -
Jalankan perintah berikut untuk membuat file konfigurasi startup 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 EOF -
Jalankan perintah berikut untuk memulai kubelet:
systemctl daemon-reload # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket). systemctl enable --now kubelet.service systemctl start kubelet.service systemctl status kubelet.service -
Jalankan perintah berikut untuk melihat informasi kluster:
kubectl get node -
Login ke node master dan dapatkan file kubeconfig yang diperlukan oleh kube-proxy.
scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfig -
Jalankan perintah berikut untuk menambahkan konfigurasi 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 EOF -
Jalankan perintah berikut untuk menambahkan konfigurasi startup 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 EOF -
Jalankan perintah berikut untuk memulai kube-proxy:
systemctl daemon-reload # Reloads systemd units. Required after creating or modifying unit files (for example, .service or .socket). systemctl enable --now kube-proxy.service systemctl restart kube-proxy.service systemctl status kube-proxy.service
-
-
Sinkronkan status kelompok node.
-
Login ke ACK console. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Node Pools, klik Sync Node Pool. Setelah sinkronisasi selesai, verifikasi bahwa tidak ada pesan kegagalan yang ditampilkan dan kelompok node berada dalam kondisi normal.
-
-
Ekspor custom image.
-
Login ke ECS console.
-
Di panel navigasi kiri, pilih .
-
Klik Instance ID. Di tab Instance Details, klik Create custom image.
-
Di panel navigasi kiri, pilih .
-
Di halaman Images, Anda dapat melihat Custom Image yang telah Anda buat. Status adalah Available.
-
Langkah 3: Modifikasi atau buat kelompok node dengan custom image
Jika Anda sudah memiliki custom image dan melewati Langkah 1 dan Langkah 2, Anda harus membuat kelompok node menggunakan custom image tersebut. Untuk informasi selengkapnya, lihat How do I create a custom image from an existing ECS instance and use the image to create nodes?.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Node Pools, temukan Node Pools yang dituju dan klik Edit di kolom Actions. Di tab Advanced, atur image kelompok node menjadi Custom Image. Temukan pengaturan Custom image, klik tautan Select custom image, lalu pilih custom image yang telah Anda buat.
-
Di halaman Node Pools, Anda dapat melihat bahwa Operating System telah diperbarui menjadi Custom Image. Setelah pembaruan selesai, kolom Operating system untuk kelompok node akan menampilkan custom image beserta ID imagenya, yang menunjukkan bahwa image telah berhasil diganti.
Langkah 4: Perbarui skrip init node untuk parameter cloud
-
Anda harus menghapus sertifikat kubelet sisa dari custom image, seperti yang ditunjukkan pada baris ketujuh skrip.
-
Untuk kelompok node kustom yang sudah ada, Anda harus mengonfigurasi URL unduhan skrip kustom seperti yang dijelaskan di Langkah 1.
-
Buat atau perbarui file
join-ecs-node.shdengan konten berikut. Karena custom image sudah berisi tool dan dependensi yang diperlukan, skrip kustom hanya perlu menerima dan memperbarui parameter kelompok node Alibaba Cloud.echo "The node providerid is $ALIBABA_CLOUD_PROVIDER_ID" echo "The node name is $ALIBABA_CLOUD_NODE_NAME" echo "The node labels are $ALIBABA_CLOUD_LABELS" echo "The node taints are $ALIBABA_CLOUD_TAINTS" systemctl stop kubelet.service echo "Delete old kubelet pki" # The old node certificates must be deleted. rm -rf /var/lib/kubelet/pki/* echo "Add kubelet service config" # Configure the kubelet service. 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 # Start the kubelet service. systemctl start kubelet.service -
Unggah skrip
join-ecs-node.shyang telah diperbarui ke OSS.
Langkah 5: Tambah kapasitas kelompok node
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Node Pools, temukan kelompok node yang dituju. Di kolom Actions, pilih untuk menambahkan node baru.
Verifikasi bahwa kedua node berada dalam kondisi normal. Hal ini mengonfirmasi keberhasilan pembuatan kelompok node elastis.
-
Anda dapat mengonfigurasi kebijakan auto scaling untuk kelompok node tersebut. Untuk informasi selengkapnya, lihat Configure auto scaling.