すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ノードプール用のカスタムスクリプトを作成する

最終更新日:Mar 18, 2025

Distributed Cloud Container Platform for Kubernetes (ACK One) では、登録済みクラスターを使用して、オンプレミス データセンターまたは他のクラウドプロバイダーにデプロイされた外部 Kubernetes クラスターを Container Service for Kubernetes (ACK) に接続できます。これにより、クラスターとリソースを一元管理できるようになり、ハイブリッドクラウド環境を迅速にデプロイできます。ローカル データセンターの計算リソースが制約された場合、ノードプールを作成してクラウドの計算リソースをスケールアウトし、動的なビジネスの成長需要に対応できます。このトピックでは、クラウドノードプールのプロビジョニングに必要なカスタムスクリプトを作成する方法について説明します。

前提条件

  • ACK One 登録済みクラスターが作成され、データセンターにデプロイされた外部 Kubernetes クラスターがACK One 登録済みクラスターに接続されていること。詳細については、「ACK One 登録済みクラスターを作成する」をご参照ください。

  • 外部 Kubernetes クラスターのネットワークが、ACK One 登録済みクラスターの VPC に接続されていること。詳細については、「VPC 接続のシナリオベースのネットワーキング」をご参照ください。

  • プライベートネットワークモードで、外部 Kubernetes クラスターのプロキシ構成をACK One 登録済みクラスターにインポートする必要があります。詳細については、「ACK One 登録済みクラスターを作成する」をご参照ください。

手順

説明
  • サンプルノードスクリプトを使用するか、実際の環境と前の図の条件に基づいてカスタムスクリプトを作成できます。

  • サンプルスクリプトは、パッケージマネージャーとして Yellowdog Updater, Modified (YUM) を使用するオペレーティングシステムのみをサポートしています。

ステップ 1 (A): カスタムスクリプトに Alibaba Cloud 環境変数を追加する

  1. ノードが GPU アクセラレーションノードであるかどうかを確認します。この手順はオプションです。

    次のスクリプトを使用して、Elastic Compute Service (ECS) ノードが GPU アクセラレーションノードであるかどうかを確認できます。

    #!/bin/bash
    # Ispci がインストールされているかどうかを確認します。
    if ! which lspci &>/dev/null; then
    	yum -y install pciutils
    fi
    
    # ノードに GPU が搭載されているかどうかを確認します。
    if lspci | grep -i nvidia &>/dev/null; then
    	echo "ノードは GPU アクセラレーションノードであるため、関連ドライバーをインストールしてください。"
    fi

    通常の ECS ノードとは異なり、GPU アクセラレーションノードの場合はドライバーとデバイスプラグインをインストールする必要があります。詳細については、「ノードの NVIDIA ドライバーを手動で更新する」をご参照ください。

  2. 登録済みクラスターのノードプールがリソーススケジューリングのためにノードステータスを正常に同期できるように、カスタムスクリプトを準備する必要があります。カスタムスクリプトは、登録済みクラスターによって発行された環境変数を取得する必要があります。環境変数を取得するために使用される方法は、外部 Kubernetes クラスターの作成方法によって異なります。 kubeadm またはバイナリメソッドを使用して Kubernetes クラスターを作成できます。

    Kubernetes クラスターは kubeadm メソッドを使用して作成されます

    kubeadm メソッドは Kubernetes によって推奨されており、公式ツール kubeadm を使用して Kubernetes クラスターがセットアップされます。カスタムノードスクリプトに次のコンテンツを追加する必要があります。

    ....
    
    ####### <次のコンテンツを追加します。
    
    # ノードラベル、テイント、ノード名、およびノードプロバイダー 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
    
    ####### 前述のコンテンツを追加します。
    
    # ランタイムと kubelet を再起動します。
    ....
    

    Kubernetes クラスターはバイナリメソッドを使用して作成されます

    クラスターが Kubernetes バイナリファイルを使用して作成された場合は、カスタムノードスクリプトで kubelet の起動構成を変更して、環境変数を取得する必要があります。通常、kubelet.service ファイルは /usr/lib/systemd/system/ ディレクトリに保存されます。

    cat >/usr/lib/systemd/system/kubelet.service <<EOF
    # カスタム構成は表示されません。
    ...
    [Service]
    ExecStart=/data0/kubernetes/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} \\
    
      ....
      --v=4
    Restart=on-failure
    RestartSec=5
    [Install]
    WantedBy=multi-user.target
    EOF

次の表に、登録済みクラスターによって発行された環境変数を示します。

環境変数

説明

ALIBABA_CLOUD_PROVIDER_ID

カスタムノードスクリプトはこの環境変数を取得する必要があります。そうしないと、登録済みクラスターは正常に実行できません。

ALIBABA_CLOUD_PROVIDER_ID=cn-shenzhen.i-wz92ewt14n9wx9mo***

ALIBABA_CLOUD_NODE_NAME

