
# 通过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连接集群联邦，需要先[开通集群联邦](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0018.html)，并保证集群联邦已开启且状态正常。
- 当前仅支持从VPC中的客户端通过kubectl连接集群联邦，如您在VPC中没有客户端机器，请创建一台。
- 已下载kubectl命令行工具并上传至客户端机器。kubectl下载地址请参见[Kubernetes 版本发布页面](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/README.md)。
- 确保至少具有"iam:clustergroups:get"自定义策略。
 
#### 通过kubectl连接集群联邦
1. 登录[UCS控制台](https://console.huaweicloud.com/ucs/?#/aether/dashboard)，单击目标容器舰队名进入"容器舰队信息"页面，在"舰队基本信息"中单击"kubectl"。
   
   图1kubectl连接信息   
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001875985592.png "点击放大")
   
   
2. 参照页面中的提示信息，选择对应的项目名称、虚拟私有云(VPC)、控制节点子网以及有效期，单击"下载"，下载kubectl配置文件。 
   下载下来的文件名为"舰队名_kubeconfig.json"。
   图2kubectl连接联邦实例   
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001875829308.png "点击放大")
   ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/notice_3.0-zh-cn.png)
   - 舰队名_kubeconfig.json文件中存在安全泄露风险，请您务必妥善保存。
   
   - kubectl配置文件有效期可根据实际需求选择，下拉列表内可选范围为：5年、1年、6个月、30天、15天、14天、13天...1天，最短为1天。
    
   
   
3. 在执行机上安装和配置kubectl。 
   1. 拷贝kubectl及其配置文件到上述所选的vpc和子网下的执行机的/home目录下。
   
   2. 登录到您的执行机，配置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资源进行该操作。
 表1集群联邦支持的资源及操作 
| 组/版本                                | 资源                              | GET | LIST | WATCH | CREATE | UPDATE | PATCH | DELETE |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| core/v1                             | pods                            | √   | √    | √     | √      | √      | √     | √      |
| core/v1                             | pods/log                        | √   | -    | -     | -      | -      | -     | -      |
| core/v1                             | pods/exec                       | √   | -    | -     | √      | -      | -     | -      |
| core/v1                             | pods/status                     | √   | -    | -     | -      | -      | -     | -      |
| core/v1                             | configmaps                      | √   | √    | √     | √      | √      | √     | √      |
| core/v1                             | secrets                         | √   | √    | √     | √      | √      | √     | √      |
| core/v1                             | services                        | √   | √    | √     | √      | √      | √     | √      |
| core/v1                             | nodes                           | √   | √    | √     | -      | √      | √     | -      |
| core/v1                             | namespaces                      | √   | √    | √     | √      | √      | √     | √      |
| core/v1                             | endpoints                       | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | events                          | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | limitranges                     | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | resourcequotas                  | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | persistentvolumeclaims          | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | persistentvolumes               | √   | √    | -     | -      | -      | -     | -      |
| core/v1                             | serviceaccounts                 | √   | √    | -     | -      | -      | -     | -      |
| admissionregistration.k8s.io/v1     | mutatingwebhookconfigurations   | √   | √    | -     | -      | -      | -     | -      |
| admissionregistration.k8s.io/v1     | validatingwebhookconfigurations | √   | √    | -     | -      | -      | -     | -      |
| apiextensions.k8s.io/v1             | customresourcedefinitions       | √   | √    | √     | √      | √      | √     | √      |
| apiregistration.k8s.io/v1           | apiservices                     | √   | √    | -     | -      | -      | -     | -      |
| apps/v1                             | deployments                     | √   | √    | √     | √      | √      | √     | √      |
| apps/v1                             | deployments/scale               | √   | -    | -     | -      | √      | -     | -      |
| apps/v1                             | deployments/status              | √   | -    | -     | -      | -      | -     | -      |
| apps/v1                             | daemonsets                      | √   | √    | √     | √      | √      | √     | √      |
| apps/v1                             | daemonsets/status               | √   | -    | -     | -      | -      | -     | -      |
| apps/v1                             | statefulsets                    | √   | √    | √     | √      | √      | √     | √      |
| apps/v1                             | statefulsets/status             | √   | -    | -     | -      | -      | -     | -      |
| apps/v1                             | replicasets                     | √   | √    | -     | -      | -      | -     | -      |
| autoscaling/(v1、v2、v2beta1、v2beta2) | horizontalpodautoscalers        | √   | √    | √     | √      | √      | √     | √      |
| batch/v1                            | jobs                            | √   | √    | √     | √      | √      | √     | √      |
| batch/v1                            | jobs/status                     | √   | -    | -     | -      | -      | -     | -      |
| batch/v1                            | cronjobs                        | √   | √    | √     | √      | √      | √     | √      |
| batch/v1                            | cronjobs/status                 | √   | -    | -     | -      | -      | -     | -      |
| discovery.k8s.io/v1                 | endpointslices                  | √   | √    | -     | -      | -      | -     | -      |
| events.k8s.io/v1                    | events                          | √   | √    | -     | -      | -      | -     | -      |
| networking.k8s.io/v1                | ingresses                       | √   | √    | √     | √      | 部分支持   | 部分支持  | √      |
| networking.k8s.io/v1                | ingressclasses                  | √   | √    | -     | -      | -      | -     | -      |
| networking.k8s.io/v1                | networkpolicies                 | √   | √    | -     | -      | -      | -     | -      |
| policy/(v1、v1beta1)                 | poddisruptionbudgets            | √   | √    | √     | √      | √      | √     | √      |
| rbac.authorization.k8s.io/v1        | clusterrolebindings             | √   | √    | √     | √      | √      | √     | √      |
| rbac.authorization.k8s.io/v1        | clusterroles                    | √   | √    | √     | √      | √      | √     | √      |
| rbac.authorization.k8s.io/v1        | rolebindings                    | √   | √    | √     | √      | √      | √     | √      |
| rbac.authorization.k8s.io/v1        | roles                           | √   | √    | √     | √      | √      | √     | √      |
| storage.k8s.io/v1                   | storageclasses                  | √   | √    | -     | -      | -      | -     | -      |
   
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/caution_3.0-zh-cn.png)
- 对于集群中的自定义资源，在集群联邦中[注册](https://kubernetes.io/zh-cn/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)该CRD后，才可支持通过集群联邦入口进行操作。
- Ingress对象的UPDATE和PATCH操作仅支持集群联邦控制面中的资源，不支持成员集群中的资源。
 
#### 常见问题
- 如果您在访问联邦资源时出现如下错误提示，说明您没有对应资源的操作权限，请参考[集群联邦RBAC授权](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0321.html)添加授权。
  ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001750946636.png "点击放大")
  

- 如果您在访问联邦和集群内资源时出现错误提示"Precondition Required"，可能是由于网络问题或成员集群故障导致集群失联，请按以下步骤进行排查： ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001750934280.png "点击放大")
  1. 检查成员集群的工作状态与接入状态是否正常，具体操作可参考[附着集群接入失败如何解决？](https://support.huaweicloud.com/ucs_faq/ucs_faq_0010.html)。
  
  2. 检查成员集群内部署的proxy-agent是否正常工作，具体操作可参考[proxy-agent部署失败如何解决？](https://support.huaweicloud.com/ucs_faq/ucs_faq_0014.html)。
   

- 如果出现"no such host"问题，请按以下步骤进行排查： ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001669811881.png "点击放大")
  1. 查询vpcep节点是否存在，是否被误删，使用以下命令获取vpcep终端节点id：
     ```
     server=`cat config  | jq '.clusters[0].cluster.server'` echo ${server:15:36}
     ```
     
  
  2. 检查上述终端节点是否存在，如果存在，检查执行机是否和vpcep终端节点位于同一VPC中，二者之间网络是否连通。
   

- 如果出现"You must be logged in to the server (Unauthorized)"问题，请按以下步骤进行排查：
  ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001621611948.png "点击放大")
  1. 校验证书是否有误：
     将证书保存至临时文件中。
     ```
     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。
     ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
     若校验证书命令执行失败，提示没有jq，请检查节点是否安装jq命令行工具。
     
  
  2. 输入如下命令，检查证书公钥和私钥是否匹配：
     ```
     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
     ```
     
  
  3. 检查证书是否过期。
     首先保存证书到临时文件：
     ```
     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
     ```
     ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001670211709.png "点击放大")
     
    
 
