# 通过kubectl连接集群
kubectl是Kubernetes提供的一种命令行工具，它用于与Kubernetes集群进行交互，帮助用户管理集群中的资源、查看集群状态、部署应用程序、进行调试等操作。通过kubectl，您可以方便地在命令行界面上执行集群管理任务。如果客户端需要通过kubectl连接到CCE集群，可以选择两种访问方式：
- 内网访问：客户端通过内网IP或内网域名与集群的API Server进行通信，数据流量不会经过互联网，安全性更强。
- 公网访问：集群的API Server会暴露一个公共接口，客户端可以通过互联网访问Kubernetes集群。采用公网访问时，您可以选择是否开启"域名双向认证"，区别如下：
  - 不开启"域名双向认证"：kubectl与API Server采用单向证书验证的模式，安全性较低。该模式下，仅涉及kubectl对API Server证书的验证，不涉及API Server对kubectl证书的验证。
  
  - 开启"域名双向认证"：kubectl与API Server采用双向证书验证的模式，安全性较高。该模式下，除kubectl需要对API Server证书进行验证外，API Server也会对kubectl的证书（kubeconfig文件的client-certificate-data字段）进行验证。关于域名双向认证的更多说明，请参见[域名双向认证]。
   
 
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
- Autopilot集群版本范围为v1.27.7-r0、v1.28.5-r0及以上：支持"内网域名访问"、"内网IP访问"和"公网访问"。
- Autopilot集群版本范围为v1.27.7-r0、v1.28.5-r0以下：支持"内网访问"和"公网访问"，其中"内网访问"仅支持使用域名，不支持使用内网IP。
 
#### 基本原理
kubectl通过kubeconfig配置文件获取集群信息，从而与Kubernetes集群的API服务器进行通信。[kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)文件是kubectl访问Kubernetes集群的身份凭证，包含API Server地址、用户认证凭据和等配置信息。通过这些配置信息，kubectl能够实现与Kubernetes集群的交互，并执行各种管理任务。
图1kubectl连接集群   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002513593931.png "点击放大")
#### 前提条件
- 已有一台可访问公网的客户端计算机。
- 当您使用内网访问时，请确保客户端与待访问集群在同一VPC内。
- 当您使用公网访问时，请确保待访问集群已绑定公网地址。关于集群绑定公网地址的具体步骤，请参见[为API Server绑定EIP](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0864.html#cce_11_0864__zh-cn_topic_0000001835412770_section128889371044)。
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
  绑定公网集群的kube-apiserver将会暴露到互联网，存在被攻击的风险，建议为kube-apiserver的EIP配置DDoS高防服务。
  
 
#### 约束与限制
kubeconfig.json文件内包含用户信息，CCE根据用户信息的权限判断kubectl有权限访问哪些Kubernetes资源。即哪个用户获取的kubeconfig.json文件，kubeconfig.json就拥有哪个用户的信息，这样使用kubectl访问时就拥有这个用户的权限。
用户拥有的权限请参见[CCE Autopilot集群权限概述](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0187.html)。
#### 步骤一：下载kubectl
使用kubectl连接集群时，您需要先在客户端中安装kubectl。您可执行**kubectl version** 命令判断是否已安装kubectl，如果已经安装kubectl，则跳过此步骤。本文以Linux环境为例安装和配置kubectl命令行工具，详情请参考[安装kubectl](https://kubernetes.io/zh-cn/docs/tasks/tools/#kubectl)。
1. 登录到您的客户端计算机，执行以下命令，下载kubectl工具。其中，*v1.25.0* 为指定的版本号，请根据集群版本进行替换。
   
   ```
   cd /home
   curl -LO https://dl.k8s.io/release/v1.25.0/bin/linux/amd64/kubectl
   ```
   
   
2. 执行以下命令，安装kubectl。 
   ```
   chmod +x kubectl
   mv -f kubectl /usr/local/bin
   ```
   
   
3. 执行以下命令，检查kubectl是否安装成功。 
   ```
   kubectl version
   ```
   回显结果如下，则说明kubectl安装成功。
   ```
   Client Version: xxx
   Kustomize Version: xxx
   Server Version: xxx
   ```
   
   
 
 #### 步骤二：获取kubectl配置文件（kubeconfig）
从集群中获取kubeconfig文件，用于连接集群。
1. 集群"概览"页中的"连接信息"版块，单击kubectl后的"配置"按钮，查看kubectl的连接信息。 
   图2集群连接信息   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002527473817.png "点击放大")
   
   
2. 在弹出页面中选择"内网访问"或"公网访问"，复制对应的配置文件。
   
   - Autopilot集群版本范围为v1.27.7-r0、v1.28.5-r0及以上：支持"内网域名访问"、"内网IP访问"和"公网访问"。
   
   - Autopilot集群版本范围为v1.27.7-r0、v1.28.5-r0以下：支持"内网访问"和"公网访问"，其中"内网访问"仅支持使用域名，不支持使用内网IP。
   
   
   图3下载配置文件   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002481823360.png "点击放大")
   
   ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
   - kubectl配置文件（kubeconfig）用于对接认证集群，请您妥善保存该认证凭据，防止文件泄露后，集群有被攻击的风险。
   
   - IAM用户下载的配置文件所拥有的Kubernetes权限与CCE控制台上IAM用户所拥有的权限一致。
   
   - 如果Linux系统里面配置了KUBECONFIG环境变量，kubectl会优先加载KUBECONFIG环境变量，而不是$home/.kube/config，使用时请注意。
    
   
   
 
