kubectl常用命令
kubectl命令大全
参考: kubectl实用技巧
Linux配置kubectl命令补全
所有主机上运行
参考: https://kubernetes.io/zh-cn/docs/reference/kubectl/cheatsheet/
参考 https://kubernetes.io/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/
# 安装bash-completion
## bash-completion-extras需要epelrepo源
yum install -y bash-completion bash-completion-extras
生产kubectl 自动补全规则并配置
# # 启用 bash 自动补全功能(加载系统预置的补全规则)
source /usr/share/bash-completion/bash_completion
# 临时生效kubectl自动补全
source <(kubectl completion bash)
## 持久化配置:只在当前用户生效kubectl自动补全
echo 'source <(kubectl completion bash)' >>~/.bashrc
## 持久化配置:将补全脚本生成命令写入全局配置文件(所有用户/会话生效)
echo 'source <(kubectl completion bash)' >/etc/profile.d/kubectl.sh && source /etc/profile.d/kubectl.sh
# 生成kubectl的自动补全脚本
kubectl completion bash >/etc/bash_completion.d/kubectl
配置kubeadm自动补全
# 配置kubeadm自动补全
source /usr/share/bash-completion/bash_completion
source <(kubeadm completion bash)
## 只对当前用户生效
echo 'source <(kubeadm completion bash)' >>~/.bashrc
## 全局生效
echo 'source <(kubeadm completion bash)' >>/etc/profile.d/kubeadm.sh && source /etc/profile.d/kubeadm.sh
# 生成kubeadm的自动补全脚本
kubeadm completion bash >/etc/bash_completion.d/kubeadm
windows配置kubectl命令补全
参考: https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-windows/
# Windows安装kubectl
choco install kubernetes-cli --version=${指定版本号} -y
choco install kubernetes-cli --version=1.28.1 -y
# Windows安装namespace切换工具和集群切换工具
choco install -y kubens kubectx
# 当前shell生效自动补全
kubectl completion powershell | Out-String | Invoke-Expression
# 写入到 $PROFILE 文件中
kubectl completion powershell >> $PROFILE
Windows配置kubectl edit默认编辑器为vscode
添加一个系统变量KUBE_EDITOR
,值设为code -w
# 添加系统变量
[Environment]::SetEnvironmentVariable("KUBE_EDITOR", "code -w", "Machine")
# 验证系统变量是否生效
$env:KUBE_EDITOR
查看kubectl配置
# 查看 kubectl 配置
kubectl config view
查看集群信息
# 查看集群kube-system内建服务列表
# 显示主控节点和服务的地址
kubectl cluster-info
# 查看集群事件
kubectl get events
# 查看集群组件状态
kubectl get cs
查看资源类型
官方文档: https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E%8B
kubectl api-resources --namespaced=true # 所有命名空间作用域的资源
kubectl api-resources --namespaced=false # 所有非命名空间作用域的资源
kubectl api-resources -o name # 用简单格式列举所有资源(仅显示资源名称)
kubectl api-resources -o wide # 用扩展格式列举所有资源(又称 "wide" 格式)
kubectl api-resources --verbs=list,get # 支持 "list" 和 "get" 请求动词的所有资源
kubectl api-resources --api-group=extensions # "extensions" API 组中的所有资源
# 查看kubectl命令行字段的简写
kubectl api-resources
## 查看services的缩写
[root@master ~]# kubectl api-resources|grep services
services svc v1 true Service
# 查看集群支持的所有API资源及api版本
kubectl api-resources -o wide
# 获取集群支持的所有 API 版本
kubectl api-versions
查看api接口版本
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
查询对应功能调用的接口
# 查询Deployment调用的接口
[root@master ~]# kubectl api-resources |grep deployment
deployments deploy apps/v1 true Deployment
# 查询所有Api接口对应的资源类型
kubectl api-resources
kubectl添加注解
--save-config
参数会添加注解,老版的注解--record=true
将被弃用.建议添加这个参数形成良好的习惯.
kubectl注解
将在查询变更时非常有效.
# --save-config 执行kubectl时添加注解.
kubectl edit | kubectl patch --save-config
老版本的注解(变化注解)
--record=true
会在升级记录中记录本条命令,建议使用新版注解参数--save-config
## 命令示例
kubectl set image deployment/应用名 -n 空间名 容器名=镜像名:版本号 --record=true
创建一个deployment
https://blog.youkuaiyun.com/omaidb/article/details/129527733
为deployment创建一个services
https://blog.youkuaiyun.com/omaidb/article/details/122112135
查看资源
# 查看pod
kubect get pods
# 查看deploy,rc,svc,node
kubectl get deploy,rc,svc,node
实时查看资源变化
k8s默认的故障转移时间
是5分钟
。
## -w, --watch: 持续监控 Pod 的状态变化
kubectl get pod -w
# 每0.1秒钟刷新一次pod状态
## -n 0.1 指定每0.1秒刷新一次
## -d 高亮显示变化
watch -n 0.1 -d "kubectl get po"
查看资源的labels(标签)
# 查看pod的标签
kubectl get pods --show-labels
# 查看指定serice选择的标签
kubectl get service tomcatdemo --show-labels
# 通过yaml方式查看service选择的标签
[root@master ~]# kubectl get service tomcatdemo -o yaml|grep -A 2 selector
selector:
app: tomcatdemo
sessionAffinity: None
查看资源对象的详细信息
定位问题
时经常使用
kubectl describe nodes <node-name>
kubectl describe pod <pod-name>
kubectl describe <rc-name>
指定标签查询资源
# 指定标签查询pod
## 查询ns=kube-system 标签: k8s-app=kube-dns的pod
kubectl get po -n kube-system -l k8s-app=kube-dns
## 同时显示资源的标签信息
kubectl get po -n kube-system -l k8s-app=kube-dns --show-labels
查看运行中资源的镜像
# 查看集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'
# 列举 default 名字空间中运行的所有镜像,按 Pod 分组
kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"
# 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="k8s.gcr.io/coredns:1.6.2")].image'
# 输出 metadata 下面的所有字段,无论 Pod 名字为何
kubectl get pods -A -o=custom-columns='DATA:metadata.*'
将资源端口转发到本地端口
参考: 使用端口转发来访问集群中的应用
# 将6000端口转发到本地的5000端口
## 默认是转发pod
kubectl port-forward my-pod 5000:6000
# 转发到本地的随机端口
kubectl port-forward pod/my-pod :6000
删除资源
强制删除资源
kubectl delete 资源类型 资源名 --force
删除terminating状态的namespace
# 删除terminating状态的namespace
kubectl get namespace "stucked-namespace" -o json \ | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \ | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
删除pod和service
# 删除在 pod.json 中指定的类型和名称的 Pod
kubectl delete -f ./pod.json
# 删除名称为 "baz" 和 "foo" 的 Pod 和服务
kubectl delete pod,service baz foo
# 删除包含 name=myLabel 标签的 pods 和服务
kubectl delete pods,services -l name=myLabel
# 删除在 my-ns 名字空间中全部的 Pods 和服务
kubectl -n my-ns delete pod,svc --all
# 删除所有与 pattern1 或 pattern2 awk 模式匹配的 Pods
kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
删除deployment
kubectl -n my-ns delete deployment.apps 应用名
删除污点
#添加 尽量不调度 PreferNoSchedule
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:PreferNoSchedule
#去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-
删除node节点
# 安全排空节点并执行维护操作(节点名需替换为实际值)
## --delete-emptydir-data:强制删除使用 emptyDir 卷的 Pod 的临时数据(高危操作)
## --force:允许驱逐无控制器管理的 Pod(如裸 Pod,可能导致数据丢失)
## --ignore-daemonsets:忽略 DaemonSet 管理的 Pod(否则命令会因 DaemonSet 存在而中止)
kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets
kubectl delete 资源类型 资源名称
# 删除名为test的pod
kubectl delete pods test
# 使用资源清单删除资源
kubectl delete -f 资源清单.yaml
# 删除所有包含某个标签的pod和service
kubectl delete pods,services –l name=<label-name>
# 删除所有的Pod
kubectl delete pods –all
标记节点为不可调度
参考: https://kubernetes.io/zh/docs/concepts/architecture/nodes/
# 标记指定的node为不可调度
kubectl cordon $NODENAME
# 取消指定node节点的不可调度
kubectl uncordon $NODENAME
# 查看所有节点的状态
kubectl get nodes
# 节点排水(驱逐节点上的所有pod)
# 忽略节点上不能杀死的特定系统Pod,例如:CNI插件,daemonSet
kubectl drain $NODENAME
查看资源的日志
# 查看pod日志
kubect logs pod名
# 持续pod中的容器日志
kubectl logs -f pod名 -c 容器名
查看服务账户的token
参考: https://blog.youkuaiyun.com/u010859650/article/details/89555413
# 查看token
kubectl -n 命名空间 get secrets
# 获取用户token方法1
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/ {print $1}')
# 获取用户token方法2
kubectl -n kube-system get secret $(kubectl -n kube-system get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
扩缩容
# 将副本数量调整为2个
kubectl scale deploy 应用名 --replicas=2
# 或者修改对应yamal文件中的replicas值,apply一下即可
滚动更新
# 滚动更新
kubectl set image deployments/应用名 容器名=镜像名:v镜像版本号