k8s 日常维护命令简介

基础信息

1、查看客户端和服务器版本

如果 kubectl 客户端版本低于 k8s 服务端版本太多,使用 kubectl 管理 k8s 时可能会出现未知异常。如果升级了 k8s 版本记得也要更新下使用的 kubectl 版本。

[root@haiouc ~]# kubectl version -o=json | jq -r '{client:.clientVersion.gitVersion, server:.serverVersion.gitVersion}'
WARNING: version difference between client (1.25) and server (1.23) exceeds the supported minor version skew of +/-1
{
  "client": "v1.25.4",
  "server": "v1.23.5"
}

2、查看服务器可用的 api 资源

此命令列出了 kubectl 当前连接的k8s集群中所有可用的 api 资源(不同k8s集群可能由于集群版本不一样或存在用户自定义的api和资源从而会有所差别)。每个api资源代表了集群中的一种对象类型(如Pod、Service、Deployment等),从这里可以查看支持的api资源名称、简写(如果有)、是否是命名空间级别的资源等信息。

[root@haiouc ~]# kubectl api-resources |head
NAME                              SHORTNAMES              APIVERSION                                NAMESPACED   KIND
bindings                                                  v1                                        true         Binding
componentstatuses                 cs                      v1                                        false        ComponentStatus
configmaps                        cm                      v1                                        true         ConfigMap
endpoints                         ep                      v1                                        true         Endpoints
events                            ev                      v1                                        true         Event
limitranges                       limits                  v1                                        true         LimitRange
namespaces                        ns                      v1                                        false        Namespace
nodes                             no                      v1                                        false        Node
persistentvolumeclaims            pvc                     v1                                        true         PersistentVolumeClaim

如果 api 资源有简写,那么我们在操作资源时可以使用简写来代替提高效率。例如获取 configmaps 资源时可以用 kubectl get cm 来代替。同时由于 NAMESPACED 列显示为 true ,我们知道 configmaps 是命名空间级别资源,创建 configmaps 时需要指定命名空间,同一个命名空间中名称唯一并且仅在此命名空间内可用。

3、查看资源的帮助文档

通过该命令,可以查看特定资源对象的字段、属性、标签和其他相关信息,帮助用户了解资源对象的结构和可用选项。

[root@haiouc ~]# kubectl explain pods
[root@haiouc ~]# kubectl explain cm
[root@haiouc ~]# kubectl explain pods.spec.volumes.configMap

编写资源清单文件时候非常有用。

查看资源

1、查看指定命名空间下所有 pods 资源

# kubectl get pods -n kube-system |head -n 6

2、查看拥有指定标签的 pods 资源

如果 pod 有多个标签可以继续后面增加指定多个 -l 选项(-l k1=v1 -l k2=v2)

3、查看指定 pod 容器信息

查看指定 pod 内运行的容器名称及其镜像

[root@haiouc ~]# kubectl get pods rollouts-demo-684949c49d-8mzfc -n default -o jsonpath='{range .spec.containers[*]}{.name}{"\t"}{.image}{"\n"}{end}' |column -t
rollouts-demo  argoproj/rollouts-demo:yellow

4、查看指定 node 上运行的所有 pods 列表

先查看节点列表拿到节点名称,然后筛选字段。

# [root@haiouc ~]# kubectl get nodes

# [root@haiouc ~]# kubectl get pods -A --field-selector=spec.nodeName=k8s-med-worker-3
NAMESPACE         NAME                                                READY   STATUS    RESTARTS         AGE
directpv          node-server-26mk7                                   4/4     Running   8 (6d1h ago)     33d
jenkins           default-ctp5z                                       0/1     Error     0                41h
jenkins           default-drf2r                                       1/1     Running   0                70m
jenkins           default-ztghw                                       1/1     Running   0                65m
kube-system       canal-node-8ztp8                                    2/2     Running   21 (6d1h ago)    90d
kube-system       csi-cinder-nodeplugin-gwzv4                         3/3     Running   6 (6d1h ago)     33d
kube-system       kube-proxy-rbsrt                                    1/1     Running   125 (6d1h ago)   670d
kube-system  

5、查看 pod 的 uid

有时候需要到节点排查 pod 异常的时候 kubelet 日志中显示的是 uid 而不是 pod 名称,所以需要进行转换。