#### 步骤三：配置kubectl
将kubeconfig文件存放于客户端计算机指定路径下，kubectl工具将通过该配置文件访问集群，从而实现与CCE集群的交互。
1. 登录到您的客户端计算机。
2. 执行以下命令，创建kubeconfig.yaml文件，文件名支持自定义，用于存放[2]中获取的配置文件信息。
   
   ```
   vim kubeconfig.yaml
   ```
   在kubeconfig.yaml中粘贴[2]中获取的配置文件信息，并保存。
   
   
3. 执行以下命令，将kubeconfig.yaml放在"$HOME/.kube/config"路径下，kubectl将自动读取该文件信息。如果您将kubeconfig.yaml放在其他路径，则需要通过设置环境变量KUBECONFIG指定文件路径。 
   ```
   cd /home
   mkdir -p $HOME/.kube
   mv -f ~/kubeconfig.yaml $HOME/.kube/config  # 请将kubeconfig.yaml修改为对应的文件名称
   ```
   
   
4. 根据使用场景，切换kubectl的访问模式。 
   - VPC内网域名接入访问时，请执行以下命令：
     ```
     kubectl config use-context internal
     ```
     
   
   - VPC内网IP接入访问时，请执行以下命令：
     ```
     kubectl config use-context internalIP
     ```
     
   
   - 公网接入访问且无需开启域名双向认证时，请执行以下命令（集群需绑定公网地址）：
     ```
     kubectl config use-context external
     ```
     
   
   - 公网接入访问且需开启域名双向认证时，请执行以下命令（集群需绑定公网地址）：
     ```
     kubectl config use-context externalTLSVerify
     ```
     关于集群域名双向认证的具体说明，请参见[域名双向认证]。
     
   
   
   
   
5. 在客户端中执行以下命令，检查客户端能否通过kubectl连接集群。 
   ```
   kubectl cluster-info    # 查看集群信息
   ```
   若回显结果如下，则说明客户端能够通过kubectl连接集群。
   ```
   Kubernetes control plane is running at https://xx.xx.xx.xx:5443
   CoreDNS is running at https://xx.xx.xx.xx:5443/api/v1/namespaces/kube-system/services/coredns:dns/proxy
   To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
   ```
   
   
 
 #### 域名双向认证
域名双向认证一种双向身份验证机制，它确保通信双方（即客户端和服务器）都能够验证对方的身份。这种认证方式可以增强集群与客户端之间的安全性，防止未经授权的访问。
- 集群API Server绑定EIP后，使用kubectl连接集群时域名双向认证默认不开启，可通过**kubectl config use-context externalTLSVerify**命令切换到externalTLSVerify这个context开启使用。
- 集群绑定或解绑弹性IP时，集群服务端证书将同步签入最新的集群访问地址（包括集群绑定的弹性IP）。
- 异步同步集群通常耗时约5-10min，同步结果可以在操作记录中查看"同步证书"。
- 对于已绑定EIP的集群，如果在使用双向认证时出现认证不通过的情况（x509: certificate is valid），需要重新绑定EIP并重新下载kubeconfig.yaml。
- 早期未支持域名双向认证时，kubeconfig.yaml中包含"insecure-skip-tls-verify": true字段，如[图4]所示。如果需要使用双向认证，您可以重新下载kubeconfig.yaml文件并配置开启域名双向认证。
  图4未开启域名双向认证   
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002514143173.png "点击放大") 
 
#### 常见问题
- **Error from server Forbidden**
  使用kubectl在创建或查询Kubernetes资源时，显示如下内容：
  ```
  # kubectl get deploy Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default"
  ```
  原因是用户没有操作该Kubernetes资源的权限，请参见[命名空间权限（Kubernetes RBAC授权）](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0189.html)为用户授权。
  
- **The connection to the server localhost:8080 was refused**
  使用kubectl在创建或查询Kubernetes资源时，显示如下内容：
  ```
  The connection to the server localhost:8080 was refused - did you specify the right host or port?
  ```
  原因是由于该kubectl客户端未配置集群认证，请参见[步骤二：获取kubectl配置文件（kubeconfig）]进行配置。
  
 
#### 相关操作
- [通过kubectl对接多个集群](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00254.html)
- [通过配置kubeconfig文件实现集群权限精细化管理](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00221.html)
 