カスタムノードスクリプトはこの環境変数を取得する必要があります。そうしないと、ノードプールのノードが異常な状態で実行される可能性があります。

ALIBABA_CLOUD_NODE_NAME=cn-shenzhen.192.168.1.***

ALIBABA_CLOUD_LABELS

カスタムノードスクリプトはこの環境変数を取得する必要があります。そうしないと、ノードプールの管理中およびクラウドノードとオンプレミスノード間のワークロードスケジューリング中にエラーが発生する可能性があります。

ALIBABA_CLOUD_LABELS=alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142***,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670***,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu

workload=cpu ラベルは、ノードプール構成で定義されたカスタムラベルです。他のラベルはシステムラベルです。

ALIBABA_CLOUD_TAINTS

カスタムノードスクリプトはこの環境変数を取得する必要があります。そうしないと、ノードプールに追加されたテイントは有効になりません。

ALIBABA_CLOUD_TAINTS=workload=ack:NoSchedule

上記の手順を実行した後、ステップ 2:スクリプトを保存してファイルサーバーにアップロードするに進みます。

ステップ 1 (B): ノードスクリプトを追加する

  1. 関連するシステム情報を取得します。

    クラスターの Kubernetes バージョンが 1.18 以降の場合

    • 次のコマンドを実行して、外部クラスターの Kubernetes バージョンをクエリします。 Kubernetes バージョンは、後続の手順でサンプルスクリプトの環境変数 KUBE_VERSION で指定されます。

      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'

      予期される出力:

      v1.14.10
    • 次のコマンドを実行して、外部クラスターのランタイムとランタイムバージョンをクエリします。ランタイムとランタイムバージョンは、後続の手順でサンプルスクリプトの環境変数 RUNTIME_VERSION で指定されます。

      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'

      予期される出力:

      docker://18.6.3                     # Docker が使用されています。
      containerd://1.4.3                  # containerd が使用されています。
    • 次のコマンドを実行して、ノードを追加するために使用される kubeadm コマンドをクエリします。コマンドは、後続の手順でサンプルスクリプトの環境変数 KUBEADM_JOIN_CMD で指定されます。

      # --ttl 0 は非常に重要です。ノードプールの自動スケーリングが無効にならないように、TTL を 0(有効期限なし)に設定します。
      kubeadm token create --ttl 0 --print-join-command

      予期される出力:

      kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb***     --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d*** 

    クラスターの Kubernetes バージョンが 1.18 より前の場合

    • 次のコマンドを実行して、外部クラスターの Kubernetes バージョンをクエリします。 Kubernetes バージョンは、後続の手順でサンプルスクリプトの環境変数 KUBE_VERSION で指定されます。

      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'

      予期される出力:

      v1.14.10
    • 次のコマンドを実行して、外部クラスターのランタイムとランタイムバージョンをクエリします。ランタイムとランタイムバージョンは、後続の手順でサンプルスクリプトの環境変数 RUNTIME_VERSION で指定されます。

      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'

      予期される出力:

      docker://18.6.3                     # Docker が使用されています。
      containerd://1.4.3                  # containerd が使用されています。
    • 次のコマンドを実行して、ノードを追加するために使用される kubeadm コマンドをクエリします。コマンドは、後続の手順でサンプルスクリプトの環境変数 KUBEADM_JOIN_CMD で指定されます。

      # --ttl 0 は非常に重要です。ノードプールの自動スケーリングが無効にならないように、TTL を 0(有効期限なし)に設定します。
      kubeadm token create --ttl 0 --print-join-command

      予期される出力:

      kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb***     --discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d*** 
  2. サンプルスクリプトを取得します。

    説明
    • サンプルスクリプトは、通常の ECS ノードにのみ適用されます。 GPU アクセラレーション ECS ノードの場合は、submit a ticket を R&D チームに送信してください。

    • サンプルスクリプトの環境変数で、取得した外部クラスターの Kubernetes バージョン、ランタイム、ランタイムバージョン、および kubeadm コマンドを指定します。

    Docker

    コードを表示

    #!/bin/bash
    
    # 外部クラスターの Kubernetes バージョン。
    export KUBE_VERSION=<KUBE_VERSION>
    
    # 外部クラスターの Docker バージョン。
    export RUNTIME_VERSION=<RUNTIME_VERSION>
    
    # kubeadm join コマンド。
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>
    
    # ファイアウォールを無効にします。
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # selinux を無効にします。
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # スワップパーティションを無効にします。
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    
    # カーネルパラメータを構成します。
    cat > /etc/sysctl.d/Kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    EOF
    
    sysctl --system
    
    
    # ipadmin をインストールします。
    yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    
    systemctl enable --now systemd-modules-load
    
    # Docker YUM ソースを構成します。
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 依存コンポーネントをインストールし、Docker が提供する YUM ソースをインポートします。
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # インストールできるバージョンを表示します。
    yum list docker-ce --showduplicates | sort -r
    
    # 最新の Docker バージョンをインストールします。
    yum install -y docker-ce-$RUNTIME_VERSION docker-ce-cli-$RUNTIME_VERSION containerd.io
    
    ## /etc/docker ディレクトリを作成します。
    mkdir /etc/docker
    
    # デーモンをセットアップします。
    cat > /etc/docker/daemon.json <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ],
      "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    EOF
    
    mkdir -p /etc/systemd/system/docker.service.d
    
    # Docker を再起動します。
    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker
    
    
    # Kubernetes をインストールします。
    cat >/etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    yum install -y kubelet-$KUBE_VERSION kubeadm-$KUBE_VERSION kubectl-$KUBE_VERSION --disableexcludes=kubernetes
    
    
    # kubelet.service を構成します。
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! 重要 !
    # この構成は ACK によって管理および生成されます
    # 予期しない障害を避けるために編集しないでください
    
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=http://kubernetes.io/docs/
    
    [Service]
    ExecStart=/usr/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # <<< 登録済みクラスターの環境変数。設定を削除しないでください。
    # ノードラベル、テイント、ノード名、およびノードプロバイダー 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
    # 登録済みクラスターの環境変数。設定を削除しないでください。>>>
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    # kubeadm join コマンドを実行します。
    $KUBEADM_JOIN_CMD

    containerd

    コードを表示

    #!/bin/bash
    
    # 外部クラスターの Kubernetes バージョン。
    export KUBE_VERSION=<KUBE_VERSION>
    
    # 外部クラスターの containerd バージョン。
    export RUNTIME_VERSION=<RUNTIME_VERSION>
    
    # kubeadm join コマンド。
    export KUBEADM_JOIN_CMD=<KUBEADM_JOIN_CMD>
    
    
    # ファイアウォールを無効にします。
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl is-enabled firewalld
    
    # selinux を無効にします。
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    setenforce 0
    
    # スワップパーティションを無効にします。
    sed -i '/swap/s/^/#/g' /etc/fstab
    swapoff -a
    
    # カーネルパラメータを構成します。
    cat > /etc/sysctl.d/Kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    EOF
    
    sysctl --system
    
    
    # ipadmin をインストールします。
    yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    
    systemctl enable --now systemd-modules-load
    
    # containerd をインストールして構成します。
    yum -y install yum-utils device-mapper-persistent-data lvm2
    
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # containerd を構成します。
    cat >>/etc/modules-load.d/containerd.conf <<EOF
    overlay
    br_netfilter
    EOF
    # overlay モジュールをすぐにロードします。
    modprobe overlay
    # br_netfilter モジュールをすぐにロードします。
    modprobe br_netfilter
    # containerd をインストールします。
    yum install containerd.io-$RUNTIME_VERSION -y
    
    cat >>/etc/crictl.yaml <<EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: false
    pull-image-on-create: false
    disable-pull-on-run: false
    EOF
    
    
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    # systemd を使用して cgroup を管理します。
    sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
    # Alibaba Cloud からサンドボックスイメージをプルします。
    sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
    sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
    # containerd を開始します。
    systemctl enable containerd
    systemctl start containerd
    
    
    # Kubernetes をインストールします。
    cat >/etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    yum -y install kubeadm-$KUBE_VERSION kubectl-$KUBE_VERSION kubelet-$KUBE_VERSION
    
    
    # kubelet.service を構成します。
    cat >/etc/systemd/system/kubelet.service <<EOF
    # ! 重要 !
    # この構成は ACK によって管理および生成されます
    # 予期しない障害を避けるために編集しないでください
    
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=http://kubernetes.io/docs/
    
    [Service]
    ExecStart=/usr/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # kubelet.service.d を作成します。
    #mkdir -p /etc/systemd/system/kubelet.service.d
    
    
    # <<< 登録済みクラスターの環境変数。設定を削除しないでください。
    # ノードラベル、テイント、ノード名、およびノードプロバイダー 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
    # 登録済みクラスターの環境変数。設定を削除しないでください。>>>
    
    
    systemctl enable kubelet
    systemctl start kubelet
    
    
    # kubeadm join コマンドを実行します。
    $KUBEADM_JOIN_CMD

ステップ 2: スクリプトを保存してファイルサーバーにアップロードする

カスタムノードスクリプトまたは変更したサンプルノードスクリプトを、Object Storage Service (OSS) バケットなどのファイルサーバーにアップロードする必要があります。例:https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh

ステップ 3: ack-cluster-agent 構成を変更する

重要

ノードプールを作成する前に、この手順を完了する必要があります。そうしないと、ノードプールをスケールアウトするときにカスタムスクリプトを取得できません。その結果、スケールアウト操作は失敗します。

スクリプトがアップロードされ、スクリプトのパスが記録されたら、kube-system 名前空間の ack-agent-config 構成の addNodeScriptPath フィールドにパスを指定します。

# kubectl を使用して ack-agent-config 構成を変更します。
kubectl edit cm ack-agent-config -n kube-system

# addNodeScriptPath フィールドを次のように変更します。
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