kubernetes

kubernetes

常用对象管理命令

集群

kubectl cluster-info                    # 集群连接信息
kubectl cluster-info dump > dump.log    # 集群详细信息

kubectl get events -A                   # 查看集群事件
kubectl delete events --all --all-namespaces    # 删除全部事件
kubectl delete events --all -n <namespace>

# 查看 ns 中全部的资源对象
kubectl get all -n cwx
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n cwx

节点

kubectl get node
kubectl get node h21 -o yaml    # 详细信息

下线节点

# 先标记 - 节点不可调度
kubectl cordon node02

# 驱逐 pod - 忽略不好驱逐的pod - 给 2 分钟时间; --force 强制驱逐
kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --timeout=120s

# remove node
kubectl delete nodes kk-node02

# 清理节点, 注意不要在集群的 master 节点执行, 否则会影响集群
kubeadm reset

# 恢复节点可用标签
kubectl uncordon node-161

标签和污点

# label
kubectl label node <node-name> key=value                # 增
kubectl label node <node-name> key-                     # 删
kubectl label node <node-name> key=value --overwrite    # 改
kubectl get node <node-name> --show-labels111           # 查

# 污点 taint
kubectl taint node <node-name> key=value:NoSchedule
kubectl taint node <node-name> key=value:NoExecute
kubectl taint node <node-name> key-                     # 删
kubectl taint node s77 node-role.kubernetes.io/internet:NoSchedule     # 标准一点的不调度标签

services 服务

kubectl get service                     # 查看全部 Service 列表
kubectl describe service svc_name       # 查看 Service 详细信息
kubectl get service svc_name -o yaml    # 查看 Service 资源清单
# 方法一:基于已有 Deployment 对象创建
kubectl expose deployment dp_name --type=svc_type --port=<port> --targetPort=<targetPort>
# 示例:
kubectl expose deployment demo-deployment --type=ClusterIP --port=80 --targetPort=80

# 方法二:命令行创建
kubectl create servcie svc_type <service-name> --tcp=<port>:<targetPort>
# 示例:
kubectl create servcie clusterip demo-servcie --tcp=80:80

kubectl delete service <service-name>

workload 发布

deployment

kubectl get deployment <deployment-name> -o yaml

kubectl describe deployment <deployment-name>

# 新增或修改 ENV 环境变量
kubectl set env deployment <deployment-name> key=value

# 删除 ENV 环境变量
kubectl set env deployment <deployment-name> key-

# 新增或修改资源限制
kubectl set resources deployment <deployment-name> --requests=cpu=100m,memory=256Mi --limits=cpu=100m,memory=256Mi

# 删除资源限制
kubectl set resources deployment <deployment-name> --requests=cpu=0,memory=0 --limits=cpu=0,memory=0

# 通过 patch 更新
## 新增 command 参数
kubectl patch deployment <deployment-name> --type json -p \
'[{"op":"add", "path":"/spec/template/spec/containers/0/command", "value":["sh","-c","sleep 3000"]}]'

## 删除 command 参数
kubectl patch deployment <deployment-name> --type json -p \
'[{"op":"remove", "path":"/spec/template/spec/containers/0/command"}]'

## 替换 command 参数
kubectl patch deployment <deployment-name> --type json -p \
'[{"op":"replace", "path":"/spec/template/spec/containers/0/command", "value":["sh","-c","sleep 3600"]}]'

kubectl patch 可以使用 --dry-run 进行格式检查, 追加 -oyaml 查看资源清单


# 通过 edit 更新
kubectl edit deployment <deployment-name>

# 更换镜像
kubectl set image deployment <deployment-name> <container-name>=<image-name>

控制

kubectl delete deployment <deployment-name>

kubectl -n uat scale deployment me-x-x --replicas=0     # 调整副本数量

# 重启
kubectl rollout restart deployment dp_name

# 临时关闭 Daemonsets - 将其调度到一个不存在的 node 上
kubectl patch daemonsets dp_name \
    -p '{"spec":{"template":{"spec":{"nodeSelector":{"project/xdp":"none"}}}}}'

kustomize

kubectl kustomize overlays/dev          # show 配置 - 不应用
kubectl apply -k overlays/dev           # 部署 - 应用

pod

查看

# 查看
kubectl get pods -A -o wide
kubectl get pod <pod-name> -o yaml
kubectl get pods --show-labels
kubectl get pods --show-labels --selector app=mysql # 过滤指定标签的
kubectl -n cwx get svc,pod -o wide              # svc+pod
kubectl get pods -A | grep -v Running           # 过滤不正常的
kubectl describe pod pod_name -n kube-system    # 查看 pod 描述信息

# 查找 Pod 所在节点
kubectl -n cwx describe pod gatus-68cbd45f6c-p6tm6 | grep Node:

# 根据 pods 的重启次数进行排序
kubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount'

# 根据启动时间降序(descending order)
kubectl get pods --sort-by=.metadata.creationTimestamp -A

# 根据启动时间升序(ascending order)
kubectl get pods --sort-by={metadata.creationTimestamp} --no-headers | tac

# 查看所有镜像
kubectl get pods -A -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'

控制


# 拷贝文件出来
kubectl -n uat-1 cp pod_name:/me/xxxx.xlsx /tmp/xxxx.xlsx

kubectl delete po <pod-name>

kubectl exec -it <pod_name> bash            # 进入 pod

# 通过 dp 进入 pod, 多副本时, 应该是随机进入一个
kubectl exec -it deployment/<deployment-name> bash

# 在某个容器内执行命令 - 测试 dns 解析
kubectl exec -n cwx pods/redis-sfs-0 -- nslookup mygoweb

kubectl exec -it <pod name> -- bash                 # 交互式执行
kubectl exec -it <pod-name> bash -c "<command>"     # 非交互式执行命令

# 创建临时 pod
kubectl run --rm -it --image=busybox sh
# 查看所有 pod 配置的 requests 和 limits cpu 值
kubectl get pod -A -o json \
  | jq -r '.items[] | [.metadata.namespace,.metadata.name,
     .spec.containers[].resources.requests.cpu,
     .spec.containers[].resources.limits.cpu] | @tsv'

日志

# 最新日志
kubectl -n dev logs app-6dcf664d86-jrnb2 --tail 500 -f

# 输出前一次停机前的日志
kubectl logs <pod-name> --previous

证书

kubectl get csr                                     # 查看最近的证书请求
kubectl certificate approve node-csr-xxxxxxxx       # 批准证书请求

存储

pv

# clean unused pv | 未使用的 pv
kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Used By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$" | cut -f2 -d: | paste -d " " - - | xargs -n2 bash -c 'kubectl -n ${1} delete pvc ${0}'

# 清理没有被绑定的 PVC
kubectl get pvc --all-namespaces | tail -n +2 | grep -v Bound | awk '{print $1,$2}' | xargs -L1 kubectl delete pvc -n


# 清理没有被绑定的 PV
kubectl get pv | tail -n +2 | grep -v Bound | awk '{print $1}' | xargs -L1 kubectl delete pv

# 配置默认storageclass
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

secret


# 复制secret到其他namespace下, 方法一
kubectl get secret <SECRET-NAME> -n <SOURCE-NAMESPACE> -o yaml | sed "/namespace:/d" | kubectl apply --namespace=<TARGET-NAMESPACE> -f -

# 复制secret到其他namespace下, 方法二
kubectl get secrets -o json --namespace namespace-old | \
  jq '.items[].metadata.namespace = "namespace-new"' | \
  kubectl create-f  -

# 获取K8s的token
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

客户端管理

kubectl config set-context --current --namespace=cwx

kubectl port-forward service/<service name> <localPort>:<servicePort>
kubectl port-forward <podName> <localPort>:<podPort> --namespace kube-system

# 测试 dns 解析
kubectl run dns-test --image=busybox:1.28 --rm -it --restart=Never -- nslookup kubernetes.default

资源


# 查看资源总情况
kubectl get no -o=custom-columns="NODE:.metadata.name,ALLOCATABLE CPU:.status.allocatable.cpu,ALLOCATABLE MEMORY:.status.allocatable.memory"

# 查看CPU分配情况
kubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c 'echo -n "{}\t"|tr "\n" " " ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- | grep cpu | awk '\''{print $2$3}'\'';'

# 查看内存分配
kubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c 'echo "{}\t"|tr "\n" " " ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- | grep memory | awk '\''{print $2$3}'\'';'

# 查看资源使用情况 cpu+ram
kubectl get nodes --no-headers | awk '{print $1}' | xargs -I {} sh -c "echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve --;"

镜像管理

echo "当前镜像数量"
ctr --namespace k8s.io images list -q | wc -l

echo "清理未使用的镜像..."
ctr --namespace k8s.io images prune

echo "清理已停止的容器..."
ctr --namespace k8s.io containers list -q | xargs -r ctr --namespace k8s.io containers delete

echo "清理未使用的快照..."
ctr --namespace k8s.io snapshots list -q | xargs -r ctr --namespace k8s.io snapshots remove

# 导入镜像文件
ctr -n k8s.io image import registry-photon.tar



# 修改部署的镜像版本
kubectl set image deployment/nginx-deployment container_name=harbor.services.wait/registry.k8s.io/nginx:1.35.2

# 查看命名空间下所有部署的镜像地址,支持多容器的场景
kubectl -n argocd get deployment  -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,CONTAINER:.spec.template.spec.containers[*].name,IMAGE:.spec.template.spec.containers[*].image
kubectl -n argocd get statefulsets  -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,CONTAINER:.spec.template.spec.containers[*].name,IMAGE:.spec.template.spec.containers[*].image
最后更新于