💎 K8s操作命令 - 图1

生命周期管理

1. 创建

1. 创建资源

  • kubectl run
    • 创建并运行一个或多个容器镜像。
    • 创建一个deployment或job来管理容器

      语法:kubectl run NAME —image=image [—env=”key=value”] [—port=port] [—replicas=replicas] [—dry-run=bool] [—overrides=inline-json] [—command] — [COMMAND] [args…]

  1. kubectl run nginx --replicas=3 --labels="app-nginx-example" --image=nginx:1.10 --port=80
  • kubectl create

    1. kubectl create deployment nginx --image=nginx
    2. # 根据yaml配置文件创建资源对象
    3. kubectl create -f zookeeper.yaml
    4. # 根据yaml配置文件一次创建Service和RC
    5. kubectl create -f my-service.yaml -f my-rc.yaml
    6. # 创建名称空间
    7. kubectl create namespace bigdata
  • kubectl apply

    1. kubectl apply deployment nginx --image=nginx
    2. # 使用yaml文件创建资源
    3. kubectl apply -f zookeeper.yaml

    2. 标签操作

  • 查询标签

    1. kubectl get nodes --show-labels
  • 添加标签

    1. # 为指定节点添加标签
    2. kubectl label nodes nodeName labelName=value
    3. # 为指定Pod添加标签
    4. kubectl label pod podName -n nsName labelName=value
  • 修改标签

    1. # 修改节点标签值
    2. kubectl label nodes nodeName
    3. # 修改Pod标签值(需要overwrite参数)
    4. kubectl label pod podName -n nsName labelName=value --overwrite
  • 删除标签

    1. # 为指定节点删除标签
    2. kubectl label nodes nodeName labelName-
    3. # 删除Pod标签
    4. kubectl label pod podName -n nsName labelName-

    2. 查看

    ```bash

    查看集群状态

    kubectl get cs

查看Pod

kubectl get pods kubectl get pod kubectl get po

查看指定名称Pod

kubectl get pod mynginx kubectl get pod/mynginx

同时查看多个资源

kubectl get deploy,pods

查看Pod端口信息

kubectl get pod,svc

特定命名空间资源查看

kubectl get pods -n bigdata

查看所有命名空间下的pod信息

kubectl get pod —all-namespaces kubectl get pods —A

获取Pod运行在哪个节点上的信息

kubectl get pod -o wide

显示Pod标签信息

kubectl get pods —show-labels

查看特定标签的Pod

kubectl get pods -l app=example

以JSON格式显示Pod的详细信息

kubectl get pod podName -o json

查看RS

kubectl get replicasets -o wide

查看Deployments

kubectl get deployments -o wide

查看ip和端口,也叫端点

kubectl get ep

查看事件

kubectl get ev

  1. - **yaml方式**
  2. ```bash
  3. # 以yaml格式显示Pod的详细信息
  4. kubectl get pod podName -o yaml
  5. kubectl get pod -f pod.yaml
  6. kubectl get pod -f pod1.yaml -f pod2.yaml
  7. # 用get生成yaml文件
  8. kubectl get deploy/nginx --export -o yaml > my-deploy2.yaml
  9. # 查看资源子节点详情
  10. kubectl explain pods.spec.containers
  11. # 用run命令生成yaml文件,dry-run尝试运行,但不会生成,可用于检查语法错误
  12. kubectl run nginx --image=nginx:latest --port=80 --replicas=3 --dry-run
  13. # 尝试运行,并生成yaml文件
  14. kubectl run nginx --image=nginx:latest --port=80 --replicas=3 --dry-run -o yaml > my-deploy.yaml

3. 发布

  1. # 暴露端口
  2. kubectl expose deployment nginx --port=80 --type=NodePort
  3. kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
  4. # 输出为yaml文件(推荐)
  5. kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
  6. kubectl expose deployment nginx -n bigdata --port=80 --type=NodePort

4. 故障排查

1. 资源详情排查

  1. # 显示Node的详细信息
  2. kubectl describe nodes nodeNamePrefix
  3. # 显示Pod的详细信息
  4. kubectl describe pods podNamePrefix
  5. # 显示由RC管理的Pod的信息
  6. kubectl describe pods rcNamePrefix

2. 资源日志排查

  1. # 容器日志查看
  2. kubectl logs zk-0
  3. kubectl logs zk-0 -n bigdata
  4. # 跟踪查看容器的日志,相当于tail -f命令的结果
  5. kubectl logs -f <pod-name> -c <container-name>

3. 进入资源容器

  1. # 进入容器
  2. kubectl exec -it podName -n nsName /bin/sh
  3. kubectl exec -it podName -n nsName /bin/bash

5. 更新

1. 版本更新

  1. kubectl set image deployment/nginx nginx=nginx:1.15
  2. # 记录更新操作命令以便后续查看变更历史
  3. kubectl set image deployment/nginx nginx=nginx:1.15 --record

2. 编辑更新

  1. kubectl edit deployment/nginx

3. 滚动更新

  1. kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
  2. kubectl rolling-update frontend --image=image:v2
  3. kubectl rolling-update frontend-v1 frontend-v2 --rollback

4. 替换更新

  1. kubectl replace -f zookersts.yaml

5. 扩缩容

  1. kubectl scale deployment nginx --replicas=10

6. 回滚

  1. # 查看更新过程
  2. kubectl rollout status deployment/nginx --namespace=nsName
  3. # 如果更新成功, 返回值为0
  4. kubectl rollout status deployment nginx-deployment --watch=false | grep -ic waiting
  5. # 查看变更历史版本信息
  6. kubectl rollout history deployment/nginx
  7. kubectl rollout history deployment/nginx --revision=3 --namespace=nsName
  8. # 终止升级
  9. kubectl rollout pause deployment/nginx --namespace=nsName
  10. # 继续升级
  11. kubectl rollout resume deployment/review-demo --namespace=nsName
  12. # 回滚版本
  13. kubectl rollout undo deployment/nginx --namespace=nsName
  14. kubectl rollout undo deployment/nginx --to-revision=3 --namespace=nsName

7. 清理

  1. # 删除资源
  2. kubectl delete deploy/nginx
  3. kubectl delete svc/nginx-service
  4. # 删除所有Pod
  5. kubectl delete pods --all
  6. # 删除所有包含某个label的Pod和Service
  7. kubectl delete pod,service -l name=labelName
  8. # 基于yaml定义的名称删除
  9. kubectl delete -f pod.yaml
  10. # 删除指定命名空间
  11. kubectl delete ns nsName
  12. # 删除指定命名空间的资源
  13. kubectl delete pod zk-0 -n bigdata
  14. kubectl delete pod --all -n bigdata
  15. # 删除计时(观察删除总耗时)
  16. time -p kubectl delete pod podName
  17. # 强制删除(默认:30s)
  18. # 指定删除延迟时间:0s,整体删除时间会明显降低
  19. kubectl delete pod podName -n nsName --grace-period=0 --force
  20. # 以下两行命令功能相同(grace-period=1,等价于now,立即执行)
  21. kubectl delete pod podName -n nsName --grace-period=1
  22. kubectl delete pod podName -n nsName --now
  23. # 删除所有Pods
  24. kubectl delete pods --all --force --grace-period=0

常用操作命令

类型 命令 描述
基础命令 create 通过文件名或标准输入创建资源
expose 将一个资源公开为一个新的Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
get 显示一个或多个资源
explain 文档参考资料
edit 使用默认的编辑器编辑资源
delete 通过文件名、标准输入、资源名称或标签选择器来删除资源
部署命令 rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容或缩容Pod、Deployment、ReplicaSet、RC或Job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量
集群管理命令 certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源(CPU、Memory、Storage)使用。需要Heapster运行
cordon 标记节点不可调度
uncordon 标记节点可调度
drain 维护期间排除节点(驱除节点上的应用,准备下线维护)
taint 设置污点属性
故障诊断和调试命令 describe 显示特定资源或资源组的详细信息
logs 在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的
attach 附加到一个运行的容器
exec 执行命令到容器
port-forward 转发一个或多个本地端口到一个Pod
proxy 运行一个proxy到Kubernetes API Server
cp 拷贝文件或目录到容器
auth 检查授权
高级命令 apply 通过文件名或标准输入对资源应用配置
patch 使用补丁修改、更新资源的字段
replace 通过文件名或标准输入替换一个资源
convert 不同的API版本之间转换配置文件
设置命令 label 更新资源上的标签
annotate 更新资源上的注释
completion 用于实现kubectl工具自动补全
其他命令 api-versions 打印支持的API版本
config 修改kubeconfig文件(用于访问API,比如配置认证信息)
help 所有命令帮助
plugin 运行一个命令行插件
version 打印客户端和服务版本信息

1. 获取帮助

  1. # 检查kubectl是否安装
  2. rpm -qa | grep kubectl
  3. # 获取kubectl及其子命令帮助方法
  4. kubectl --help
  5. kubectl create --help

1. Worker上执行kubectl

  1. # Worker节点上执行
  2. mkdir -p ~/.kube
  3. scp master1:/root/.kube/config ~/.kube/
  4. # 验证(查看K8s集群节点列表)
  5. kubectl get nodes

2. api相关操作命令

  1. # 查看api版本信息
  2. kubectl api-versions
  3. # 查看api资源列表
  4. kubectl api-resources

3. K8s相关进程操作命令

  1. netstat -lntp | grep kube-proxy
  2. netstat -tnlp | grep kubelet

4. 节点操作命令

  • 加入新节点

    1. # 加入新节点,在master节点上执行,将输出再到新节点上执行
    2. kubeadm token create --print-join-command
  • 驱逐节点

    1. # 驱逐节点的Pod
    2. kubectl drain nodeName
  • 节点下线

    1. # 将节点标记为不可调度,不影响现有Pod(注意daemonSet不受影响)
    2. kubectl cordon nodeName
  • 节点上线

    1. # 维护结束,节点重新投入使用
    2. kubectl uncordon nodeName
  • 污点设置

    1. # 设置污点
    2. kubectl taint nodes nodeName key1=value1:NoSchedule
    3. kubectl taint nodes nodeName key1=value1:NoExecute
    4. kubectl taint nodes nodeName key2=value2:NoSchedule
    5. # 删除污点
    6. kubectl taint nodes nodeName key1:NoSchedule-
    7. kubectl taint nodes nodeName key1:NoExecute-
    8. kubectl taint nodes nodeName key2:NoSchedule-
    9. # 查看污点详情
    10. kubectl describe nodes nodeName

    资源创建实例

    Namespace

    命令行方式

    1. kubectl create namespace bigdata

    yaml方式

    1. vi ns-test.yaml

    编排文件如下:

    1. apiVersion: v1
    2. kind: Namespace
    3. metadata:
    4. name: bigdata

    执行yaml文件:

    1. kubectl apply -f ns-test.yaml

    验证:

    1. kubectl get namespaces
    2. kubectl get namespace
    3. kubectl get ns

    清除:

    1. kubectl delete -f ns-test.yaml
    2. kubectl delete ns bigdata

    Pod

    命令行方式

    未提供直接创建Pod的命令,命令行方式一般通过创建Deployment、RC、RS等资源间接创建Pod。

    yaml方式

    1. vi pod-test.yaml

    编排文件如下:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: pod1
    5. spec:
    6. containers:
    7. - name: nginx-containers
    8. image: nginx:latest

    执行yaml文件:

    1. kubectl apply -f pod-test.yaml

    验证:

    1. kubectl get pods
    2. kubectl get pod
    3. kubectl get po
    4. kubectl describe pod pod1
    5. kubectl get pods -o wide
    6. curl http://172.16.189.68

    清除:

    1. kubectl delete -f pod-test.yaml
    2. kubectl delete pod pod1

    Service

    命令行方式

    1. kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
    2. kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=83

    参数说明:

  • expose:创建service。

  • deployment.apps:控制器类型。
  • nginx-app:应用名称,也是service名称。
  • —type=ClusterIP:指定service类型。
  • —target-port=80:指定Pod中容器端口。
  • —port=80:指定service端口。

