「Kubernetes」- 安装并使用 kubectl 管理集群

  CREATED BY JENKINSBOT

问题描述

kubectl 是 Kubernetes 集群管理命令,用于管理 Kubernetes 集群,完成集群维护任务。在使用集群时,我们有很多能用的管理工具,但是深入的集群管理与问题排查还是需要使用 kubectl 命令,而非那些高级 Web 图形化界面。

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

解决方案

安装 kubectl 命令

关于版本选择

根据官网的说明,“kubelet 命令的次版本号”与“集群的次版本号”最大仅能差一。

比如 kubectl v1.2 能够正常操作版本 Kubernetes v1.1、v1.2、v1.3 的集群,以防止出现某些意料之外的情况。

第一步、安装命令

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

官方支持通过包管理器安装,但是它是 GOOGLE 源无法访问,我们使用阿里云镜像仓库:

# Debian / Ubuntu

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

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

apt-get update

# CentOS 7.4(如果使用阿里云镜像仓库)

cat <<EOF > /etc/yum.repos.d/kubernetes-ali.repo
[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 kubelet-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

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

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

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

第二步、调整配置

如果要访问集群,需要使用 kubeconfig 配置文件,该文件位于 ~/.kube/config(在集群主机上),是集群初始化时创建的(手动复制):

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

配置文件 ~/.kube/config 的格式如下(通常使用 kubectl config 命令修改,无需手动编辑):

# touch $HOME/.kube/config
apiVersion: v1
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}

################################################################################
# 配置集群
################################################################################
clusters:
- cluster:
    certificate-authority-data: <ca-data>
    server: https://10.10.50.90:6443
  name: kubernetes

################################################################################
# 配置用户
################################################################################
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <client-cert-data>
    client-key-data: <client-key-data>

################################################################################
# 配置上下文(要使用的用户及要访问的集群)
################################################################################
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes

第三步、验证命令

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

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

配置 BASH 自动补全

# 首先,需要安装 bash-complete 包,因为 kubectl 依赖于它。
apt-get install bash-completion # Debian
yum install bash-completion     # CentOS

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

# 或者,将脚本放入 /etc/bash_completion.d 中
kubectl completion bash > /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl

# 第一种方法,这样不用考虑 kubectl 升级的问题,它是动态加载的
# 第二种方法,在 kubectl 升级后,需要重新执行

常用命令

配置默认命名空间:

# 修改特定 Context 的默认命名空间
kubectl config set-context "foo-internal" --namespace=ggckad-s2

# 修改当前 Context 的默认命名空间
kubectl config set-context --current --namespace=namepsace_name

查看与删除 Pod 对象:

kubectl get pods -n "namespace"
kubectl delete pods "pod name"

# 强制删除命名空间内的全部 Pod 实例
kubectl delete --all pods --namespace=ingress-nginx --force --grace-period 0

删除资源定义:

kubectl delete -f foo.yaml

删除命名空间内所有 ConfigMap 定义:

kubectl delete configmaps $(kubectl -n default get configmaps --output=jsonpath="{range .items[*]}{.metadata.name}{' '}{end}")

导出命名空间中的 Deployment 定义:

kubectl get -n "namespace" deployment "deployment-name" -o yaml --export

查看 Deployment 信息:

kubectl get deployment kubernet-dashboard -n kube-system

修改 Deployment 镜像:

kubectl set -n "namespace" image "deployment/deploy-foo"  "deploy-foo"="image-name"

打开编辑器修改 Deployment 信息:

kubectl edit deployment/myapp-deployment --image=172.20.34.206:5000/myapp:img:3.0
kubectl edit deployment kubernet-dashboard -n kube-system
kubectl patch deployment "deployment-name" -p "{......}"

端口转发

端口转发通常用于测试或者调试,不会在生产中使用,因此这里仅简单介绍,能够满足需求即可。

// 转发 kubernetes-dashboard Service 的 443 端口
// 但是,默认监听 127.0.0.1 地址

# kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 30001:443
Forwarding from 127.0.0.1:30001 -> 8443
Forwarding from [::1]:30001 -> 8443

// 转发 kubernetes-dashboard Service 的 443 端口
// 并使其监听 0.0.0.0 地址

# kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard --address 0.0.0.0 30001:443
Forwarding from 0.0.0.0:30001 -> 8443

// 如果需要直接转发 Pod 的端口

kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017

相关链接

配置文件:
Configure Access to Multiple Clusters

命令手册:
Overview of kubectl
Kubernetes/Reference/kubectl

参考文献

Install and Set Up kubectl
Optional kubectl configurations/Introduction
使用kubectl delete pods xxx删除对应的pod,提示删除成功,但是立马又回生成一个。为何?
Get YAML for deployed Kubernetes services?
how to delete/remove calico cni from my kubernetes cluster
kubectl Port-Forward – Kubernetes Port Forwarding Guide
Command to delete all pods in all kubernetes namespaces – Stack Overflow
How to change default Namespace in Kubernetes | Edureka Community
kubectl Cheat Sheet | Kubernetes