通过kubectl连接集群联邦
本文介绍如何使用kubectl连接集群联邦。
权限说明
kubectl访问集群联邦是通过集群联邦上生成的配置文件(kubeconfig.json)进行认证。kubeconfig.json文件内包含用户信息,UCS根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取kubeconfig.json文件,kubeconfig.json就拥有哪个用户的信息,这样使用kubectl访问时就拥有这个用户的权限。
约束限制
- 出于安全考虑,集群联邦apiserver不提供公网访问地址。UCS通过在您提供的VPC和子网中创建终端节点,并将该终端节点连接到集群联邦apiserver,来打通访问联邦的网络。对于每个集群联邦,UCS在同一VPC中仅会创建一个终端节点。如果VPC中已有连接该联邦apiserver的终端节点,则会进行复用。
- 当前仅支持“华北-北京四”区域的项目下载kubectl配置文件。
前提条件
- 使用kubectl连接集群联邦,需要先开通集群联邦,并保证集群联邦已开启且状态正常。
- 当前仅支持从VPC中的客户端通过kubectl连接集群联邦,如您在VPC中没有客户端机器,请创建一台。
- 已下载kubectl命令行工具并上传至客户端机器。kubectl下载地址请参见Kubernetes 版本发布页面。
- 确保至少具有“iam:clustergroups:get”自定义策略。
通过kubectl连接集群联邦
- 登录UCS控制台,单击目标容器舰队名进入“容器舰队信息”页面,在“舰队基本信息”中单击“kubectl”。 图1 kubectl连接信息
- 参照页面中的提示信息,选择对应的项目名称、虚拟私有云(VPC)、控制节点子网以及有效期,单击“下载”,下载kubectl配置文件。 下载下来的文件名为“舰队名_kubeconfig.json”。图2 kubectl连接联邦实例
- 舰队名_kubeconfig.json文件中存在安全泄露风险,请您务必妥善保存。
- kubectl配置文件有效期可根据实际需求选择,下拉列表内可选范围为:5年、1年、6个月、30天、15天、14天、13天...1天,最短为1天。
- 在执行机上安装和配置kubectl。
- 拷贝kubectl及其配置文件到上述所选的vpc和子网下的执行机的/home目录下。
- 登录到您的执行机,配置kubectl。
cd /home chmod +x kubectl mv -f kubectl /usr/local/bin mkdir -p $HOME/.kube mv -f 舰队名_kubeconfig.json $HOME/.kube/config --请根据实际舰队名修改命令中“舰队名”
集群联邦支持的资源及操作
集群联邦支持的Kubernetes资源及相关操作见表1。表内为“√”表明集群联邦支持对该Kubernetes资源进行该操作,表内为“部分支持”表明集群联邦部分支持对该Kubernetes资源进行该操作,表内为空则表明集群联邦不支持对该Kubernetes资源进行该操作。
| 组/版本 | 资源 | GET | LIST | WATCH | CREATE | UPDATE | PATCH | DELETE |
|---|---|---|---|---|---|---|---|---|
| core/v1 | pods | √ | √ | √ | √ | √ | √ | √ |
| pods/log | √ | - | - | - | - | - | - | |
| pods/exec | √ | - | - | √ | - | - | - | |
| pods/status | √ | - | - | - | - | - | - | |
| configmaps | √ | √ | √ | √ | √ | √ | √ | |
| secrets | √ | √ | √ | √ | √ | √ | √ | |
| services | √ | √ | √ | √ | √ | √ | √ | |
| nodes | √ | √ | √ | - | √ | √ | - | |
| namespaces | √ | √ | √ | √ | √ | √ | √ | |
| endpoints | √ | √ | - | - | - | - | - | |
| events | √ | √ | - | - | - | - | - | |
| limitranges | √ | √ | - | - | - | - | - | |
| resourcequotas | √ | √ | - | - | - | - | - | |
| persistentvolumeclaims | √ | √ | - | - | - | - | - | |
| persistentvolumes | √ | √ | - | - | - | - | - | |
| serviceaccounts | √ | √ | - | - | - | - | - | |
| admissionregistration.k8s.io/v1 | mutatingwebhookconfigurations | √ | √ | - | - | - | - | - |
| validatingwebhookconfigurations | √ | √ | - | - | - | - | - | |
| apiextensions.k8s.io/v1 | customresourcedefinitions | √ | √ | √ | √ | √ | √ | √ |
| apiregistration.k8s.io/v1 | apiservices | √ | √ | - | - | - | - | - |
| apps/v1 | deployments | √ | √ | √ | √ | √ | √ | √ |
| deployments/scale | √ | - | - | - | √ | - | - | |
| deployments/status | √ | - | - | - | - | - | - | |
| daemonsets | √ | √ | √ | √ | √ | √ | √ | |
| daemonsets/status | √ | - | - | - | - | - | - | |
| statefulsets | √ | √ | √ | √ | √ | √ | √ | |
| statefulsets/status | √ | - | - | - | - | - | - | |
| replicasets | √ | √ | - | - | - | - | - | |
| autoscaling/(v1、v2、v2beta1、v2beta2) | horizontalpodautoscalers | √ | √ | √ | √ | √ | √ | √ |
| batch/v1 | jobs | √ | √ | √ | √ | √ | √ | √ |
| jobs/status | √ | - | - | - | - | - | - | |
| cronjobs | √ | √ | √ | √ | √ | √ | √ | |
| cronjobs/status | √ | - | - | - | - | - | - | |
| discovery.k8s.io/v1 | endpointslices | √ | √ | - | - | - | - | - |
| events.k8s.io/v1 | events | √ | √ | - | - | - | - | - |
| networking.k8s.io/v1 | ingresses | √ | √ | √ | √ | 部分支持 | 部分支持 | √ |
| ingressclasses | √ | √ | - | - | - | - | - | |
| networkpolicies | √ | √ | - | - | - | - | - | |
| policy/(v1、v1beta1) | poddisruptionbudgets | √ | √ | √ | √ | √ | √ | √ |
| rbac.authorization.k8s.io/v1 | clusterrolebindings | √ | √ | √ | √ | √ | √ | √ |
| clusterroles | √ | √ | √ | √ | √ | √ | √ | |
| rolebindings | √ | √ | √ | √ | √ | √ | √ | |
| roles | √ | √ | √ | √ | √ | √ | √ | |
| storage.k8s.io/v1 | storageclasses | √ | √ | - | - | - | - | - |
- 对于集群中的自定义资源,在集群联邦中注册该CRD后,才可支持通过集群联邦入口进行操作。
- Ingress对象的UPDATE和PATCH操作仅支持集群联邦控制面中的资源,不支持成员集群中的资源。
常见问题
- 如果您在访问联邦资源时出现如下错误提示,说明您没有对应资源的操作权限,请参考集群联邦RBAC授权添加授权。

