通过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。
- 输入如下命令,检查证书公钥和私钥是否匹配:
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
- 校验证书是否有误: