K8S常用操作命令

一、pod操作

# 快速生成 Deployment YAML
kubectl create deploy nginx --image=nginx --dry-run=client -o yaml > nginx.yaml
# 自定义输出列,--no-headers不显示表头
kubectl get pod -A -o custom-columns="NameSpace:.metadata.namespace,Name:.metadata.name,Status:.status.phase,IP:.status.podIP,NodeName:.spec.nodeName" --no-headers
kubectl get svc -l app=grafana -o custom-columns="NAME:.metadata.name,TYPE:.spec.type,CLUSTER-IP:.spec.clusterIP,PORT(S):.spec.ports[*].port" --no-headers
# 重启deployments资源pod
kubectl rollout restart deployment grafana
# kubectl cp命令只支持从本地复制到Pod或从Pod复制到本地,不支持直接在两个Pod之间复制文件
kubectl cp <namespace>/<pod-name>:/var/logs/app.log /tmp/app.log
# 进入pod,运行pod中的命令
kubectl -n [namespace] exec -it [podname] -- /bin/bash
kubectl exec -it [podname] -- ping X.X.X.X
# -N, --skip-column-names:不显示列名
kubectl exec mariadb -- mysql -u[username] -p[password] -D[database] -N -e 'SELECT * FROM userinfo;'
# 查看正在运行的pod镜像版本(以下示例namespace为default)
kubectl get pod -l app=grafana --no-headers | awk '{cmd="kubectl describe pod "$1" | grep 'Image:.*grafana'";cmd|getline var;print var}'
kubectl get pod -l app=grafana --no-headers | awk '{cmd="kubectl describe pod "$1" | grep 'Image:.*grafana'";system(cmd)}'
kubectl get pod -l app=grafana --no-headers | awk '{cmd="kubectl describe pod "$1" | grep 'Image:.*grafana'";print cmd | "/bin/bash"}'
# 批量查看k8s组件版本
for i in coredns etcd apiserver controller-manager proxy;do kubectl get pod -n kube-system | grep $i | awk -v res=$i '{cmd="kubectl describe pod "$1" -n kube-system | grep 'Image:.*'"res;system(cmd)}';done
# 获取所有的资源状态
kubectl get all -A
# 获取nginx的deployment资源状态
kubectl get deployment nginx
# 列出所有的deployments资源状态以及它们的标签
kubectl get deployment -A --show-labels
# 获取所有cronjob任务状态以及它们的标签
kubectl get cj/cronjobs -A --show-labels
# 重启cronjob任务
kubectl delete cj/cronjobs [cronjob-name] -n [NAMESPACE]
kubectl apply -f cronjob-name.yaml
# 生成cronjob资源文件,--dry-run=client,不提交到后台,只生成yaml文件,一般用来验证yaml文件
kubectl create cronjob my-cronjob --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- sh -c "date;sleep 10" > my-cronjob.yaml
# 过滤状态不等于Running且app名称为iperf的pod
kubectl get pod -A -o wide -l app=iperf --field-selector=status.phase!=Running
# 运行镜像,一般用于镜像测试
kubectl run nginx --image=nginx:latest -n [namespace]
# 查看容器日志
kubectl logs -f <pod-name> [-c container]
# pod端口转发
kubectl port-forward svc/my-app 8080:80

二、强制删除pod和namespace

# 强制删除pod
kubectl delete pod -l app=grafana -n [namespace] --grace-period=0 --force
# 强制删除Terminating的namespace
# 方法一:
kubectl delete ns ingress-nginx --grace-period=0 --force
# 方法二:
kubectl get ns ingress-nginx -o json > ingress-nginx.json
# 删除文件中的"kubernetes"保存即可,修改前:
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
# 修改后:
    "spec": {
        "finalizers": [
            ""
        ]
    },
