ハイブリッドクラスターは、オンプレミス型セルフマネージド Kubernetes クラスターを登録済みクラスターを介して Alibaba Cloud に接続します。この設定により、クラウドベースのコンピューティングノードでセルフマネージド Kubernetes クラスターをスケーリングし、オンプレミスとクラウドの両方のリソースを管理できます。このトピックでは、Calico コンテナネットワークプラグインを使用するデータセンター内のセルフマネージド Kubernetes クラスターを例として、ハイブリッドクラスターの作成方法を説明します。
前提条件
-
オンプレミス型セルフマネージド Kubernetes クラスターのネットワークと、登録済みクラスターで使用される VPC (Virtual Private Cloud) は接続されている必要があります。これには、コンピューティングノードネットワークとコンテナネットワークの両方の接続性が含まれます。この接続を確立するには、Cloud Enterprise Network (CEN) を使用できます。詳細については、「さまざまなシナリオでの複数 VPC 接続の確立」をご参照ください。
-
宛先クラスターは、登録済みクラスターによって提供されるプライベートクラスターインポートエージェント構成を使用して接続する必要があります。
-
登録済みクラスターを介して追加されたクラウドベースのコンピューティングノードは、オンプレミス型セルフマネージド Kubernetes クラスターの API Server にアクセスできる必要があります。
-
kubectl を使用して登録済みクラスターに接続済みです。詳細については、「クラスターの kubeconfig ファイルの取得と kubectl を使用したクラスターへの接続」をご参照ください。
ハイブリッドエラスティックコンテナクラスターアーキテクチャ
セルフマネージド Kubernetes クラスターは、ルーティングに Calico を使用することがよくあります。このトピックでは、Calico のルートリフレクターモードを使用するデータセンター内のセルフマネージドクラスターを例として使用します。クラウド環境では、特定のクラウドプラットフォーム向けにカスタマイズされたネットワークプラグインを使用します。Container Service for Kubernetes (ACK) は、コンテナネットワークを管理するために Terway プラグインを使用します。次の図は、ハイブリッドクラスターのネットワークトポロジーを示しています。
ご利用のデータセンターでは、プライベート CIDR ブロックは 192.168.0.0/24 であり、コンテナネットワーク CIDR ブロックは 10.100.0.0/16 です。Calico ネットワークプラグインはルートリフレクターモードを使用します。クラウド側では、VPC CIDR ブロックは 10.0.0.0/8 です。コンピューティングノードの vSwitch CIDR ブロックは 10.10.24.0/24 であり、Pod の vSwitch CIDR ブロックは 10.10.25.0/24 です。Terway ネットワークコンポーネントは共有モードを使用します。
登録済み ACK クラスターを使用したハイブリッドコンテナクラスターの作成
-
オンプレミスとクラウドベースのコンテナネットワークプラグインを構成します。
ハイブリッドクラスターでは、オンプレミスの Calico プラグインがオンプレミスでのみ実行され、クラウドベースの Terway コンポーネントがクラウドでのみ実行されるようにします。
登録済み ACK クラスターに追加されたクラウドベースの Elastic Compute Service (ECS) ノードには、自動的に alibabacloud.com/external=true のラベルが付けられます。データセンター内の Calico Pod がオンプレミスでのみ実行されるようにするには、NodeAffinity を構成します。次の例は、その方法を示しています。
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 権限を構成します。
onetl を使用した構成
-
ローカルマシンに onectl をインストールして構成します。詳細については、「onetl を使用した登録済みクラスターの管理」をご参照ください。
-
次のコマンドを実行して、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 ネットワークコンポーネントの AccessKey 情報に必要な Resource Access Management (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 プラグインをインストールします。
onetl を使用したインストール
次のコマンドを実行して、Terway プラグインをインストールします。
onectl addon install terway-eniip
予想される出力:
Addon terway-eniip, version **** installed.
コンソールでのインストール
Container Service 管理コンソールにログインします。Container Service 管理コンソール 。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
[クラスターリスト] ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[アドオン管理] をクリックします。
-
「アドオン管理」ページで、「[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 Pod が alibabacloud.com/external=true のラベルが付いたクラウドベースの ECS ノードでのみ実行されることを示しています。
-
次のコマンドを実行して eni-config ConfigMap を編集し、[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 クラスターの元のノード初期化スクリプトを変更します。
この例では、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
登録済み ACK クラスターに必要なカスタムノード初期化スクリプト `init-node-ecs.sh` は、`init-node.sh` スクリプトに基づいています。これは、登録済みクラスターから渡される ALIBABA_CLOUD_PROVIDER_ID、ALIBABA_CLOUD_NODE_NAME、ALIBABA_CLOUD_LABELS、および ALIBABA_CLOUD_TAINTS 環境変数を受け取り、構成します。次の例は、`init-node-ecs.sh` スクリプトを示しています。
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
####### <Start of added section
# Configure Node Labels, Taints, Node Name, and 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
####### End of added section>
kubeadm join 10.200.1.253:XXXX --token cqgql5.1mdcjcvhszol**** --discovery-token-unsafe-skip-ca-verification
-
カスタムスクリプトを保存して構成します。
カスタムスクリプトを、Object Storage Service (OSS) バケットなどの HTTP ファイルサーバに保存します。次の例は、サンプル URL を示しています: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh。
カスタムノード追加スクリプトのパス https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/init-node-ecs.sh に addNodeScriptPath フィールドを設定し、構成を保存します。次の例は、その方法を示しています。
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
これらの構成を完了した後、宛先登録済み ACK クラスターでノードプールを作成し、ECS ノードをスケールアウトできます。
-
ノードプールを作成し、ECS ノードをスケールアウトします。
Container Service 管理コンソールにログインします。Container Service 管理コンソール 。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
「クラスターリスト」ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
ノードプール ページで、ノードプールを作成し、必要に応じてノードをスケールアウトします。詳細については、「ノードプールの作成と管理」をご参照ください。
参照情報
Terway シナリオのコンテナネットワークを計画します。詳細については、「ACK マネージドクラスターのネットワーク計画」をご参照ください。
データセンター内の Kubernetes クラスターのネットワークをクラウド内の VPC に接続します。詳細については、「機能」をご参照ください。
登録済みクラスターを作成し、データセンター内のセルフマネージド Kubernetes クラスターに接続します。詳細については、「ACK One 登録済みクラスターの作成」をご参照ください。