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-
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习