6.k8s_命令详解汇总—kubectl命令汇总

3.1 集群管理

# 查看集群信息
kubectl cluster-info
# 查看节点状态
kubectl get node
# 查看更详细的节点信息
kubectl get node -o wide 
# 查看节点详细情况
kubectl describe node k8s-master 
# 查看节点使用情况,需要安装 metrics
kubectl top nodes
# 查看最近的集群事件
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n prod
# 给节点打标签
kubectl label nodes <node-name> key=value
kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=worker
# 取消节点标签
kubectl label nodes <node-name> key-

 3.2 Namespace管理

Namespace(命名空间) 用于在同一个集群中逻辑地划分资源,以支持不同的环境、团队或项目。Namespace 能够将资源隔离管理,防止命名冲突,并便于访问控制和配额管理。

# 创建命令空间
kubectl create namespace liyb prod 
# 查看命名空间
kubectl get ns
# 查看命令空间详细信息
kubectl get ns -o yaml
kubectl describe get ns prod
# 删除命令空间
kubectl delete ns liyb
#查看命名空间下所有deployment
kubectl get deploy -o wide -n prod 
#查看指定deployment的详细信息
kubectl get deploy nginx -o yaml -n prod
kubectl get deployment nginx -o json -n prod

如果不指定命名空间,创建的资源对象默认存放在default命名空间。

在生产环境中,一般是一个项目放在一个命名空间中,在处理对象资源时,需要使用 -n 命名空间来对资源进行操作

3.3 Pod管理

Pod 是最小的可部署单元。它是运行应用容器的集合,通常包含一个或多个容器,负责应用的运行、管理和监控。管理 Pods 是 Kubernetes 日常运维的重要部分,常用命令可以帮助用户高效地创建、查看、更新和删除 Pods

(1)创建pod
# 创建pod
kubectl apply -f pod.yaml
kubectl run my-pod --image=nginx --port=80
(2)查看pod
# 查看pod资源使用情况
kubectl top pod 
# 查看所有的pod
kubectl get pod -A
# 查看命名空间下所有pod信息
kubectl get pod -o wide -n prod
# 查看指定pod的详细信息
kubectl get pod <pod-name> -o yaml -n <namespace>
kubectl get pod nginx -o yaml -n prod
# 查看pod日志
kubectl logs nginx-f49c8d898-njgzk -n prod
kubectl logs -f nginx-f49c8d898-njgzk -n prod
# 查看pod详细信息
kubectl describe pod nginx-f49c8d898-njgzk -n prod
# 显示所有pod的标签
kubectl get pods --show-labels -A
# 列出 Pods,按重启次数排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
# 列出pod的亲和性规则
kubectl get pod nginx-f49c8d898-njgzk  -o=jsonpath='{.spec.affinity}'
# 列出pod的反亲和性规则
kubectl get pod nginx-f49c8d898-njgzk  -o=jsonpath='{.spec.affinity.podAntiAffinity}'
(3)修改pod
# 进入到pod容器内,使用exit退出容器
kubectl exec -it <pod-name> -n <namespace> -- <command>
kubectl exec -it nginx-f49c8d898-njgzk -- bash -n prod
# 将文件或文件夹拷入pod
kubectl cp /etc/nginx/nginx.conf nginx-f49c8d898-njgzk:/etc/nginx/conf.d/nginx.conf -n prod
# 将文件或文件夹从pod拷出
kubectl cp nginx-f49c8d898-njgzk:etc/nginx/conf.d/nginx.conf /opt -n prod
(4)删除pod
# 删除pod(如果是deploy部署,相当于重启)
kubectl delete pod nginx-f49c8d898-njgzk -n prod
# 强制删除pod
kubectl delete pod nginx-f49c8d898-njgzk --grace-period=0 --force -n app
(5)Pod网络诊断
# 运行网络诊断 Pod进行调试
kubectl run -it --rm --restart=Never --image=docker.m.daocloud.io/busybox  debug-pod -- /bin/sh
# 测试从 Pod 到特定端点的连接
kubectl exec -it <pod-name> -n <namespace> -- curl <endpoint-url>
# 跟踪从一个 Pod 到另一个 Pod 的网络路径, 如:traceroute 跟踪主机路由
kubectl exec -it <source-pod-name> -n <namespace> -- traceroute <destination-pod-ip>
# 检查 Pod 的 DNS 解析,如:nslookup 查询域名系统
kubectl exec -it <pod-name> -n <namespace> -- nslookup <domain-name>