# 修改完执行以下命令
# kubectl replace --raw "/api/v1/namespaces/{namespaces}/finalize" -f ./ingress-nginx.json
kubectl replace --raw "/api/v1/namespaces/ingress-nginx/finalize" -f ./ingress-nginx.json
批量处理脚本
#!/bin/bash
# 使用kubectl proxy建立代理,自动继承当前kubectl的认证权限(避免匿名访问)
# 直接调用finalize端点专门处理命名空间终结操作
# 保持与Kubernetes API服务器的认证上下文一致
# 获取所有处于Terminating状态的命名空间列表 TERMINATING_NS
=$(kubectl get ns --field-selector status.phase=Terminating -o jsonpath='{.items[*].metadata.name}') # 检查是否有需要处理的命名空间 if [ -z "$TERMINATING_NS" ]; then echo "没有处于Terminating状态的命名空间需要处理" exit 0 fi echo "发现以下处于Terminating状态的命名空间:" echo "$TERMINATING_NS" echo # 启动kubectl代理(一次启动,供所有操作使用) kubectl proxy --port=8001 & PROXY_PID=$! sleep 2 # 等待代理启动 # 循环处理每个命名空间 for NS in $TERMINATING_NS; do echo "开始处理命名空间: $NS" # 获取命名空间的UID NS_UID=$(kubectl get namespace $NS -o jsonpath='{.metadata.uid}') if [ -z "$NS_UID" ]; then echo "无法获取$NS的UID,跳过处理" continue fi # 发送清理请求 echo " 正在提交删除请求..." RESPONSE=$(curl -s -w "%{http_code}" -X PUT "http://localhost:8001/api/v1/namespaces/$NS/finalize" \ -H "Content-Type: application/json" \ -d '{ "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "'"$NS"'", "uid": "'"$NS_UID"'" }, "spec": { "finalizers": [] } }') # 提取响应状态码和内容 HTTP_CODE=$(echo "$RESPONSE" | tail -n1) RESPONSE_BODY=$(echo "$RESPONSE" | head -n -1) # 检查处理结果 if [ "$HTTP_CODE" -eq 200 ]; then echo "$NS 处理成功" else echo " $NS 处理失败 (状态码: $HTTP_CODE)" echo "错误信息: $RESPONSE_BODY" fi echo "----------------------------------------" done # 清理代理进程 kill $PROXY_PID > /dev/null 2>&1 # 最终状态检查 echo " 最终状态检查:" kubectl get ns --field-selector status.phase=Terminating

 三、使用nsenter命令进入pod的网络名称空间

# docker、nerdctl命令查找容器pid
# 查看Pod所在的宿主机
sudo kubectl get pod [PODNAME]-n [NAMESPACE] -o wide
# 在Pod所在的宿主机上执行以下命令获取容器pid
# 使用docker获取容器pid
sudo kubectl get pod [PODNAME] -n [NAMESPACE] -o jsonpath='{.status.containerStatuses[*].containerID}' | cut -d'/' -f3 | xargs sudo docker inspect --format '{{ .State.Pid }}'
# 使用nerdctl获取容器pid
sudo kubectl get pod [PODNAME] -n [NAMESPACE] -o jsonpath='{.status.containerStatuses[*].containerID}' | cut -d'/' -f3 | xargs sudo nerdctl -n k8s.io inspect --format '{{ .State.Pid }}'
# 使用nsenter命令进入容器网络名称空间
sudo nsenter -n -t [CONTAINER-PID]

# crictl命令查找容器pid
# 查看容器id(查看其它宿主机上pod的容器id需要登录到相应pod的宿主机)
[root@K8S ~]# crictl ps --name grafana
CONTAINER       IMAGE           CREATED        STATE     NAME      ATTEMPT   POD ID
e5bdc1c0ee349   8d0b77430ee96   4 months ago   Running   grafana   0         305caef6e1d5c
[root@K8S ~]# crictl ps --name grafana -o json | jq -r '.containers|.[].id[0:13]'
e5bdc1c0ee349
# 登录到容器所在的宿主机上执行以下命令查找容器pid
crictl inspect -o json [CONTAINER-ID] | jq '.info.pid'
[root@K8S ~]# crictl inspect -o json e5bdc1c0ee349 | jq '.info.pid'
3777131
# 使用nsenter命令进入容器网络名称空间
nsenter -n -t [CONTAINER-PID]
[root@K8S ~]# nsenter -n -t 3777131

参考链接:
     https://www.cnblogs.com/zoujiaojiao/p/17021724.html     # k8s中使用nsenter命令进入容器网络命名空间
     https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/field-selectors/     # k8s字段选择器
     https://kubernetes.io/zh-cn/docs/reference/kubectl/generated/     # kubectl命令参考

posted @ 2025-08-25 09:47  風£飛  阅读(67)  评论(0)    收藏  举报