kubectl 命令备忘

即使作为 kubernetes 的研发工程师,有时候急需一两个简单的命令运行容器、或者查看相关配置而不得的时候,非常头疼。这篇文章做个笔记,记一些常见的命令。

一、开发篇

  1. 自动补全

    source <(kubectl completion bash)
    
  2. 创建Pod

    kubectl run cka --image=nginx --restart=Never
    
  3. 通过单个命令创建一个deployment并暴露Service

    kubectl run cka2 --image=nginx --port=80 --expose=true
    
  4. 暴露资源service

    kubectl expose pod cka1 --port=80 --target-port=80
    
  5. 查询域名信息

    kubectl exec -ti busybox -- nslookup nginx
    
  6. 扩展副本

    kubectl scale --replicas=4 deployment nginx-app
    
  7. 设置节点不可调度

    kubectl drain node node1  --ignore-daemonsets --delete-local-data
    

    参考:Safely Drain a Node while Respecting Application SLOs

二、运维篇

可以用来设置成 shell 的 alias。

  1. 获得节点IP

    kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name} {.status.addresses[?(@.type=="InternalIP")].address}{"\n"}{end}'
    
  2. 查看pod日志

    kubectl logs my-pod -c my-container --previous      # 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景)
    kubectl logs -f -l name=myLabel --all-containers    # 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出)
    
  3. 系统事件

    kubectl get events --sort-by=.metadata.creationTimestamp
    
  4. 交互式 Shell运行测试容器

    kubectl run -i --tty busybox --image=busybox -- sh
    
  5. 显示所有 Pods 的标签

    kubectl get pods --show-labels
    
  6. 列出被一个 Pod 使用的全部 Secret

    kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
    
  7. pod cpu/内存 排序

    kubectl top pods --all-namespaces | sort --reverse --key 4 --numeric
    kubectl top pods -A | sort --reverse --key 3 --numeric
    
  8. pod镜像名

    kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
    
  9. 查看每个node上运行了多少pod

    kubectl get pods --all-namespaces -o json | jq '.items[] | .spec.nodeName' -r | sort | uniq -c
    
  10. 查看node上运行的具体pod

    kubectl get pods --all-namespaces -o json | jq '.items | map({podName: .metadata.name, nodeName: .spec.
    nodeName}) | group_by(.nodeName) | map({nodeName: .[0].nodeName, pods: map(.podName)})'
    
  11. 集群交互

    kubectl cordon my-node   # 标记 my-node 节点为不可调度
    kubectl drain my-node    # 对 my-node 节点进行清空操作,为节点维护做准备
    kubectl uncordon my-node # 标记 my-node 节点为可以调度
    kubectl top node my-node # 显示给定节点的度量值
    kubectl cluster-info     # 显示主控节点和服务的地址
    kubectl cluster-info dump # 将当前集群状态转储到标准输出
    
  12. 资源类型

    kubectl api-resources --namespaced=true      # 所有命名空间作用域的资源
    kubectl api-resources --namespaced=false     # 所有非命名空间作用域的资源
    kubectl api-resources -o name                # 用简单格式列举所有资源(仅显示资源名称)
    kubectl api-resources -o wide                # 用扩展格式列举所有资源(又称 "wide" 格式)
    kubectl api-resources --verbs=list,get       # 支持 "list" 和 "get" 请求动词的所有资源
    kubectl api-resources --api-group=extensions # "extensions" API 组中的所有资源
    

三、与 shell 交互的命令

  1. 批量为 ns 设置资源

    nsArray2=(
    abc
    def
    )
       
    for ns in ${nsArray2[@]}
    do
      cat <<EOF | kubectl apply -n $ns -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: default-resourcequota
    spec:
      hard:
        limits.cpu: "10m"
        requests.cpu: "10m"
        limits.memory: 10Mi
        requests.memory: 10Mi
        persistentvolumeclaims: "20"
        pods: "100"
        requests.storage: 1Mi
        services: "100"
    EOF
    done
    
  2. 查看何种资源使用了hostpath,并打印到excel表格中

    kubectl get deployment -A|awk '{print $1,$2}'|grep -v NAMESPACE|while read vns vpod; 
    do    
       vres=`kubectl get deployment -n $vns $vpod -oyaml|grep hostPath|wc -l`;    
        if [ $vres -gt 0 ];then       
         echo "hostpath,www,deployment,$vns,$vpod">>/tmp/www.csv
        fi; 
    done
    

参考资料


Windows 使用 docker-compopse 报错 driver failed programming external connectivity 如何在日本键盘上输入冒号?