3.4 deployment管理

Deployment 是一种用于管理 Pod 副本的控制器,提供滚动更新、扩缩容、回滚等功能

(1)创建deployment

有两种方式,一种是命令行,一种是写一个资源清单

# 命令行创建deployment
kubectl create deployment <deployment-name> --image=<container-image>
kubectl create deploy mynginx --image=nginx:1.25

# 基于yaml方式创建 # 创建资源清单
vi deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:   name: nginx-deployment   labels:     app: nginx spec:   replicas: 3   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - name: nginx         image: nginx:1.25         ports:         - containerPort: 80 kubectl apply -f deployment.yaml
(2)查看deployment
# 查看deployment信息
kubectl get deploy -n <namespace>
kubectl get deploy nginx
# 查看某个deploy详细信息
kubectl get deploy nginx -o wide
kubectl describe deploy nignx
(3)更新deployment
kubectl set image <deploy-name> my-container=my-image:newtag
kubectl set image mynginx nginx=nginx:1.26
(4)伸缩deployment
# 手动伸缩
kubectl scale deployment <deployment-name> --replicas=<replica-count> -n <namespace>
# 指定伸缩数量
kubectl scale deploy nginx --replicas=3
# 设置自动伸缩
kubectl autoscale deployment <deployment-name> --min=<min-pods> --max=<max-pods> --cpu-percent=<cpu-percent> -n <namespace>
# CPU超过70%就进行伸缩
kubectl autoscale deploy nginx --min=1 --max=3 --cpu-percent=70 
# 检查自动伸缩器状态
kubectl get hpa
(5)版本回滚
# 查看滚动更新状态
kubectl rollout status deployment/<deployment-name> -n <namespace>
kubectl rollout status deployment/nginx 
# 查看deployment所有历史版本
kubectl rollout history deployment/nginx 
# 查看deployment某个历史版本的详细信息 --revision
kubectl rollout history deployment/nginx --revision=1 
# 回滚到上一个版本
kubectl rollout undo deployment nginx 
# 指定版本回滚
kubectl rollout undo 资源类型/资源名称 --to-revision=版本号
kubectl rollout undo deployment/nginx --to-revision=3
(6)删除deployment
# 命令行删除
kubectl delete deploy <deploy-name>
kubectl delete deploy mynginx
# 基于资源清单删除
kubectl delete -f deploy.yaml

3.5 Service管理

 (1)创建service
# 命令行创建,通过暴露deployment创建Service
kubectl expose deployment <deployment-name> --type=<service-type> --port=<port> --target-port=<target-port>
kubectl expose deploy nginx --port=80 --target-port=80  --type=NodePort

# 基于yaml文件创建
# 创建Service资源清单
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080  # 指定节点上的端口
  type: type: NodePort

# 创建
kubectl apply -f service.yaml

Service类型:

ClusterIP:默认类型,服务只能在集群内部访问。

NodePort:在每个节点上开放一个端口,允许外部访问。

LoadBalancer:为 Service 创建一个外部负载均衡器(在支持的云提供商上)。

