文章

k8s常用命令

常用资源简写

资源类型 简写
Pod pod
Deployment deploy
Service svc
StatefulSet sts
DaemonSet ds
ReplicaSet rs
Namespace ns
Job job
CronJob cj
Secret secret
ConfigMap cm
PersistentVolume pv
PersistentVolumeClaim pvc
Ingress ing

常用命令

1. 获取状态

1
2
3
4
5
6
7
8
9
10
11
12
===============================================
kubectl get nodes  获取nodes状态
kubectl get pods --all-namespaces

===============================================
显示更详细的状态
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide 

===============================================
查看最新更新状态 
kubectl get pod -n kube-system -w 

2. 查看 pod 占用资源

1
2
查看 pod 占用资源   
kubectl -n prod top pod

3. 执行yaml文件

1
2
3
使用 yml 文件创建pod、deployment、services等服务 以及 删除
kubectl apply -f ***.yml
kubectl delete -f ***.yml

4. 查看nodes节点的标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
===============================================
查看nodes节点的标签
kubectl get nodes --show-labels
添加标签
    kubectl label nodes kube-node label_name=label_value
删除标签
    删除一个label,只需在命令行最后指定label的key名并与一个减号相连即可
    kubectl label nodes k8s-test01 gpu-

===============================================
修改标签
    修改一个label的值,需要加上--overwrite参数:
    kubectl label nodes k8s-test01 gpu=false --overwrite

5. 复制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
===============================================
复制pod内部的文件到宿主机
kubectl cp prod/abc-xxx-xxx:abc.txt /tmp/abc.txt
需要注意三点: 
1. kubectl cp 命名空间/容器名:文件名  冒号后面不能加 / 不然会一直报错
    tar: Removing leading '/' from member names
2. kubectl cp 命名空间/容器名:文件名 宿主机路径/文件名  文件名必须带,不然回报错: 
    tar: Removing leading '/' from member names
    error: open /tmp: is a directory
3. k8s复制的文件默认找的路径是: 进入容器服务内部的路径,不是 / 根目录
4. 在执行cp的时候 可能会遇到 复制出错
	1. 

===============================================
复制文件到pod或者出pod(pod内部有多个容器)
kubectl cp shovel.start.sh md/abc-xxx-xxx:tmp/ -c job

6. 删除pod

1
2
强制删除 Terminating(异常停止的pod)
kubectlmod -n prod delete pod abc-xxx-xxx --force --grace-period=0

7. 重置副本数

1
for i in $( kubectl -n <Namespace> get deployments.apps | awk '{print $1}' | grep -v NAME ); do kubectl -n <Namespace> scale --replicas=1 deployment $i ; done

8. 批量重启Deployment

1
2
3
4
5
6
1. 指定deployment重启
kubectl rollout restart deployment -n beta-nginx deploy-a deploy-b deploy-c

2. 若不指定deployment 则重启整个命名空间的
kubectl rollout restart deployment -n beta-net

9. 进入容器

1
2
3
多容器pod,进入指定容器
kubectl -n prod exec -ti atta-ai-iwork-feawfaw-fawefw -c celery bash

10. 导出yaml特殊情况

1
2
指定文件创建configmap,导出为yaml(如果已有同名cm,会进行增量,不是覆盖)
kubectl -n md create configmap shovel-entrypoint-test --from-file=script/ --dry-run=client -o yaml > cm-new.yaml

特殊使用

1.排错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pod启动失败
查看状态
kubectl get pod
查看详情
kubectl describe pod jenkins-deployment

重启pod
1.有yaml文件直接加载
kubectl replace --force -f jenkins-deployment.yml

2.没有yaml文件
kubectl get pod jenkins-deployment -n default -o yaml > /opt/kubernetes_save/jenkins-deployment.yml
kubectl replace --force -f jenkins-deployment.yml 

3.重新创建
kubectl get pod jenkins-deployment -n default -o yaml > /opt/kubernetes_save/jenkins-deployment.yml
kubectl delete pod jenkins-deployment
kubectl create -f jenkins-deployment.yml

2.添加/删除污点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
添加污点:
kubectl taint node master key1=value1:PreferNoSchedule

kubectl taint node [node] key=value[effect]   
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

查看污点:
kubectl describe node master

删除污点:
kubectl taint node master key1:PreferNoSchedule-

注: 只要在执行设置污点的地方后添加 "-",即可,使用原命令也可

3.证书

1
2
3
kubectl create secret tls nginx-ssl-secret -n dev --cert=6111646__cnabke.com.pem --key=6111646__cnabke.com.key
流程: 
192.168.1.2      192.168.4.5  a.cnabke.com  -> 192.168.4.5  192.168.1.2可以访问192.168.4.5 

4.节点(也是ROLES)标签

1
2
3
4
5
6
7
8
添加 "="
kubectl label nodes slave-01 node-role.kubernetes.io/Slave-01=

减少 "-"
kubectl label nodes slave-01 node-role.kubernetes.io/Slave-01-

综合命令
kubectl label nodes 节点名字 node-role.kubernetes.io/ROLES属性名称=或-

5. yaml文件加载 apply 和 create

