kubernetes常用命令整理



前言

将平常维护集群时使用的命令做一个整理


提示:以下是本篇文章正文内容,下面案例可供参考

常用命令

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

总结

后续有新命令在随时更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值