ACK One注册集群功能允许您将本地数据中心或其他云厂商的Kubernetes集群接入阿里云容器服务管理平台,实现统一管理,快速搭建混合云环境。通过这种方式,您可以有效地管理和扩展计算资源,以应对业务需求。当本地数据中心的计算资源受限时,您可以通过云上节点池功能,扩展云端计算资源,从而满足业务的增长需求。本文介绍如何创建和使用云上节点池。
前提条件
已创建注册集群,并已将本地数据中心自建Kubernetes集群接入注册集群。具体操作,请参见通过控制台创建注册集群。
本地数据中心自建Kubernetes集群的网络与云上注册集群使用的专有网络VPC互通。具体操作,请参见入门概述。
本地数据中心自建Kubernetes集群必须使用私网方式导入代理配置接入注册集群。具体操作,请参见将目标集群接入注册集群。
已通过kubectl连接注册集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
操作步骤
在创建集群并为其添加节点的过程中,首先需要将添加节点的脚本地址配置到集群配置项中。因此,首要任务是准备脚本并且配置阿里云系统环境变量。为了帮助您快速完成节点添加脚本的配置,请根据下列步骤完成后续操作。
需要根据您的自身环境和上图中的判断条件,最终确定您使用自定义脚本还是获取节点示例脚本。
示例脚本仅支持基于yum软件包管理系统的操作系统。
步骤一(A):为自定义脚本添加阿里云环境变量
检查是否为GPU节点(可选)。
当通过节点池添加ECS节点的时候,出于业务的需要,可能需要GPU节点,可以通过如下的脚本来判断节点是否为GPU节点。
#!/bin/bash # 检查lspci是否安装 if ! which lspci &>/dev/null; then yum -y install pciutils fi # 检查节点是否存在GPU设备 if lspci | grep -i nvidia &>/dev/null; then echo "该节点为GPU节点,请安装相关驱动。" fi
GPU节点不同于普通的ECS节点,需要安装驱动包、device plugin以及配置运行时等。相关操作,请参见GPU节点安装新版本驱动。
需要您提前准备自定义脚本,以确保注册集群的节点池能够正确同步节点状态,并满足云上调度需求。自定义脚本必须接收阿里云注册集群下发的系统环境变量。接收系统环境变量的方法取决于集群的搭建方式。目前,Kubernetes集群的搭建方式主要有二进制方式和kubeadm方式,以下分别说明这两种方式下如何接收环境变量。
kubeadm方式搭建Kubernetes集群
大多数Kubernetes集群是通过官方工具kubeadm搭建的,这也是官方推荐的方式。如果您使用kubeadm搭建集群,需要在自定义添加节点的脚本中追加以下内容。
.... ####### <新增部分。 # 配置Node Labels,Taints,Node Name,Provider 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 |
在完成以上所有操作后,请跳转到步骤二:保存并上传脚本到文件服务器。
步骤一(B):创建添加节点脚本
获取系统相关信息。
集群版本大于等于1.18
运行如下命令获取IDC 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
运行如下命令获取IDC Kubernetes集群运行时以及版本号。后续设置到示例脚本环境变量
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 很重要。需要设置为永不过期,避免节点池弹性伸缩失效。 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***
集群版本小于1.18
运行如下命令获取IDC 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
运行如下命令获取IDC Kubernetes集群运行时以及版本号。后续设置到示例脚本环境变量
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 很重要。需要设置为永不过期,避免节点池弹性伸缩失效。 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***
获取示例脚本。
说明示例脚本仅适用于普通的ECS节点,如果您是GPU节点,请提交工单获取研发团队支持。
根据您获取的IDC Kubernetes集群版本号、运行时以及版本号等信息,在示例脚本环境变量位置设置具体的值。
Docker + Kubernetes
Containerd + Kubernetes
步骤二:保存并上传脚本到文件服务器
您需要将自定义脚本或改造后的脚本保存在文件服务器上,例如存放在OSS Bucket上。示例存放地址为https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
。
步骤三:修改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
必须先完成此步骤配置,才能创建节点池,否则扩容时无法获取自定义脚本配置,导致扩容失败。