1
2
3
4
5
6
7
区别:
kubectl create:
(1) kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的
(2) kubectl create命令,用同一个yaml 文件执行替换replace命令,将会不成功,fail掉。

kubectl apply:
kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性

6. k8s部署服务到集群中的指定节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
查看节点标签
 kubectl get  nodes --show-labels
将k8s-master也当作Node使用
kubectl taint node k8s-master node-role.kubernetes.io/master-

恢复master 不被调用: 其实是添加污点
kubectl taint node k8s-master node-role.kubernetes.io/master=""

#方法一: nodeSelector
前提设置其中一个节点的label: 自定义
kubectl label node k8s-master slave=184
展示节点label: 
    kubectl get nodes --show-labels
nodeSelector:
    slave: "184"
spec:
  replicas: 1
  selector:
    name: centos-master
  template:
    metadata:
      labels:
        name: centos-master
    spec:
      containers:
      - name: centos
        image: 10.10.30.180/library/centos7:v1
      nodeSelector:     #这是方法其一
        slave: "184"
    
#方法二: nodeName
    nodeName: private
spec:
  replicas: 1
  selector:
    name: centos-master
  template:
    metadata:
      labels:
        name: centos-master
    spec:
      containers:
      - name: centos
        image: 10.10.30.180/library/centos7:v1
      nodeName: private     #这是方法二

7. 自动伸缩

Pod 水平自动伸缩(HPA)

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hello-world
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
	scaleTargetRef:
	  apiVersion: extensions/v1beta1
	  kind: Deployment
	  name: hello-world
	targetCPUUtilizationPercentage: 50

8.命令回滚

1
2
3
4
5
# 更换镜像
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

#回滚更新
kubectl rollout undo deployments/kubernetes-bootcamp

9.滚动升级

1
2
3
4
5
6
7
spec:
  replicas: 3
  strategy:
    type: RollingUpdate   # 滚动更新
    rollingUpdate:
      maxSurge: 25%       # 一次可以添加多少个Pod
      maxUnavailable: 25% # 滚动更新期间最大多少个Pod不可用

10. 节点排水

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1. 设置节点不可调度
kubectl cordon 节点名称
[root@Node-002 atta-k8s-jupyterhub]# kubectl get node
NAME       STATUS                     ROLES                  AGE   VERSION
master     Ready                      control-plane,master   37h   v1.22.3
node-002   Ready                      <none>                 35h   v1.22.3
node-003   Ready,SchedulingDisabled   <none>                 35h   v1.22.3
2. 节点排水
kubectl drain 节点名称

报错:
kubectl drain ip-10-121-217-116.us-west-2.compute.internal
node/ip-10-121-217-116.us-west-2.compute.internal already cordoned
DEPRECATED WARNING: Aborting the drain command in a list of nodes will be deprecated in v1.23.
The new behavior will make the drain command go through all nodes even if one or more nodes failed during the drain.
For now, users can try such experience via: --ignore-errors
error: unable to drain node "ip-10-121-217-116.us-west-2.compute.internal", aborting command...

There are pending nodes to be drained:
 ip-10-121-217-116.us-west-2.compute.internal
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/aws-node-l2sp6, kube-system/eks-node-monitoring-agent-2ntpj, kube-system/eks-pod-identity-agent-fdlnc, kube-system/kube-proxy-d7c8j
cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-cfc868cfc-b8ndr, kube-system/metrics-server-cfc868cfc-vhvl2

原因: 
1. 由 DaemonSet 管理的 Pod 无法在排水操作中被删除
2. 使用了本地存储(例如,使用了 emptyDir 卷),这些 Pod 不能被删除

解决: 添加参数忽略: --ignore-daemonsets --delete-emptydir-data

> kubectl drain 节点名称 --ignore-daemonsets --delete-emptydir-data
最终: 这两种服务不会被清除


排水完毕之后,恢复可调度状态
kubectl uncordon 节点名称

11. pvc扩容

1
2
3
kubectl -n <namespace> patch pvc <PodName> -p '{"spec":{"resources":{"requests":{"storage":"5620Gi"}}}}'

## 5620Gi 是最终扩容的大小

12. 批量控制ksvc设置其值

1
2
3
4
5
6
7
8
9
10
# 修改副本数
kubectl patch ksvc aiserver-qc -n prod --type='json' -p='[{"op": "add", "path": "/spec/template/metadata/annotations/autoscaling.knative.dev~1minScale", "value": "1"}]'

## 批量修改 prod 所有 ksvc 服务 最小副本数为1
for i in $(kubectl get ksvc -n prod -o jsonpath='{.items[*].metadata.name}');do kubectl patch ksvc $i -n prod --type='json' -p='[{"op": "add", "path": "/spec/template/metadata/annotations/autoscaling.knative.dev~1minScale", "value": "1"}]' ;done


# 修改系统资源 $NAMESPACE $SERVICE
kubectl patch ksvc $SERVICE -n $NAMESPACE --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/resources/limits", "value": {"cpu": "100m", "memory": "128Mi"}},{"op": "add", "path": "/spec/template/metadata/annotations/autoscaling.knative.dev~1minScale", "value": "1"}]'

本文由作者按照 CC BY 4.0 进行授权