[root@haiouc ~]# kubectl get pod reboot-required-jtzn6  -o jsonpath='{.metadata.uid}' -n kube-system
bf516e3e-16be-4641-a7ad-a44f86b3d207

排查问题

1、查看 pod 中指定容器的日志

可以看查看 pod 中有哪些容器

# kubectl get pods kubernetes-proxy-7f99b6f49f-bfzk8 -o jsonpath='{range .spec.containers[*]}{.name}{"\t"}{.image}{"\n"}{end}' |column -t

如果不指定容器名则默认查看pod中第一个容器的日志。-c 选项指定要查看的容器名称,--tail 选项指定要输出最后多少行日志(默认从头打印所有日志),-f 选项指定保持一直监听日志输出。

# kubectl logs kubernetes-proxy-7f99b6f49f-bfzk8 -c kubernetes-proxy --tail=5 -f

2、在容器中执行命令

简单命令
# kubectl exec csi-provisioner-cfsplugin-0 -c cfs -n kube-system -- date

复杂命令(需要重定向、管道)
# kubectl exec csi-provisioner-cfsplugin-0 -c cfs -n kube-system -- /bin/sh -c 'echo "hello" >/tmp/test.txt'

进入到容器中交互式执行命令(这里指定进入 tcfs 容器中)
# kubectl exec csi-provisioner-cfsplugin-0 -c tcfs -it -n kube-system -- /bin/sh
/ # ls -lh /tmp/
total 0      
/ # exit

3、将文件和目录复制到容器或从容器复制文件和目录

将 kube-system 命名空间 csi-provisioner-cfsplugin-0 pod 中 cfs 容器的 test.txt 文件复制到本地主机。

# kubectl cp kube-system/csi-provisioner-cfsplugin-0:/tmp/test.txt  /root/test.txt -c cfs
# cat test.txt
hello

将本地主机中 test.txt 文件复制到 kube-system 命名空间 csi-provisioner-cfsplugin-0 pod 中 tcfs 容器。

# kubectl cp ./test.txt kube-system/csi-provisioner-cfsplugin-0:/tmp/test.txt -c tcfs
# kubectl exec csi-provisioner-cfsplugin-0 -c tcfs -n kube-system -- cat /tmp/test.txt 
hello

部署相关

1、基于清单文件创建及删除资源

# kubectl apply -f nginx.yaml 
deployment.apps/deploy-nginx-v1 created

# kubectl delete -f nginx.yaml 
deployment.apps "deploy-nginx-v1" deleted

2、更新 pod 模板中的镜像

# kubectl -n test set image deployment/deploy-nginx-v1 nginx=nginx:1.21.6
deployment.apps/deploy-nginx-v1 image updated

3、更新 pod 副本数

# kubectl -n test scale deployment deploy-nginx-v1 --replicas=2
deployment.apps/deploy-nginx-v1 scaled

4、重新部署资源

# kubectl -n test rollout restart deployment/deploy-nginx-v1
deployment.apps/deploy-nginx-v1 restarted

5、对比本地清单文件应用后和线上资源的差异

对比如果将本地清单文件 apply 后,和当前线上资源的差异。
# kubectl apply -f nginx.yaml 
deployment.apps/deploy-nginx-v1 created

# kubectl -n test diff -f nginx.yaml 

标签和污点

1、给节点添加及删除自定义标签

# kubectl label nodes 192.168.2.13 dylabel_node_namespace=uat
node/192.168.2.13 labeled


#删除标签(标签键后面跟-号)
# kubectl label nodes 192.168.2.13 dylabel_node_namespace-
node/192.168.2.13 labeled

如果要查看节点上拥有的所有标签,则使用 kubectl get nodes --show-labels 查看。

2、添加及删除污点

给节点添加名为 dylabel_node_namespace 的污点(不能容忍该污点的pod将不会调度到该节点)。
# kubectl taint nodes 192.168.2.13 dytaint_node_namespace=uat:NoSchedule
node/192.168.2.13 tainted

删除污点
# kubectl taint nodes 192.168.2.13 dytaint_node_namespace-
node/192.168.2.13 tainted
相关推荐
好像是个likun8 分钟前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
暴富的Tdy2 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
魏 无羡3 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0663 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
凌虚5 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
saynaihe5 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
G_whang6 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
ccubee8 小时前
docker 安装 ftp
运维·docker·容器
探索云原生8 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳8 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes