kubectl 命令行工具
Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。
文档
- kubectl 命令行工具
- kubectl-commands
- github
- docker 镜像 bitnami/kubectl
- 在 Windows 上安装 kubectl
在 k8s 集群的 Control Plane(Master) 节点上运行 kubectl
正常情况下 Control Plane(Master)节点 可以直接运行 kubectl
命令
- 个人建议仅在管理员直接操作集群时,才在 Control Plane(Master)节点上执行
- 流水线操作 k8s 时(比如:发布项目)参见下方: 在 GitLab Runner 流水线中运行 kubectl
时直接在 Control Plane(Master) 节点 上 运行
因为这样是直接操作 宿主机,此方式是不安全的,比如:
- 拥有流水线权限的人,如果在流水线中写了
rm -rf /
并运行了流水线,使宿主机文件被删除,导致宿主机数据丢失并宕机。如果是在容器内,将不会影响到宿主机的安全。
- 拥有流水线权限的人,如果在流水线中写了
流水线操作 k8s 时(比如:发布项目)参见下方: 在 GitLab Runner 流水线中运行 kubectl
在 k8s 集群的 Node 节点上运行 kubectl(不推荐)
方案1
- 将主节点的配置文件
/etc/kubernetes/admin.conf
复制到工作节点的$HOME/.kube/config
方案2
/etc/kubernetes/admin.conf
复制到磁盘的某个位置- 设置环境变量
KUBECONFIG
指向上述文件
在 Linux 中运行 kubectl
- 参见 阿里云 Kubernetes镜像
- 以 CentOS 为例
- 仅安装 kubectl(请使用与集群相同版本的 kubectl)即可
添加 k8s 仓库
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
cat /etc/yum.repos.d/kubernetes.repo
安装 kubectl
# 搜索 kubectl 可用版本
# yum --showduplicates list kubectl
# 安装 kubectl 指定版本,比如:1.27.3-0
# yum install -y kubectl-1.27.3-0
# 安装最新版本(可能不兼容)
yum install -y kubectl
启用 shell 自动补全功能
yum install -y bash-completion
source /etc/profile
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl
source ~/.bashrc
测试 kubectl
命令
[root@anolis ~]# kubectl get pod
E0823 11:17:35.888322 1630 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0823 11:17:35.889920 1630 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0823 11:17:35.890325 1630 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0823 11:17:35.896153 1630 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0823 11:17:35.896688 1630 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[root@anolis ~]#
剩余配置参见:
在 docker/k8s 中运行 kubectl
使用 bitnami/kubectl 镜像
剩余配置参见:在 k8s 集群的 Node 节点上运行 kubectl
在 Windows 中运行 kubectl
下载 Windows 可执行 kubectl
下载地址:https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubectl.exe
请注意,
将下载的可执行文件放在
C:\Windows
文件夹,或者加入环境变量
配置自动提示
高版本 Windows,如:22H2
- 在
C:\Users\%USERNAME%\Documents\WindowsPowerShell
文件夹下添加文件Microsoft.PowerShell_profile.ps1
或profile.ps1
,
- 在
低版本 Windows,如:1809
- 在
C:\Windows\System32\WindowsPowerShell\v1.0
或C:\Users\%USERNAME%\Documents\WindowsPowerShell
文件夹下添加文件profile.ps1
- 在
文件内容为
shellkubectl completion powershell | Out-String | Invoke-Expression
示例
重新打开
Windows PowerShell
,输入kubectl
,按Tab
键即可出现自动提示如果出现无法加载上述添加的文件,出现如下错误,解决办法是尝试运行
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
, 参见官方文档:about_Execution_Policies
配置文件
- 在当前用户文件夹下新建
.kube
文件夹,将 kubectl 配置文件放在.kube
文件夹下,名称修改为config
,注意:此文件没有后缀名 - 注意:如无法新建以
.
开头的文件夹,可以尝试使用命令mkdir .kube
创建文件夹 - 将 kubectl 配置内容放在
config
文件即可
打开 PowerShell
即可使用 kubectl
命令自动提示了
在单台机器使用单个配置文件快速控制多个 k8s 集群
kubectl 配置文件是 yaml
格式
配置示例
yamlapiVersion: v1 # 集群配置 clusters: # 单个集群配置 - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0 ... server: https://192.168.0.10:6443 name: kubernetes # 上下文配置 contexts: # 单个上下文配置 - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes # 当前使用的上下文配置 current-context: kubernetes-admin@kubernetes kind: Config preferences: { } # 用户配置 users: # 单个用户配置 - name: kubernetes-admin user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FU ... client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ ...
由上述 kubectl 配置文件示例可知,
集群配置
、上下文配置
、用户配置
均可以填写多个, 当前使用的配置是由current-context
(当前上下文) 控制的,所以可以将多个 k8s 集群的配置文件合并成一个, 并使用current-context
(当前上下文) 控制当前正在使用的 k8s 集群修改
current-context
(当前上下文) 的命令为shellkubectl config use-context 当前上下文名称 # 如果有必要,可以使用下列命令控制某个文件进行修改 current-context(当前上下文) # kubectl config use-context 当前上下文名称 --kubeconfig=文件名
多个 k8s 配置文件合并示例
yamlapiVersion: v1 # 集群配置 clusters: # 单个集群配置 - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0 ... server: https://192.168.0.10:6443 name: kubernetes # 单个集群配置 - cluster: certificate-authority-data: URBTkJna3Foa2lHOXcwQkFRc0Z ... server: https://192.168.0.20:6443 name: test-cluster # 上下文配置 contexts: # 单个上下文配置 - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes # 单个上下文配置 - context: cluster: test-cluster namespace: test-namespace user: test-user name: test-context # 当前使用的上下文配置 current-context: kubernetes-admin@kubernetes kind: Config preferences: { } # 用户配置 users: # 单个用户配置 - name: kubernetes-admin # 注意:用户凭证可能使用不同的形式 user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FU ... client-key-data: LS0tLS1CRUdJTiBSU0EgUFJ ... # 单个用户配置 - name: test-user # 注意:用户凭证可能使用不同的形式 user: token: eyJhbGciOiJSUzI1NiIsImt ...
获取当前的 Kubernetes 配置
shellkubectl config current-context
返回示例,如:
kubernetes-admin@kubernetes
或test-context
查看完整的配置信息
shellkubectl config view
返回示例,如:
yamlapiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.0.10:6443 name: kubernetes - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.0.20:6443 name: test-cluster contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes - context: cluster: test-cluster namespace: test-namespace user: test-user name: test-context current-context: kubernetes-admin@kubernetes kind: Config preferences: { } users: - name: kubernetes-admin user: client-certificate-data: DATA+OMITTED client-key-data: DATA+OMITTED - name: test-user user: token: REDACTED