文章目录
- 前言
- 常用命令
- 1、nsenter命令解决容器内部命令不足的问题
- 2、当pod一直处于CrashLoopBackOff状态查看日志的方法
- 3、查看、创建、更新、编辑、删除资源
- 4、节点增加污点(取消污点)
- 5、打标签以及查看标签
- 6、设置节点不可调度或者可调度
- 7、pod驱逐
- 8、查看集群组件健康状态
- 9、查看节点加入集群信息
- 10、查看当前集群状态
- 11、列出该 namespace 中的所有 pod 包括未初始化的
- 12、查看pod日志
- 12、查看pod变量
- 13、rollout命令
- 14、交互
- 15、在被删除的node节点清空集群信息
- 16、初始化master
- 17、在master上生成用于新master加入的证书
- 18、在master节点生产集群的token值及查看
- 19、添加master节点到集群
- 20、添加node节点到集群
- 21、创建初始化配置文件
- 22、使用patch命令快速更新deployment模板中的就绪和存活探针
- 23、使用cp命令拷贝容器jar包至宿主机
- 24、查看节点可分配资源
- 25、top命令
- 26、查看对应命名空间下所有pod的cpu、mem资源最大限制
- 27、etcd相关命令
- 28、证书相关命令
- 总结
前言
将平常维护集群时使用的命令做一个整理
提示:以下是本篇文章正文内容,下面案例可供参考
常用命令
1、nsenter命令解决容器内部命令不足的问题
为了尽可能地缩减镜像大小,常常不会包含一些常用的工具,类似ping、curl等。
在测试容器内部网络连通性的时候会很麻烦,因此采用nsenter命令在不进入容器内部的情况下一样也能使用这些基础工具
1、安装方法:
yum -y install util-linux
(2)源码安装:
$ cd /tmp;
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin
命令详情及参数:
格式:nsenter [options] [program [arguments]]
参数详情:options:-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录
如果没有给出program,则默认执行$SHELL。
nsenter使用方法:
一、第一步获取容器的PID和pod所在的node机器
kubectl describe pod k8s-buumox581e-955-1946-0 -owide| grep docker 获取containerID和对应的宿主机IP
二、使用nsenter进入命名空间
// 登录对应的node机器,根据获取到的id进入空间
[root@VM-4 ~]# nsenter -n -t23069
// 这个时候我们就已经有了容器内部的环境,就可以利用宿主的ping 等工具查看容器内的信息了
[root@VM-4 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.2 netmask 255.255.255.192 broadcast 10.0.0.63
ether 02:42:0a:00:00:02 txqueuelen 0 (Ethernet)
RX packets 86 bytes 7827 (7.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 194 bytes 18401 (17.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
三、退出(实际退出的是pod容器,不是退出宿主机,连续exit两次,才会退出宿主机)
[root@VM-4 ~]# exit
logout
2、当pod一直处于CrashLoopBackOff状态查看日志的方法
当pod一直处于crash状态时,使用kubectl logs 可能一直捕捉不到日志,因此 采用下面的命令:
kubectl logs pod-name --previous
因为kubelet会保持pod的前几个失败的容器,这个是查看日志的前提条件.
实现原理:
将pod的日志存放在/var/log/pods/podname,并且是链接文件,链接到docker容器的日志文件。
3、查看、创建、更新、编辑、删除资源
列出几个常用命令
kubectl get pods -A
kubectl get service web01 -o json #-o json 输出json格式
kubectl get pods web01-bbc5667-xb7cd -o yaml #-o yaml 输出yaml文件格式
kubectl get service web01 -o wide ##输出网络信息
kubectl describe pods xxxxpodsname -n xx #查看pod的详细信息
kubectl get events -n xx #查看xx命名空间下的时间
#通过文件创建
Kubectl create/apply -f xxx.yml #创建pod
#通过url创建资源
kubectl create -f https://git.io/vPieo
#创建带有终端的pod
kubectl run -i --tty busybox --image=busybox
#获取 pod 和 svc 的文档
kubectl explain pods,svc
#通过expose创建资源
kubectl expose rc nginx --port=80 --target-port=8000
#通过文件更新
Kubectl replace -f xx.yml --force #更新pod(前提是pod已存在,修改yml文件后执行)
#更新单容器 pod 的镜像版本(tag)到 v4
kubectl get pod nginx-pod -o yaml | sed 's/(image: myimage):.*$/\1:v4/' | kubectl replace -f -
#编辑
kubectl edit svc -n xx
# 删除 pod.json 文件中定义的类型和名称的 pod
kubectl delete -f ./pod.json
# 删除名为“baz”的 pod 和名为“foo”的 service
kubectl delete pod,service baz foo
# 根据标签删除
kubectl delete pods,services -l name=myLabel
# 删除集群中长期处于Terminating状态的pod
kubectl delete pod PODNAME --force --grace-period=0
4、节点增加污点(取消污点)
#增加污点
kubectl taint node node名 key=value:污点有以下三个可选值
NoSchedule : 一定不被调度
PreferNoSchedule : 尽量不被调度
NoExecute : 不会调度,并且还会驱逐Node已有Pod
#取消污点(注意可选值后一定要加-)
kubectl taint node node名 key=value:污点三个可选值-
5、打标签以及查看标签
kubectl label node node1 env-role=prod #打标签
kubectl get nodes --show-labels #查看标签
kubectl label pod pod名 app- #删除pod标签
6、设置节点不可调度或者可调度
kubectl cordon node名称 禁止调度
kubectl uncordon node名称 取消禁止调度
7、pod驱逐
kubectl drain nodename --delete-local-data --ignore-daemonsets --force
8、查看集群组件健康状态
kubectl get cs
9、查看节点加入集群信息
kubectl get csr
10、查看当前集群状态
# 将当前集群状态输出到 stdout
kubectl cluster-info dump
# 将当前集群状态输出到 /path/to/cluster-state
kubectl cluster-info dump --output-directory=/path/to/cluster-state
11、列出该 namespace 中的所有 pod 包括未初始化的
kubectl get pods --include-uninitialized
12、查看pod日志
# 查看某个容器实时日志
kubectl logs -f <Pod名称> -c 容器名
# 查看5min内的日志
kubectl logs <Pod名称> --since=5m pod名称
# 查看2024-01-01 11:00知后的日志,--since-time的值是UTC时间
kubectl logs <Pod名称> --since-time="2024-01-01T03:00:00Z"
# 链接到pod查看实时日志
kubectl attach <Pod名称>
# 若是容器之前崩溃过,通过下面命令查询前一次运行的日志
kubectl logs --previous <Pod名称>
12、查看pod变量
kubectl exec my-nginx-5j8ok -- printenv | grep SERVICE
13、rollout命令
#滚动更新资源
kubectl rollout restart deployment deployment-name
#更新镜像并记录
kubectl set image deploy nginx nginx=新的镜像版本 --record
#回滚资源到上一个版本
kubectl rollout undo deployment/python-v1
#回滚到指定版本
kubectl rollout undo deploy nginx --to-revision=number(序号)
#查看变更进度
kubectl rollout status deploy deployment/mysql
#扩缩容操作
kubectl scale --replicas=2 deploy nginx
#暂停 多次进行版本或者资源cpu限制等修改
kubectl rollout pause deploy nginx
#恢复多次修改后的更新操作
kubectl rollout remuse deploy nginx
14、交互
# 交互式 shell 的方式运行 pod
kubectl run -i --tty busybox --image=busybox -- sh
# 连接到运行中的容器
kubectl attach nginx-pod -i
# 在已存在的容器中执行命令,不进入pod内(只有一个容器的情况下)
kubectl exec nginx-pod -- ls /
# 在已存在的容器中执行命令,不进入pod内(pod 中有多个容器的情况下)
kubectl exec nginx-pod -c my-container -- ls /
# 进入pod容器
kubectl exec -it -n default nginx01-67fdf8d7c7-stvwt /bin/bash
#解释器有以下几种:
/bin/bash、/bin/sh、bash、sh
15、在被删除的node节点清空集群信息
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
rm -rf /var/lib/etcd/*
16、初始化master
kubeadm init --apiserver-advertise-address=192.168.126.188 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
17、在master上生成用于新master加入的证书
kubeadm init phase upload-certs --upload-certs
或者
kubeadm init phase upload-certs --upload-certs --config=kubeadm-config.yaml
18、在master节点生产集群的token值及查看
kubeadm token create --print-join-command ####重新生成token
#查看token
kubeadm token list
19、添加master节点到集群
kubeadm join 20.78.200.190:16443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a5bffb8aacbd60a03925e4a4c1ff65bb07e25618edfc356842e2b458f446d980 \
--control-plane --certificate-key dee8bfe34fffcaabdf9c9602ba25100c6f77eae4294203672d2b3c77f1ea15e0
注意事项:
1、不要使用 --experimental-control-plane,会报错
2、要加上--control-plane --certificate-key,不然就会添加为node节点而不是master
3、join的时候节点上不要部署,如果部署了kubeadm reset后再join
20、添加node节点到集群
kubeadm join 192.168.111.188:6443 --token ao7eg1.dcy6pxgvceokei3n --discovery-token-ca-cert-hash sha256:d1bd1a52f18d2f4b117f4e37e008f9deac157f85ea43cc6eab085881e3d274eb
21、创建初始化配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
22、使用patch命令快速更新deployment模板中的就绪和存活探针
kubectl patch deployment -n cityos "$item" -p '{"spec": {"template": {"spec": {"containers": [{"name": "'"$item"'","livenessProbe": {"initialDelaySec
onds": 180}, "readinessProbe": {"initialDelaySeconds": 120}}]}}}}'
23、使用cp命令拷贝容器jar包至宿主机
kubectl cp -n 命名空间 pod名称:/容器中存放jar包的路径/jar包名称 宿主机存放路径/jar包名称
24、查看节点可分配资源
kubectl describe node pan | grep -i -A 5 allocatable
Allocatable:
cpu: 8
ephemeral-storage: 43462482668
hugepages-2Mi: 0
memory: 32658676Ki
pods: 110
25、top命令
#注意: 集群中配置了metric服务才能使用
kubectl top node/pod #查看节点或者pod资源,但是没有排序
kubectl top node/pod --sort-by=cpu/memory #按照cpu或者内存使用率排序
kubectl top node/pod --sort-by='.metadata.uid' #按照uid排序
26、查看对应命名空间下所有pod的cpu、mem资源最大限制
kubectl get pod -o custom-columns=NAME:metadata.name,CPU:.spec.containers[*].resources.limits.cpu,MEMORY:.spec.containers[*].resources.limits.memory
#如果要查看pod所需要的资源限制,将limits替换为requests
27、etcd相关命令
#备份
ETCDCTL_API=3 /usr/local/bin/etcdctl \
--endpoints="https://etcd-0.etcd.default.svc.cluster.local:2379,https://etcd-1.etcd.default.svc.cluster.local:2379,https://etcd-2.etcd.default.svc.cluster.local:2379" \
--cert="/etc/etcd/tls/etcd-client.crt" \
--key="/etc/etcd/tls/etcd-client.key" \
--cacert="/etc/etcd/tls/ca.crt" \
snapshot save /var/lib/etcd-backup/$(date "+%Y%m%d%H%M%S").db
#恢复
#注意事项:
1、恢复前先将etcd的原数据目录备份一份
2、停止master节点的三大组件(kube-api\schedule\control),并移除对应的静态yaml文件
docker stop xx xx xx
3、执行下方的恢复
ETCDCTL_API=3 /usr/local/bin/etcdctl \
--endpoints="https://etcd-0.etcd.default.svc.cluster.local:2379,https://etcd-1.etcd.default.svc.cluster.local:2379,https://etcd-2.etcd.default.svc.cluster.local:2379" \
--cert="/etc/etcd/tls/etcd-client.crt" \
--key="/etc/etcd/tls/etcd-client.key" \
--cacert="/etc/etcd/tls/ca.crt" \
--datadir="/var/lib/etcd"
snapshot restore /var/lib/etcd-backup/$(date "+%Y%m%d%H%M%S").db
4、启动第2步停止的组件,并恢复文件位置
5、重启etcd及kubelet组件
#查看etcd各个节点状态
etcdctl endpoint status
#查看etcd是否健康
etcdctl endpoint health
#列出etcd集群一共有几个节点 -w table 输出为表格式
etcdctl member list -w table
28、证书相关命令
#查看到期时间
1.19之前版本(不包含1.19)
kubeadm alpha certs check-expiration
1.19版本之后(包含1.19)
kubeadm certs check-expiration
#更新证书
kubeadm alpha certs renew all
总结
后续有新命令在随时更新