登録済みクラスターを使用して、データセンター内の自己管理型KubernetesクラスターをContainer Service for Kubernetes (ACK) に登録することで、ハイブリッドクラウドクラスターを構築できます。 ハイブリッドクラウドクラスターを構築した後、クラスターにElastic Compute Service (ECS) インスタンスを追加し、クラスターに属するクラウドリソースとオンプレミスリソースを一元管理できます。 このトピックでは、Calicoネットワークプラグインを使用してACKを取得する自己管理Kubernetesクラスターを登録することにより、ハイブリッドクラウドクラスターを構築する方法について説明します。
前提条件
自己管理クラスターが存在するデータセンターは、登録されたクラスターがデプロイされている仮想プライベートクラウド (VPC) に接続されています。 データセンター内のコンピューティングノードおよびコンテナは、VPC内のコンピューティングノードおよびコンテナと通信できます。 Cloud Enterprise Network (CEN) を使用してネットワーク接続を確立できます。 詳細については、「概要」をご参照ください。
自己管理Kubernetesクラスターは、登録済みクラスターを使用してACKに登録されます。
登録済みクラスターに追加されたクラウドコンピューティングノードは、データセンターの自己管理KubernetesクラスターのAPIサーバーにアクセスできます。
kubectlクライアントが登録済みクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
ハイブリッドクラウドクラスターのアーキテクチャ
Calicoは、自己管理Kubernetesクラスターで一般的に使用されます。 このトピックでは、自己管理クラスターでCalico route reflectorモードを使用します。 コンテナネットワークを管理するために、クラウドプラットフォーム用に最適化されたネットワークプラグインを選択することを推奨します。 ACKは、Terwayネットワークプラグインを使用してコンテナネットワークを管理します。 次の図は、ハイブリッドクラウドクラスターのネットワークアーキテクチャを示しています。
データセンターのプライベートCIDRブロックは192.168.0.0/24です。 データセンターのコンテナのCIDRブロックは10.100.0.0/16です。 自己管理クラスターは、Calico route reflectorモードを使用します。 VPCのCIDRブロックは10.0.0.0/8です。 登録済みクラスターのノードで使用されるvSwitchのCIDRブロックは10.10.25.0/24です。 登録済みクラスターはTerway共有ネットワークモードを使用します。
登録済みクラスターを使用したハイブリッドクラウドクラスターの構築
データセンターで実行されるネットワークプラグインと、クラウドで実行されるネットワークプラグインを設定します。
ハイブリッドクラウドクラスターを構築するには、データセンターでのみ実行されるネットワークプラグインと、クラウドでのみ実行されるネットワークプラグインを設定する必要があります。
alibabacloud.com/external=trueラベルは、登録済みクラスターに追加されたECSインスタンスに自動的に追加されます。 したがって、ポッドがクラウド内のノードにスケジュールされないように、Calicoポッドのノードアフィニティ設定を構成する必要があります。 例:
cat <<EOF > calico-ds.patch
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: alibabacloud.com/external
operator: NotIn
values:
- "true"
- key: type
operator: NotIn
values:
- "virtual-kubelet"
EOF
kubectl -n kube-system patch ds calico-node -p "$(cat calico-ds.patch)"
TerwayネットワークプラグインのRAM権限を設定します。
onectlの使用
オンプレミスマシンにonectlをインストールして構成します。 詳細については、「onectlを使用した登録済みクラスターの管理」をご参照ください。
次のコマンドを実行して、TerwayプラグインのRAM権限を設定します。
onectl ram-user grant --addon terway-eniip
期待される出力:
Ram policy ack-one-registered-cluster-policy-terway-eniip granted to ram user ack-one-user-ce313528c3 successfully.
コンソールの使用
次のポリシーを使用して、TerwayネットワークプラグインにRAM権限を付与します。 詳細については、「RAMユーザーへの権限付与」をご参照ください。
{
"Version": "1",
"Statement": [
{
"Action": [
"ecs:CreateNetworkInterface",
"ecs:DescribeNetworkInterfaces",
"ecs:AttachNetworkInterface",
"ecs:DetachNetworkInterface",
"ecs:DeleteNetworkInterface",
"ecs:DescribeInstanceAttribute",
"ecs:AssignPrivateIpAddresses",
"ecs:UnassignPrivateIpAddresses",
"ecs:DescribeInstances",
"ecs:ModifyNetworkInterfaceAttribute"
],
"Resource": [
"*"
],
"Effect": "Allow"
},
{
"Action": [
"vpc:DescribeVSwitches"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
Terwayプラグインをインストールします。
onectlの使用
次のコマンドを実行して、Terwayプラグインをインストールします。
onectl addon install terway-eniip
期待される出力:
Addon terway-eniip, version **** installed.
コンソールの使用
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
On theアドオンページを検索し、terway-eniipコンポーネントをクリックし、インストールカードの右下隅にあり、をクリックします。OK.
次のコマンドを実行して、Terway用に作成されたDaemonSetを照会します。
kubectlを使用してクラスターに接続した後、登録済みクラスターで次のコマンドを実行し、Terway用に作成されたDaemonSetを表示します。
ハイブリッドクラスターでオンクラウドノードをスケールアウトする前に、Terwayポッドはどのオンプレミスノードにもスケジュールされません。
kubectl -nkube-system get ds |grep terway
期待される出力:
terway-eniip 0 0 0 0 0 alibabacloud.com/external=true 16s
出力は、Terwayポッドがalibabacloud.com/external=trueラベルのECSインスタンスにのみスケジュールされていることを示しています。
次のコマンドを実行して、ConfigMapでeni-config
を変更し、eni_conf.access_keyおよびeni_conf.access_secretを設定します。
kubectl -n kube-system edit cm eni-config
次のテンプレートに、eni-config
の例を示します。
kind: ConfigMap
apiVersion: v1
metadata:
name: eni-config
namespace: kube-system
data:
eni_conf: |
{
"version": "1",
"max_pool_size": 5,
"min_pool_size": 0,
"vswitches": {"AZoneID":["VswitchId"]},
"eni_tags": {"ack.aliyun.com":"{{.ClusterID}}"},
"service_cidr": "{{.ServiceCIDR}}",
"security_group": "{{.SecurityGroupId}}",
"access_key": "",
"access_secret": "",
"vswitch_selection_policy": "ordered"
}
10-terway.conf: |
{
"cniVersion": "0.3.0",
"name": "terway",
"type": "terway"
}
カスタムノード初期化スクリプトを作成します。
セルフマネージドKubernetesクラスターの元のノード初期化スクリプトに基づいて、カスタムノード初期化スクリプトを作成します。
この例では、自己管理KubernetesクラスターはKubeadmツールを使用して初期化されます。 次のコードブロックは、セルフマネージドKubernetesクラスターにノードを追加するために使用される元の初期化スクリプトの例です。 スクリプトの名前はinit-node.shです。
init-node.shスクリプトの表示
#!/bin/bash
export K8S_VERSION=1.24.3
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
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
sysctl --system
yum remove -y containerd.io
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io-1.4.3
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g" /etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g" /etc/containerd/config.toml
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd
yum install -y nfs-utils
yum install -y wget
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum remove -y kubelet kubeadm kubectl
yum install -y kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION
crictl config runtime-endpoint /run/containerd/containerd.sock
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
containerd --version
kubelet --version
kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification
init-node.shスクリプトに基づいて、登録済みクラスターのinit-node-ecs.shという名前のカスタムノード初期化スクリプトを作成します。 カスタムスクリプトは、登録済みクラスターによって発行された次の環境変数ALIBABA_CLOUD_PROVIDER_ID、ALIBABA_CLOUD_NODE_NAME、ALIBABA_CLOUD_LABELS、およびALIBABA_CLOUD_TAINTSを受信および設定するために使用されます。 次のコードブロックは、カスタムスクリプトの例です。
init-node-ecs.shスクリプトの表示
#!/bin/bash
export K8S_VERSION=1.24.3
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
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
sysctl --system
yum remove -y containerd.io
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io-1.4.3
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g" /etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g" /etc/containerd/config.toml
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd
yum install -y nfs-utils
yum install -y wget
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum remove -y kubelet kubeadm kubectl
yum install -y kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION
crictl config runtime-endpoint /run/containerd/containerd.sock
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
containerd --version
kubelet --version
####### <The following content is added.
# Configure node labels, taints, the node name, and the Provider ID.
#KUBEADM_CONFIG_FILE="/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf"
KUBELET_CONFIG_FILE="/etc/sysconfig/kubelet"
#KUBELET_CONFIG_FILE="/etc/systemd/system/kubelet.service.d/10-kubeadm.conf"
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
# Restart Docker and start kubelet.
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
####### The preceding content is added.>
kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification
カスタムスクリプトを保存して設定します。
OSSバケットなどのHTTPファイルサーバーにカスタムスクリプトを保存します。 この例では、カスタムスクリプトのOSSパスはhttps:// kubelet-**** .oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh
です。
次のコードブロックのaddNodeScriptPathパラメーターをhttps:// kubelet-**** .oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh
に設定し、変更を保存します。
apiVersion: v1
data:
addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh
kind: ConfigMap
metadata:
name: ack-agent-config
namespace: kube-system
上記の手順が完了したら、登録済みクラスターにノードプールを作成し、ノードプールにECSインスタンスを追加できます。
ノードプールを作成し、ECSインスタンスをノードプールに追加します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[ノードプール] ページで、ノードプールを作成し、ノードプールにECSインスタンスを追加します。 詳細については、「ノードプールの作成」をご参照ください。
関連ドキュメント
Terwayネットワークプラグインを使用するクラスターのコンテナーネットワークを計画します。 詳細については、「ACKクラスターのネットワークの計画」をご参照ください。
データセンターをVPCに接続します。 詳細については、「機能と特徴」をご参照ください。
VPCに登録済みクラスターを作成し、自己管理型KubernetesクラスターをACKに登録します。 詳細については、「ACKコンソールでの登録済みクラスターの作成」をご参照ください。