- 如果您在访问联邦和集群内资源时出现错误提示“Precondition Required”,可能是由于网络问题或成员集群故障导致集群失联,请按以下步骤进行排查:
- 检查成员集群的工作状态与接入状态是否正常,具体操作可参考附着集群接入失败如何解决?。
- 检查成员集群内部署的proxy-agent是否正常工作,具体操作可参考proxy-agent部署失败如何解决?。
- 如果出现“no such host”问题,请按以下步骤进行排查:
- 查询vpcep节点是否存在,是否被误删,使用以下命令获取vpcep终端节点id:
server=`cat config | jq '.clusters[0].cluster.server'` echo ${server:15:36} - 检查上述终端节点是否存在,如果存在,检查执行机是否和vpcep终端节点位于同一VPC中,二者之间网络是否连通。
- 查询vpcep节点是否存在,是否被误删,使用以下命令获取vpcep终端节点id:
- 如果出现“You must be logged in to the server (Unauthorized)”问题,请按以下步骤进行排查:
- 校验证书是否有误: 将证书保存至临时文件中。
cd ~/.kube cat config | jq '.clusters[0].cluster."certificate-authority-data"' | tr -d '"' | base64 -d > ca.crt cat config | jq '.users[0].user."client-certificate-data"' | tr -d '"' | base64 -d > tls.crt cat config | jq '.users[0].user."client-key-data"' | tr -d '"' | base64 -d > tls.key
进行校验。openssl verify -CAfile ca.crt tls.crt
如果输出"tls.crt: OK"说明CA无误,否则需要重新下载KubeConfig。
若校验证书命令执行失败,提示没有jq,请检查节点是否安装jq命令行工具。
- 输入如下命令,检查证书公钥和私钥是否匹配:
diff -eq <(openssl x509 -pubkey -noout -in tls.crt) <(openssl rsa -pubout -in tls.key)
如果输出"writing RSA key",说明证书公钥和私钥匹配,否则说明不匹配,需要重新下载KubeConfig,验证完成后请删除临时文件:rm -f ca.crt tls.crt tls.key
- 检查证书是否过期。 首先保存证书到临时文件:
cd ~/.kube cat config | jq '.users[0].user."client-certificate-data"' | tr -d '"' | base64 -d > tls.crt
查看证书有效期。openssl x509 -noout -text -in tls.crt | grep -E "Not Before|Not After"
会输出如下图所示的证书有效区间,请确认当前证书是否在有效期内,如果过期请重新下载KubeConfig,并删除临时文件。rm -f tls.crt

- 校验证书是否有误:

