事前にソフトウェアパッケージがインストールされたカスタムイメージを使用すると、パッケージのダウンロード時間が最小限に抑えられ、クラウドノードの起動時間を大幅に短縮できます。
前提条件
-
登録済みクラスターを作成し、オンプレミスデータセンターの自己管理型 Kubernetes クラスターをプライベートネットワーク経由で登録済みクラスターに接続済みであること。 詳細については、「ACK One 登録済みクラスターの作成」をご参照ください。
-
オンプレミスデータセンター内の自己管理型 Kubernetes クラスターのネットワークが、登録済みクラスターで使用される Virtual Private Cloud (VPC) に接続済みであること。 詳細については、「シナリオベースのネットワーキングを使用した複数 VPC の接続」をご参照ください。
-
Object Storage Service (OSS) を有効化し、バケットを作成済みであること。 詳細については、「OSS の有効化」および「バケットの作成」をご参照ください。
-
kubectl を使用して登録済みクラスターに接続済みであること。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
操作手順
-
このトピックでは、CentOS 7.9 オペレーティングシステムと、バイナリを使用して接続された Kubernetes v1.28.3 クラスターを例として、弾力的なノードプール用のカスタムイメージを作成する方法について説明します。
-
すでにカスタムイメージをお持ちの場合は、手順 3 に進むことができます。
手順 1:ノードプールの作成とノードの追加
-
OSS バケットを選択し、次の内容で
join-ecs-node.shという名前のファイルを作成して、そのファイルをバケットにアップロードします。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" -
join-ecs-node.shファイルの URL (署名付き URL を使用できます) を取得し、クラスター内のカスタムスクリプト設定を変更します。-
次のコマンドを実行して、
ack-agent-configConfigMap を編集します。kubectl edit cm ack-agent-config -n kube-system -
addNodeScriptPathフィールドを変更します。 更新後の設定は次のとおりです。apiVersion: v1 data: addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-node.sh kind: ConfigMap metadata: name: ack-agent-config namespace: kube-system
-
-
cloud-testという名前のノードプールを作成し、想定ノード数 を 1 に設定します。 詳細については、「ノードプールの作成と管理」をご参照ください。重要新しいノードは、必要なソフトウェアパッケージがないため、ステータスは
失敗になります。 このノードにログインして初期化を行う必要があるため、SSH 経由でアクセスできることを確認してください。
手順 2:ノードの設定とカスタムイメージのエクスポート
-
ノードにログインし、次のコマンドを実行してノード情報を表示します。
cat /var/log/acs/init.log期待される出力:
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 areこの出力は、カスタムスクリプトが Alibaba Cloud のノード情報を取得できることを示しています。 この情報を kubelet 起動パラメーター用に記録してください。
-
次のコマンドを実行して、ベース環境を設定します。
# 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 the swap partition. 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 time. ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime yum install ntpdate -y ntpdate ntp.aliyun.com # Set ulimit. ulimit -SHn 65535 cat >> /etc/security/limits.conf <<EOF * soft nofile 655360 * hard nofile 131072 * soft nproc 655350 * hard nproc 655350 * soft memlock unlimited * hard memlock unlimited EOF説明上記環境設定が完了したら、カーネルをバージョン 4.18 以降にアップグレードし、ipvsadm をインストールしてください。
-
containerd をインストールします。
-
次のコマンドを実行して、CNI プラグインと 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 # Unpack 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 / -
次のコマンドを実行して、サービス起動設定を作成します。
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 -
次のコマンドを実行して、containerd に必要なモジュールを設定します。
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF systemctl restart systemd-modules-load.service -
次のコマンドを実行して、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 kernel parameters. sysctl --system -
次のコマンドを実行して、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 the 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 -
次のコマンドを実行して、システムの起動時に containerd が開始されるように設定します。
systemctl daemon-reload # Reload systemd daemons. systemctl enable --now containerd.service systemctl start containerd.service systemctl status containerd.service -
次のコマンドを実行して 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
-
-
kubelet と kube-proxy をインストールします。
-
バイナリファイルを取得します。 マスターノードにログインし、バイナリファイルを現在のノードにコピーします。
scp /usr/local/bin/kube{let,-proxy} $NODEIP:/usr/local/bin/ -
証明書を取得します。 次のコマンドを実行して、ローカルマシンに証明書ストレージディレクトリを作成します。
mkdir -p /etc/kubernetes/pkiマスターノードにログインし、証明書を現在のノードにコピーします。
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 -
次のコマンドを実行して、kubelet サービスを設定します。 手順 2 で取得した Alibaba Cloud ノードプール変数を使用します。
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 -
次のコマンドを実行して、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 -
次のコマンドを実行して、kubelet を起動します。
systemctl daemon-reload # Reload systemd daemons. systemctl enable --now kubelet.service systemctl start kubelet.service systemctl status kubelet.service -
次のコマンドを実行して、クラスター情報を表示します。
kubectl get node -
マスターノードにログインし、kube-proxy に必要な kubeconfig ファイルを取得します。
scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfig -
次のコマンドを実行して、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 -
次のコマンドを実行して、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 -
次のコマンドを実行して、kube-proxy を起動します。
systemctl daemon-reload # Reload systemd daemons. systemctl enable --now kube-proxy.service systemctl restart kube-proxy.service systemctl status kube-proxy.service
-
-
ノードプールのステータスを同期します。
-
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
ノードプール ページで、同期ノードプール をクリックします。 同期が完了したら、失敗メッセージが表示されず、ノードプールの状態が正常であることを確認します。
-
-
カスタムイメージをエクスポートします。
-
ECS コンソールにログインします。
-
左側メニューで、 を選択します。
-
インスタンスID をクリックします。 インスタンスの詳細 タブで、[カスタムイメージの作成] をクリックします。
-
左側メニューで、 を選択します。
-
カスタムイメージ ページで、作成した ステータス を確認できます。 使用可能 は 利用可能 です。
-
手順 3:カスタムイメージを使用したノードプールの変更または作成
すでにカスタムイメージをお持ちで、手順 1 と手順 2 をスキップした場合は、カスタムイメージを使用してノードプールを作成する必要があります。 詳細については、「既存の ECS インスタンスからカスタムイメージを作成し、そのイメージを使用してノードを作成する方法」をご参照ください。
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
ノードプール ページで、対象の ノードプール を見つけ、編集 列の 編集 をクリックします。 事前設定 タブで、ノードプールのイメージを カスタムイメージ に設定します。 [カスタムイメージ] 設定を見つけ、[カスタムイメージの選択] リンクをクリックし、作成したカスタムイメージを選択します。
-
ノードプール ページで、オペレーティングシステム が カスタムイメージ に更新されていることを確認できます。 更新が完了すると、ノードプールの [オペレーティングシステム] 列に [カスタムイメージ] とそのイメージ ID が表示され、イメージが正常に置き換えられたことを示します。
手順 4:クラウドパラメーターに対応するためのノード初期化スクリプトの更新
-
スクリプトの 7 行目に示されているように、カスタムイメージから残存する kubelet 証明書を削除する必要があります。
-
既存のカスタムノードプールについては、手順 1 の説明に従って、カスタムスクリプトのダウンロード URL を設定する必要があります。
-
次の内容で
join-ecs-node.shファイルを作成または更新します。 カスタムイメージにはすでに必要なツールと依存関係が含まれているため、カスタムスクリプトは 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 -
更新した
join-ecs-node.shスクリプトを OSS にアップロードします。
手順 5:ノードプールのスケールアウト
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
ノードプール ページで、目的のノードプールを見つけます。「操作」列で、 を選択して新しいノードを追加します。
両方のノードが正常な状態であることを確認します。 これにより、弾力的なノードプールが正常に作成されたことが確認できます。
-
ノードプールの自動スケーリングポリシーを設定できます。 詳細については、「自動スケーリングの設定」をご参照ください。