(2)查看service
# 查看所有service信息
kubectl get svc
kubectl get svc -o wide -n prod
# 查看指定service的详细信息
kubectl get svc nginx -o yaml -n prod
kubectl describe svc nginx -n prod
# 查看Service的endpoint信息
kubectl get endpoints <service-name>
kubectl get ep nginx
(3)编辑更新Service
# 编辑文件修改service
kubectl edit service <service-name>  kubectl edit svc nginx -n prod # 命令行更新端口 kubectl patch service my-service -p '{"spec":{"ports":[{"port":80,"targetPort":8081}]}}'
(4)删除Service
# 命令行删除
kubectl delete svc <service-name>
kubectl delete svc nginx
# 基于yaml文件删除
kubectl delete -f service.yaml

3.6 Statefulset管理

 StatefulSet 是一种用于管理有状态应用的控制器,适用于需要稳定网络标识、持久存储以及有序部署、更新和删除的场景,如数据库、分布式系统等。StatefulSet 与 Deployment 的主要区别在于,它能够确保 Pod 的顺序性和持久性。

 (1)查看statefulset
# 查看statefulset状态
kubectl get statefulsets -n <namespace>
kubectl get sts 
# 查看某个sts详细信息
kubectl describe sts mysql
(2)伸缩statefulset

注意:statefulset的扩缩容都是有序进行的,扩容:新增的 Pod 会按顺序启动,缩容:序号最大的先停止,如:启3个web,web-0、web-1、web-2,扩容到5个,增驾web-3、web-4

kubectl scale statefulset <statefulset-name> --replicas=<number>
kubectl scale statefulset web --replicas=5
(3)StatefulSet滚动更新
# 查看滚动更新状态
kubectl rollout status statefulset web
# 暂停滚动更新
kubectl rollout pause statefulset web
# 恢复滚动更新
kubectl rollout resume statefulset web
# 回滚StatefulSet
kubectl rollout undo statefulset web 
(4)删除statefulset
# 删除 web StatefulSet,但其持久化卷(Persistent Volumes)不会被删除。
kubectl delete statefulset web
# 强制删除 StatefulSet 及其 Pods
kubectl delete statefulset web --cascade=false
# 删除 StatefulSet 及其相关资源(Pod、PVC)
kubectl delete statefulset <statefulset-name> --cascade=orphan

deployment和statefulset的区别:

特性 Deployment  StatefulSet
Pod名称 每个 Pod 名称随机分配 保持稳定,例如 web-0,web-1
网络标识 Pod 重建时网络标识会变化 Pod拥有稳定的网络标识
存储 Pod 共享 PVC (一般不适合有状态应用)  每个 Pod 使用独立的 PVC
启动顺序 无固定顺序 按顺序启动和删除 Pod
适用场景 无状态应用,Web应用、批处理任务  有状态应用,数据库、分布式系统

 

 

 

 

 

3.7 存储卷管理

 Persistent Volumes (PVs) 提供了持久化的存储资源,PV类型多种多样,支持不同的存储后端,如本地存储、网络存储(如NFS、GlusterFS、Ceph等)。

 (1)创建PV/PVC
# 创建一个nfs的PV
vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /data/nfs   # nfs挂载目录
    server: 10.0.0.100 # 该服务器已经安装好NFS
  persistentVolumeReclaimPolicy: Retain

# 创建一个NFS的PV
# 创建一个本地pv 
kubectl apply -f local-pv.yaml

# 编写PVC的资源清单
vi pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: nfs-storage

# 创建PVC
kubectl apply -f pvc.yaml
(2)查看PV/PVC
# 列举所有 PV 持久卷
kubectl get pv -A
# 查看持久卷(PV)信息
kubectl get pv
# 查看某个PV详细信息
kubectl describe pv <pv-name>
# 查看持久卷声明(PVC)信息
kubectl get pvc
kubectl get pvc -n <namespace>
# 查看所有存储类别
kubectl get storageclasses
# 查看storageclasses的详细信息
kubectl describe storageclass <storageclass-name>
(3)删除PV/PVC
# 删除PV
kubectl delete pv <pv-name>
kubectl delete pv my-pv

3.8 配置管理

1、ConfigMap管理
 (1)创建ConfigMap
# 从命令行创建
kubectl create configmap <configmap-name> --from-literal=<key>=<value>
kubectl create configmap my-config --from-literal=APP_ENV=prod
# 从文件中创建
kubectl create configmap <configmap-name> --from-file=<file-path>
kubectl create configmap my-config --from-file=config.properties
# 从目录中创建
kubectl create configmap <configmap-name> --from-file=<directory-path>
kubectl create configmap my-config --from-file=./config-directory
(2)查看ConfigMap
# 查看configMaps信息
kubectl get configmaps -A
kubectl get configmaps -n prod
# 查看某个configmaps详细信息
kubectl describe configmaps <configmap-name>
kubectl describe configmap my-config
(3)更新ConfigMap
# 打开编辑器编辑
kubectl edit configmap <configmap-name>
kubectl edit configmap my-config
# 使用命令更新
kubectl patch configmap <configmap-name> -p '{"data":{"<key>":"<new-value>"}}'
kubectl patch configmap my-config -p '{"data":{"APP_ENV":"staging"}}'
# 说明:更新 ConfigMap 中 APP_ENV 的值为 staging
(4)删除ConfigMap
kubectl delete configmap <configmap-name>
kubectl delete configmap my-config
(5)在pod中使用configmap
# 通过环境变量使用 ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      env:
        - name: APP_ENV
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: APP_ENV

# 通过挂载卷使用 ConfigMap
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - mountPath: /etc/config
          name: config-volume
  volumes:
    - name: config-volume
      configMap:
        name: my-config
2、Secret 管理
(1)创建 Secret 
# 从命令行创建
kubectl create secret generic <secret-name> --from-literal=<key>=<value>
kubectl create secret generic my-secret --from-literal=password=123456
# 从文件中创建
kubectl create secret generic <secret-name> --from-file=<file-path>
kubectl create secret generic my-secret --from-file=ssh-private-key
(2)查看Secret
# 查看secret信息
kubectl get secrets -n <namespace>
# 查看某个secrets详细信息
kubectl describe secret <secret-name> -n <namespace>
kubectl describe secret my-secret
(3)更新 Secret
# 编辑Secret
kubectl edit secret <secret-name>
kubectl edit secret my-secret
# 使用命令更新
kubectl patch secret <secret-name> -p '{"data":{"<key>":"<base64-encoded-value>"}}'
kubectl patch secret my-secret -p '{"data":{"password":"bXktc2VjcmV0LXBhc3N3b3Jk"}}'
(4)删除Secret
kubectl delete secret <secret-name>

3.9 RBAC管理

(1)查看角色和角色绑定
# 查看角色和角色绑定
kubectl get roles  -A 
kubectl get rolebindings -A 
# 查看某个角色具体信息
kubectl describe role kube-proxy -n kube-system
# 查看集群角色
kubectl get clusterroles
# 查看集群角色绑定
kubectl get clusterrolebindings
kubectl describe clusterrole my-cluster-role
# 查看服务账号信息
kubectl get serviceaccount -A 
kubectl get sa -A 
# 查看服务账号详情
kubectl get serviceaccounts -n <namespace>
# 查看某个服务账号的详情
kubectl describe serviceaccount <serviceaccount-name> -n <namespace>
(2)删除角色和绑定
# 删除角色
kubectl delete role my-role
# 删除集群角色 
kubectl delete clusterrole my-cluster-role
# 删除角色绑定 
kubectl delete rolebinding my-rolebinding
# 删除集群角色绑定
kubectl delete clusterrolebinding my-cluster-rolebinding

3.10 调度管理

(1)污点taint

! 如果设置了污点,一般需要配置容忍度才能进行调度

