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命令参考
浙公网安备 33010602011771号