「kubectl」- 管理集群 | 集群管理工具 | Control Kubernetes Clusters

认识

官网:https://kubernetes.io/docs/tasks/tools/#kubectl
文档:https://kubernetes.io/docs/reference/kubectl/
仓库:https://github.com/kubernetes/kubectl

kubectl 是 Kubernetes 集群管理命令,用于管理 Kubernetes 集群,完成集群维护任务。在使用集群时,我们有很多能用的管理工具。但是,深入的集群管理与问题排查还是需要使用 kubectl 命令,而非那些高级图形化平台。简而言之,kubectl,其为操作 Kubernetes 的命令行工具。

组成

配置文件

kubectl 在 $HOME/.kube/ 中查找名为 config 的文件,该文件被称为 kubeconfig 文件。

或,通过设置 KUBECONFIG 环境变量,或,通过设置 –kubeconfig 标志,来指定其他 kubeconfig 文件。

性质

kubectl apply vs. kubectl create

Kubectl Apply vs. Kubectl Create – What’s the Difference?

Imperative management means giving a series of instructions or steps to reach the goal. We specify what and how we should reach the goal.

This is where we tell K8S what to create, replace, delete, etc., using the API. Objects are created and managed using the kubectl command on the command line interface (CLI).

kubectl create — This is an imperative command.

简而言之,其更倾向于操作过程。

Declarative management is where we specify the required outcome, not the individual steps needed to achieve that outcome.

For each kind of resource specified in our YAML configuration files, a dedicated controller checks what we currently have and tries to converge it with what we want.

kubectl apply — This is a declarative command.

简而言之,其更倾向于期望结果。

kubectl patch | 修改 YAML 内容

templates – How to set dynamic values with Kubernetes yaml file – Stack Overflow
kubernetes – How can I edit a Deployment without modify the file manually? – Stack Overflow

envsubst | 需要预先在 YAML中定义 ${XXX} 变量

kubectl patch deployment myapp-deployment -p \
  '{"spec":{"template":{"spec":{"containers":[{"name":"myapp","image":"172.20.34.206:5000/myapp:img:3.0"}]}}}}'

kubectl replace | 替换对象

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_replace/

发布 Rollout 历史 History

kubectl rollout history deployment/<DEPLOYMENT_NAME> -n <NAMESPACE>
kubectl rollout history deployment/<DEPLOYMENT_NAME> –revision=<REVISION_NUMBER> -n <NAMESPACE>

查看资源使用 | top node | top pods

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_top/

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_top/kubectl_top_pod/

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_top/kubectl_top_node/

输出格式

WIP

Plugin | 扩展 kubectl 命令 | 安装 kubectl 插件

除了我们常用的 kubectl get、kubectl delete、kubectl describe 子命令之外,kubectl 还支持某些特殊的子命令。比如 kubectl cert-manager、kubectl ingress 等等特殊子命令,用于完成特定的集群维护任务。但是,这些子命令需要安装插件,然后才能够使用。比如 kubectl cert-manager 子命令,需要安装 kubectl-cert_manager 插件。该笔记将记录:在 Kubernetes 中,如何为 kubectl 安装插件,扩展 kubectl 命令的方法,相关问题的处理方法。

针对插件的开发:参考 Extend kubectl with plugins 插件,获取插件开发方法。

针对插件的安装:针对具体插件,其文档通常都会介绍自身的安装方法,所以我们不再详细介绍该方法。

插件的安装方法有两种:通过手动安装;通过 krew 安装;鉴于网络环境受限,很难说哪种插件管理方法更便捷。

Bash Completion | 提供 Bash 补全

参考 Tools Included 文档,以获取对于其他操作系统和 Shell 补全的方法;

for Linux

# 根据文档,kubectl 依赖于 bash-complete,所以要先安装该程序包;
yum install -y bash-completion     # CentOS
apt-get install bash-completion    # Debian

# 然后,启用 kubectl 补全
echo "source <($(which kubectl) completion bash)" >> ~/.bashrc
source ~/.bashrc

for Windows
Fix for PowerShell Script cannot be loaded because running scripts is disabled on this system error
Install and Set Up kubectl on Windows | Kubernetes

# PowerShell Run as Administrator

# 检查:$PROFILE C:\Users\<Username>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

# 添加配置
Set-ExecutionPolicy RemoteSigned
kubectl completion powershell >> $PROFILE

构建

—— 安装 kubectl 命令、安装命令

Install and Set Up kubectl

版本选择

根据官网文档,“kubelet 命令的次版本号”与“集群的次版本号”最大仅能差一。比如 kubectl v1.2 能够正常操作版本 Kubernetes v1.1、v1.2、v1.3 的集群,以防止出现某些意料之外的情况;

服务安装

Install Tools/kubectl | https://kubernetes.io/docs/tasks/tools/#kubectl

容器镜像 | https://hub.docker.com/r/bitnami/kubectl

docker.io/bitnami/kubectl:1.30
ccr.ccs.tencentyun.com/d3rm-3rd/docker.io_bitnami_kubectl:1.30

验证命令

# 验证配置
# 如果配置正确,命令将返回 URL 地址,例如:Kubernetes master is running at https://10.10.50.90:6443
kubectl cluster-info

# 如果服务器返回 URL 地址,但是拒绝连接,则使用下面的命令进行排查,以检查配置文件是否正确:
kubectl cluster-info dump

通过仓库安装,在部署时安装,……

注意事项,通常在集群部署时我们会完成 kubectl 命令的安装,因此很少独立安装。除非需要应对某些场景,比如远程管理集群;

但是其是 Google 源无法访问,我们使用阿里云镜像仓库:

# ----------------------------------------------------------------------------- # Debian/Ubuntu

# 尽管下载 apt-key.gpg 存在困难,但是应该尽量从官方站点下载(请勿随意使用第三方密钥)
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  FEEA9169307EA071 8B57C5C2836F4BEB B53DC80D13EDEF05

cat > /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt-get update && apt-cache madison kubectl

apt-get install kubectl=1.22.15-00

# ----------------------------------------------------------------------------- # CentOS 7.4

cat > /etc/yum.repos.d/kubernetes-ali.repo <<EOF
[kubernetes-ali]
name=Kubernetes ALi
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

yum install -y kubectl-1.16.2

通用安装方法

# ----------------------------------------------------------------------------- # 下载稳定版本

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl

# ----------------------------------------------------------------------------- # 下载特定版本

# curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl
# curl -LO https://dl.k8s.io/release/v1.21.0/bin/linux/amd64/kubectl
curl -LO https://dl.k8s.io/release/v1.24.14/bin/linux/amd64/kubectl

# 安装命令
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl

# 检查安装版本
kubectl version --client

针对其他平台,安装也是类似的,参考 Install Tools | Kubernetes 文档

kubernetes/CHANGELOG | https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
该仓库的 Changelog 包含相关资源的下载地址。在 Jenkins CI 中,我们需要 .tar.gz 来完成安装。

with asdf

asdf plugin-list-all | grep kubectl
asdf plugin-add kubectl

asdf list all kubectl

asdf install kubectl 1.30.8
asdf global  kubectl 1.30.8

应用

该笔记将记录:在 Linux 中,如何安装 kubectl 命令,以及常用命令、配置、使用方法,以及相关问题处理。

改进

WIP

参考

Install and Set Up kubectl
Overview of kubectl
Kubernetes/Reference/kubectl