# 给某个节点设置污点
kubectl taint node <node-name> <key>=<value>:<effect>
# 示例:将节点1设置为不可调度,已经存在的pod不受影响
kubectl taint node k8s-node1 node-type=prod:NoSchedule
# 查看节点的污点
kubectl describe node <node-name> | grep Taints
# 删除某污点
kubectl taint node <node-name> <key>=<value>[:<effect>]-
# 删除节点1的污点
kubectl taint node k8s-node1 node-type=prod:NoSchedule-
kubectl taint node k8s-node1 node-type-
(2)cordon和drain管理
# 将node1节点标记为不可调度
kubectl cordon k8s-node1
# 此时查看节点为:SchedulingDisabled
kubectl get node
# 对在node1节点的资源进行驱逐
kubectl drain k8s-node1 --ignore-daemonsets
# 再次查看pod情况,你会发现除了daemonset部署的pod,其他pod都被驱逐了
# 将node1节点恢复为可调度
kubectl uncordon my-node
# 又可以重新调度了,注意:被驱逐的节点不会自动调度回来原节点

3.11 资源配额和限制管理

1、资源配额(Resource Quotas)

资源配额用于限制某个命名空间中可以使用的资源总量。

(1)创建资源配额
# 创建资源清单文件
vi resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: resource-quota
  namespace: prod
spec:
  hard:
    requests.cpu: "1"
    requests.memory: "1Gi"
    limits.cpu: "2"
    limits.memory: "4Gi"

# 创建资源配额命令
kubectl apply -f resource-quota.yaml
(2)查看资源配额
# 查看资源配额信息
kubectl get resourcequota -n prod
kubectl get resourcequota -A
# 查看资源配额详细信息
kubectl describe resourcequota resource-quota -n prod
(3)删除资源配额
kubectl delete resourcequota resource-quota -n prod
2、资源限制(LimitRanges)

资源限制用于为某个命名空间内的 Pod 和容器定义默认的资源请求和限制。

(1)创建资源限制
# 创建资源限制资源清单
apiVersion: v1
kind: LimitRange
metadata:
  name: my-limit-range
  namespace: prod
spec:
  limits:
    - default:
        cpu: "1"
        memory: "1Gi"
      defaultRequest:
        cpu: "500m"
        memory: "512Mi"
      type: Container
# 创建资源限制命令
kubectl apply -f limit-range.yaml
(2)查看资源限制
# 查看资源限制信息
kubectl get limitranges -n prod
# 查看资源限制详细信息
kubectl describe limitrange my-limit-range -n prod
(3)删除资源限制
kubectl delete limitrange my-limit-range -n prod
3、创建 Pod 使用资源限制
vi my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: my-namespace
spec:
  containers:
    - name: my-container
      image: nginx
      resources:
        requests:
          cpu: "200m"
          memory: "256Mi"
        limits:
          cpu: "500m"
          memory: "512Mi"
  
# 创建 Pod 命令
kubectl apply -f my-pod.yaml

查看 Pod 的资源使用情况

kubectl top pods --namespace=my-namespace

3.12 标签管理

Kubernetes 中的标签(Labels)是一种用于标识、组织和选择对象的关键工具。标签是键值对,附加到资源(如 Pod、Service、ConfigMap 等)上,用于过滤和操作对象。

(1)为现有资源添加标签
# 使用命令为现有资源添加标签
kubectl label pod nginx app=mynginx
# 使用 YAML 文件为资源添加标签
在资源定义的 metadata 部分中添加 labels 字段
(2)查看资源的标签
# 查看所有资源及其标签
kubectl get <resource-type> --show-labels
# <resource-type>可以是 pod,deployment,svc,statefulset 等多种资源对象
(3)根据标签选择资源
# 列出所有带有 app=nginx 标签的 Pods
kubectl get pods -l app=nginx
# 可以使用多个标签进行匹配
kubectl get pods -l app=nginx,tier=frontend
(4)修改标签
# 将 my-pod 的 app 标签修改为 nginx-v2
kubectl label pod my-pod app=nginx-v2 --overwrite
(5)删除标签
# 删除 my-pod 的 app 标签
kubectl label pod my-pod app-

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-03-23 09:36  马俊南  阅读(219)  评论(0)    收藏  举报