接入标准 Kubernetes 集群
支持将通过 kubeadm 部署的标准原生 Kubernetes 集群接入平台统一管理。
名词解释
操作 | 说明 |
---|---|
托管版 Kubernetes 集群 | 公有云厂商提供的一种 Kubernetes 集群类型,这个集群中的 Master 节点及其中组件由公有云厂商进行管理,用户不可登录,也无法管理 Master 节点。 |
非托管版 Kubernetes 集群 | 与托管版对应,部分公有云厂商也提供了由用户自己管理 Master 节点的集群,如阿里云 ACK 专有版集群、腾讯云 TKE 独立集群等。 |
前提条件
-
集群上 Kubernetes 等组件的版本满足 接入标准 Kubernetes 集群组件版本和参数要求 。
-
为待接入集群主机安装 kubectl 工具。
-
确保该集群与 global 集群网络互通,您可参考以下步骤配置网络:
-
若接入集群可以正常访问平台访问地址:则无需进行网络配置。
-
若接入集群无法正常访问平台访问地址:您必须为平台添加域名,并将域名解析至平台访问地址,根据实际场景配置域名解析(内网和公网),在 更新平台参数 页面,将域名添加至 平台其他访问地址。
注意:被接入集群接入成功后,在 global 集群 master 节点修改对应集群 cluster 资源,增加 annotation:
cpaas.io/platform-url
:<平台的域名地址,例如:https://www.domain.cn>
。
-
-
如需从外部镜像仓库拉取集群所需的平台组件镜像,请提前搭建好存储平台组件镜像的镜像仓库,具体实施方案请联系技术支持人员。
提示:平台默认 的镜像仓库(部署 global 时配置的 平台部署 镜像仓库)中存储了集群所需的平台组件镜像,若无特殊要求,接入集群时选择 平台默认 的镜像仓库即可。
若当前集群的节点无法访问 平台默认 的镜像仓库,请参考 业务集群无法访问平台默认镜像仓库,如何处理?
-
若接入集群的运行时组件为 Containerd,您需要在接入集群前 修改 Containerd 配置信息 ,以确保分布式存储部署成功。
获取镜像仓库地址
-
若需使用部署 global 集群时 平台部署 的镜像仓库,在 global 集群的控制节点 上执行如下命令获取地址:
if [ "$(kubectl get productbase -o jsonpath='{.items[].spec.registry.preferPlatformURL}')" = 'false' ]; then REGISTRY=$(kubectl get cm -n kube-public global-info -o jsonpath='{.data.registryAddress}') else REGISTRY=$(kubectl get cm -n kube-public global-info -o jsonpath='{.data.platformURL}' | awk -F \// '{print $NF}') fi echo "镜像仓库地址是:$REGISTRY"
-
若需使用 外部镜像仓库 ,请手动设置 REGISTRY 变量。
REGISTRY=<外部镜像仓库地址> # 合法的例子如:registry.example.cn:60080 或 192.168.134.43 echo "镜像仓库地址是:$REGISTRY"
判断镜像仓库是否需要额外配置
-
执行如下命令,判断指定的镜像仓库是否支持 HTTPS 访问,且使用受信任的 CA 认证机构颁发的证书:
REGISTRY=<“获取镜像仓库地址”一节中获得的镜像仓库地址> if curl -s -o /dev/null --retry 5 --retry-delay 10 -- "https://${REGISTRY}/v2/"; then echo '检测通过:镜像仓库使用的是受信任的 CA 认证机构颁发的证书。不必执行“信任非安全镜像仓库”一节的内容。' else echo '检测未通过:镜像仓库不支持 HTTPS,或证书不受信任。请参考“信任非安全镜像仓库”一节进行配置。' fi
(可选)信任非安全镜像仓库
注意:若上一步的检测通过,请跳过本小节。
根据您所使用的容器运行时,配置镜像仓库信任的步骤也有不同。文档支持 docker 和 containerd 两种容器进行时。
Docker 运行时
操作步骤
-
在被接入集群的 所有节点 上分别执行以下命令:
- 备份 docker 配置文件。
mkdir -p '/var/backup-docker-confs/' if ! [ -f /etc/docker/daemon.json ]; then echo '找不到 docker 配置文件,请检查 docker 是否正确安装。如果仍然不能排障,可申请技术支持。' exit 1 else cp /etc/docker/daemon.json "/var/backup-docker-confs/daemon.json_$(date -u +%F_%R)" fi
- 修改
/etc/docker/daemon.json
文件。
确保文件中存在
insecure-registries
参数,并添加第一步中获取的 镜像仓库地址。 以配置多个镜像地址的场景为例,参考配置如下:{ "insecure-registries": [ "<镜像仓库地址>", "192.168.134.43" ], "registry-mirrors": ["https://6telrzl8.mirror.aliyuncs.com"], "log-opts": { "max-size": "100m", "max-file": "2" }, "live-restore": true, "metrics-addr": "0.0.0.0:9323", "experimental": true, "storage-driver": "overlay2" }
-
(可选)使用 jq 命令检查 Docker 配置文件语法。
提示:请确保主机上已安装 jq,可参考命令:
yum install jq -y
。jq . < /etc/docker/daemon.json
-
重启所有节点 Docker 服务。
systemctl daemon-reload systemctl restart docker
Containerd 非安全镜像仓库配置
注意:
-
目前所有需要使用镜像的主机节点和后续新增的主机节点,都需修改配置并重启 Containerd 服务。
-
Containerd v1.4、v1.5、v1.6 版本修改非安全镜像仓库配置方法略有不同,请根据实际版本进行配置。
-
在被接入集群的 所有节点 上分别执行以下命令:
- 备份配置文件
mkdir -p '/var/backup-containerd-confs/' if ! [ -f /etc/containerd/config.toml ]; then echo '找不到 containerd 配置文件,请检查 containerd 是否正确安装。如果仍然不能排障,可申请技术支持。' exit 1 else cp /etc/containerd/config.toml /var/backup-containerd-confs/config.toml_$(date +%F_%T) fi
- 获取 Containerd 容器运行时版本
# 获取环境上 containerd 的版本 # 请比较该版本号是否小于 v1.6,并在接下来的文档中选择合适的步骤操作 ctr --version | grep -Eo 'v[0-9]+\.[0-9]+\.[0-9]+'
Containerd v1.4 v1.5 非安全镜像仓库配置
-
在被接入集群的 所有节点 上分别执行以下命令:
- 修改
/etc/containerd/config.toml
配置文件
# 以下为需要添加到配置文件中的内容示例 # 方括号括起来的行称为节点,在添加以下内容到配置文件时,请注意检查配置文件中是否有同名的节点 # 若已经存在同名的节点,请将节点下的内容进行合并 [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] # 该配置下写多个仓库地址的endpoint [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<镜像仓库地址>"] endpoint = ["https://<镜像仓库地址>", "http://<镜像仓库地址>"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.134.43"] endpoint = ["https://192.168.134.43", "http://192.168.134.43"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."<镜像仓库地址>".tls] insecure_skip_verify = true [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.134.43".tls] insecure_skip_verify = true
- 重启 Containerd 服务。
systemctl restart containerd
- 修改
Containerd v1.6 非安全镜像仓库配置
-
在被接入集群的 所有节点 上分别执行以下命令:
- 判断配置文件中是否存在
config_path
字段。
if ! grep -qF 'config_path' /etc/containerd/config.toml; then if grep -qE '\[plugins."io.containerd.grpc.v1.cri".registry.(mirrors|configs)(\.|\])' /etc/containerconfig.toml; then echo '请按照“Containerd v1.4 v1.5 非安全镜像仓库配置”一节的说明操作。' else cat >> /etc/containerd/config.toml << 'EOF' [plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d/" EOF fi fi config_path_var=$(grep -F '/etc/containerd/certs.d' /etc/containerd/config.toml) if [ -z "$config_path_var" ]; then echo '配置文件中 config_path 字段的值不合预期,请检查!' exit 1 fi
- 创建
hosts.toml
文件。
如果上一步执行的命令提示
请按照“Containerd v1.4 v1.5 非安全镜像仓库配置”一节的说明操作。
请参考 Containerd v1.4 v1.5 非安全镜像仓库配置 一节。REGISTRY=<“获取镜像仓库地址”一节中获得的镜像仓库地址> mkdir -p "/etc/containerd/certs.d/$REGISTRY/" cat > "/etc/containerd/certs.d/$REGISTRY/hosts.toml" << EOF server = "$REGISTRY" [host."http://$REGISTRY"] capabilities = ["pull", "resolve", "push"] skip_verify = true [host."https://$REGISTRY"] capabilities = ["pull", "resolve", "push"] skip_verify = true EOF
- 重启 Containerd 服务。
systemctl restart containerd
- 判断配置文件中是否存在
获取集群信息
提示:以下两种方式选择其一即可。
方法一:(推荐)获取集群的 KubeConfig 文件
集群的 KubeConfig 文件中包含了访问集群所需的配置信息,例如:集群地址、CA 证书、认证信息等。
根据实际的网络情况和集群配置,将集群控制节点上的 .kube/config
文件拷贝至本地,准备在平台图形化界面中解析该文件,可参考 scp 命令:
scp -r root@<集群控制节点 IP>:.kube/config <本地地址>
方法二:获取集群令牌、访问地址、CA 证书
-
登录集群的控制节点。
-
若 Kubernetes 版本低于 1.24,请执行以下命令行生成并获取具有管理员权限的令牌。
echo " apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: cls-access --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cls-access roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount namespace: default name: cls-access " | kubectl apply -f - && \ kubectl describe secret \ -n default $(kubectl describe sa cls-access -n default \ |grep Tokens: |awk '{print $2}') |grep token:
-
若 Kubernetes 版本大于等于 1.24,请执行以下命令行生成并获取具有管理员权限的令牌。
echo " apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: cls-access --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cls-access roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount namespace: default name: cls-access " | kubectl apply -f - && \ kubectl create token cls-access --namespace default --duration 3650h
-
-
输出示例如下图所示。
-
执行以下命令行,获取集群的访问地址和 CA 证书(需经过 Base64 解码)。
# 查看集群的访问地址(server) cat .kube/config # 获取经过 Base64 解码后的 CA 证书 cat .kube/config | grep certificate-authority-data | awk '{print $NF}' | base64 -d
接入集群
-
在左侧导航栏中,单击 集群管理 > 集群。
-
单击 接入集群。
-
参照以下说明,配置相关参数。
参数 说明 镜像仓库 存储集群所需平台组件镜像的仓库。
- 平台默认:部署 global 时配置的 平台部署 镜像仓库。
- 外部:提前搭建的外部镜像仓库。需输入访问镜像仓库的 私有镜像仓库地址、端口、用户名、密码。集群信息 提示:可手动填写或上传 KubeConfig 文件由平台自动解析并填写。
解析 KubeConfig 文件:上传已获取的 KubeConfig 文件后,平台会自动解析并填写 集群信息,您可修改自动填写的信息。
集群地址:集群对外暴露 API Server 的访问地址,用于平台访问集群的 API Server。
CA 证书:集群的 CA 证书。
注意:手动输入时,需输入经过 Base64 解码的证书。
认证方式:访问集群的认证方式,需要使用具备 集群管理权限 的 令牌(Token)或 证书认证(客户端证书及秘钥) 进行认证。 -
单击 检查连通性 以检查与接入集群的网络连通性并自动识别接入集群的类型,集群类型将以表单右上角角标的形式展现。
-
连通性检查通过后,单击 接入,并确认。
提示:
- 单击处于 接入中 状态的集群右侧的
图标,可在弹出的 执行进度 对话框中,查看集群的执行进度(status.conditions)。
- 集群接入成功后,在集群列表可查看集群的关键信息,集群的状态显示为正常,并可执行集群相关操作。
- 单击处于 接入中 状态的集群右侧的
后续操作
部署插件
集群接入成功后,您可前往 插件管理 选择为集群部署必须的插件,包括监控组件、日志采集组件、日志存储组件等。
配置集群审计功能
集群接入成功后,需要修改集群上审计相关的配置,才能通过平台正常采集集群的审计数据。具体操作请参考 如何配置接入平台的标准 Kubernetes 集群的审计功能? 。
启用 Pod Debug 功能
集群接入成功后,如需使用 Pod Debug 功能,请参考 如何在接入集群中启用 Pod Debug 功能? 。
纳管集群下命名空间
集群接入成功后,您可通过基于集群 创建项目 ,或通过 添加项目关联集群 的方式将集群添加至已有项目,可将新接入的集群关联至项目。
进而,通过 导入命名空间 操作,将集群下已有的 Kubernetes 命名空间纳入到平台的项目下进行管理。
常见问题
接入集群后添加节点按钮置灰,如何添加节点?
托管版 Kubernetes 集群 和 非托管版 Kubernetes 集群 都不支持在平台界面添加节点,请于后台添加或联系集群供应商添加。
接入集群的证书管理功能支持哪些证书?
-
Kubernetes 证书:所有接入集群仅支持在平台证书管理界面查看 APIServer 证书信息,不支持查看其他 Kubernetes 证书且不支持自动轮换。
-
平台组件证书:所有接入集群可在平台证书管理界面查看平台组件证书信息且支持自动轮换。
哪些功能不支持接入的 Kubernetes 集群?
-
托管版 Kubernetes 集群 不支持获取审计数据。
-
托管版 Kubernetes 集群 不支持 ETCD、Scheduler、Controller Manager 相关监控信息,支持 APIServer 部分监控图表。
-
托管版 Kubernetes 集群 和 非托管版 Kubernetes 集群 不支持获取除 Kubernetes APIServer 证书外的集群证书相关信息。
如何解决接入集群的运行时组件为 Containerd 时,部署分布式存储失败的问题?
当接入集群的运行时组件为 Containerd 时,部署分布式存储将会失败。为解决该问题,您需要在集群的 所有节点 上手动修改 Containerd 配置信息,并重启 Containerd。
说明:若您在部署分布式存储前执行下述步骤修改 Containerd 配置,则无需执行步骤四。
-
登录集群节点,编辑
/etc/systemd/system/containerd.service
文件,将LimitNOFILE
参数值修改为1048576
。 -
执行命令
systemctl daemon-reload
重新加载配置。 -
执行命令
systemctl restart containerd
重启 Containerd。 -
在集群控制节点执行命令
kubectl delete pod --all -n rook-ceph
,重启 rook-ceph 命名空间内的所有 Pod,以使配置生效。