验证:

  1. kubectl get service
  2. kubectl get svc
  3. kubectl get endpoints
  4. kubectl get ep
  5. curl http://10.104.173.230:83
  6. kubectl get all

清除:

  1. kubectl delete service nginx-app
  2. kubectl delete svc nginx-app

yaml方式

  1. vi nginx-service.yaml

编排文件如下:

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-app
  6. labels:
  7. app: nginx
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx
  17. spec:
  18. containers:
  19. - name: nginxapp
  20. image: nginx:latest
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - containerPort: 80
  24. ---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28. name: nginx-app-svc
  29. labels:
  30. name: nginx-app-svc
  31. spec:
  32. type: ClusterIP
  33. ports:
  34. - protocol: TCP
  35. port: 83
  36. targetPort: 80
  37. selector:
  38. app: nginx
  39. ---
  40. apiVersion: v1
  41. kind: Service
  42. metadata:
  43. name: nginx-app-svc2
  44. labels:
  45. name: nginx-app-svc2
  46. spec:
  47. type: NodePort
  48. ports:
  49. - protocol: TCP
  50. port: 83
  51. targetPort: 80
  52. nodePort: 30083
  53. selector:
  54. app: nginx

执行yaml文件:

  1. kubectl apply -f nginx-service.yaml

验证:

  1. kubectl describe deployment nginx-app
  2. kubectl describe svc nginx-app-svc
  3. kubectl get service
  4. kubectl get svc
  5. kubectl get endpoints
  6. kubectl get ep
  7. # nginx-app-svc
  8. curl http://10.107.141.109:83
  9. # nginx-app-svc2
  10. curl http://192.168.216.100:30083
  11. # 查看k8s集群指定端口的侦听状态
  12. ss -anput | grep ":30083"
  13. kubectl get all

清除:

  1. kubectl delete -f nginx-service.yaml
  2. kubectl delete service nginx-app-svc
  3. kubectl delete svc nginx-app-svc

常用控制器

1. Deployment

命令行方式

  1. kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2

参数说明:

  • nginx-app:Deployment控制器类型的应用名称。
  • —image=nginx:latest:应用运行的Pod中的Container所使用的镜像。
  • IfNotPresent:Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像。
  • —replicas=2:是指应用运行的Pod共计2个副本,这是用户的期望值,Deployment控制器中的ReplicaSet控制器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量。

验证:

  1. kubectl get deployment.apps
  2. kubectl get deployment
  3. kubectl get deploy
  4. kubectl get replicaset
  5. kubectl get rs
  6. kubectl get all

清除:

  1. kubectl delete deployment nginx-app

yaml方式

  1. vi nginx-deployment.yaml

编排文件如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-app
  5. labels:
  6. app: nginx
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: nginx
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. spec:
  17. containers:
  18. - name: nginxapp
  19. image: nginx:latest
  20. imagePullPolicy: IfNotPresent
  21. ports:
  22. - containerPort: 80

执行yaml文件:

  1. kubectl apply -f nginx-deployment.yaml

验证:

  1. kubectl get deployment.apps
  2. kubectl get deployment
  3. kubectl get deploy
  4. kubectl get replicaset
  5. kubectl get rs
  6. kubectl get all
  7. kubectl describe deployment nginx-app
  8. kubectl get pods -o wide
  9. curl http://172.16.189.77
  10. curl http://172.16.235.138

清除:

  1. kubectl delete -f nginx-deployment.yaml
  2. kubectl delete deployment nginx-app

2. ReplicaSet

命令行方式

yaml方式

3. StatefulSet

命令行方式

yaml方式

4. DaemonSet

命令行方式

yaml方式

5. Job

命令行方式

yaml方式

6. CronJob

命令行方式

yaml方式

操作命令补充说明

1. create和apply的异同点

  • create

先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的。

  • apply

根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性。apply命令将配置应用于资源。 如果资源不在那里,那么它将被创建。
image.png
从执行的角度来看,如上所示,在kubectl create和kubectl apply之间第一次创建资源时没有区别。 但是,第二次kubectl create会抛出错误。简单来说,如果在单个文件上运行操作以创建资源,则create和apply基本相同。 但是, apply允许您在目录下的多个文件上同时创建和修补。