kubectl 具备丰富的命令,其使用方法如下:
kubectl [flags] [options]
通过 "kubectl --help"来查找指定命令的更多信息;
通过 “kubectl options” 来查找所用命令行选项 (适用于所有命令).

此处根据 kubectl --help 将各类命令加以分类,后续将按照分类补充各命令的使用案例。

1 Basic Commands (Beginner)

  1. create
    Create a resource from a file or from stdin.
    create 直接创建一个资源,若资源已经存在,继续创建的时候会报错;
    apply -f resource.yaml 会创建并更新该资源,若该资源存在则更新对应资源;
    1) 通过dry-run 的方式创建一个deployment 基本信息
    kubectl create deployment my-web --image=nginx --dry-run=client -o yaml >my-web.yaml
    通过 apply -f 创建实际的deployment
    kubectl apply -f my-web.yaml 
    2)创建ns
    kubectl create namespace test-online2 --dry-run=client -o yaml
    等价于yaml: 
    cat << EOF >test-online2.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test-online2
    EOF
    kubectl apply -f test-online2.yaml
    3) 创建一个 pod
    $ cat pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      namespace: test-online
    spec: 
      containers:
      - image: nginx:latest
        name: web-pod
        ports:
        - name: web-port
          containerPort: 80
          protocol: TCP
     kubectl apply -f pod.yaml 
    
  2. expose
    使用 replication controller, service, deployment 或者 pod 并暴露它作为一个新的 Kubernetes Service
    $ kubectl expose deployment my-web --port=5000 --target-port=5000 --type=NodePort
    
    $ kubectl get svc
    NAME     TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
    my-web   NodePort   10.1.175.63   <none>        5000:32020/TCP   4m5s
    
    此时通过nodeIP:NodePort可以正常访问my-web 中的5000端口: 在这里插入图片描述
  3. run
    在集群中运行一个指定的镜像
    在当前命名空间中创建一个pod,容器端口为80
    kubectl run nginx2  --image=nginx:latest --port=80
    等价:
    apiVersion: v1
    kind: Pod
    metadata:
     creationTimestamp: null
     labels:
       run: nginx2
     name: nginx2
    spec:
     containers:
     - image: nginx:latest
       name: nginx2
       ports:
       - containerPort: 80
       resources: {}
     dnsPolicy: ClusterFirst
     restartPolicy: Always
    status: {}
    
  4. set
    为 objects 设置一个指定的特征
    1) 设置 my-web 中的容器nginx的镜像为nginx:latest
    kubectl set image deployment/my-web nginx=nginx:latest
    2) 设置 my-web 中的环境变量 env_dir为/local
    kubectl set env deployment/my-web env_dir=/local
    3) 查看所有pod的环境变量
    kubectl set env  pods --all --list
    

2 Basic Commands (Intermediate)

  1. explain
    查看资源的文档
    1)查看pod 的所有子字段的文档
    kubectl explain pods
    2)查看pod的spec.containers 的所有子字段文档
    kubectl explain pods.spec.containers
    
  2. get
    显示一个或更多 resource
     -o wide 可以查看扩展信息
    1) 获取 pod 信息
    $ kubectl get pods  -n=test-online 等价 kubectl get pods  --namespace=test-online
    NAME                  READY   STATUS    RESTARTS   AGE
    web-96d5df5c8-4q4vx   1/1     Running   0          62m
    $ kubectl get pods  --namespace=test-online  -o wide
    NAME                  READY   STATUS    RESTARTS   AGE   IP            NODE                              NOMINATED NODE   READINESS GATES
    web-96d5df5c8-4q4vx   1/1     Running   0          63m   10.244.1.15   test02.i.xxx.net   <none>           <none> 
    
    jsonpath 可以查看pod信息指定key的数据,若直接为"{}", 则返回一个未格式化的大json字符串
    $ kubectl get pod  web-96d5df5c8-4q4vx -o jsonpath="{.metadata.labels}"
    {"app":"web","pod-template-hash":"96d5df5c8"}
    
    2) 查看 configmap 信息
    $ kubectl get configmap  -n=kube-public
    NAME           DATA   AGE
    cluster-info   1      3d23h
    
    3)查看node信息,并显示label
    kubectl get node -A --show-labels
    4)查看ns信息
    kubectl get ns(或者 namespaces)
    
  3. edit
    在服务器上编辑一个资源
    1) 编辑 deployment my-web
    kubectl edit deployment/my-web
    2) 编辑 pod nginx2
    kubectl edit pod nginx2 [-o json 以json格式编辑]
    
  4. delete
    Delete resources by filenames, stdin, resources and names, or by resources and label selector
    1) 删除pod nginx2
    kubectl delete pod nginx2
    2) 删除ns test-online2
    kubectl delete namespace test-online2
    或者 
    kubectl delete -f test-online2.yaml(1.1 创建ns中的yaml)
    

3 Deploy Commands

  1. rollout
    Manage the rollout of a resource
    1) 回滚到前一个版本
    kubectl rollout undo deployment/my-web 
    2)查看回滚历史记录
    kubectl rollout history deployment/my-web
    
  2. scale
    Set a new size for a Deployment, ReplicaSet or Replication Controller
    kubectl scale --replicas=2 deployment/my-web
    
  3. autoscale
    自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
    kubectl autoscale deployment my-web --min=2 --max=3
    此时可以通过hpa 查看pod数量,若再次scale为1,则过一会儿会自动伸缩为2
    $ kubectl get hpa
    NAME     REFERENCE           TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    my-web   Deployment/my-web   <unknown>/80%   2         3         2          111s
    若想取消自动伸缩,则直接delete hpa 即可 :
    kubectl delete hpa my-we
    
    使用autoscale后发现报错:failed to get cpu utilization: missing request for cpu,对应上述TARGETS中的unknown;
    错误原因:创建deployment时候没有设置cpu request信息;
    此时设置 spec.containers.resources 为如下内容即可:
          resources: 
            requests:
              cpu: "50m"
              memory: "50Mi"
    注意:cpu 带单位的时候必须带双引号,内存有单位必须带双引号;
    
    设置cpu 和 memory 后,再配置hpa: kubectl autoscale deployment my-web --cpu-percent=15 --min=2 --max=3
    $ kubectl  get hpa
    NAME     REFERENCE           TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    my-web   Deployment/my-web   1%/15%    2         3         2          88s
    此时在另外一个pod里面持续访问ubuntu-flask服务,就会发现cpu使用率在逐渐增加,当大于15%的时候就会开始扩容了;当请求访问完成后cpu降低了,过一段时间又缩容为2(约5min后缩容为2,cpu降低后不会立马缩容回来,主要为了防止流量又立刻突增)for i in {1..1000};do wget http://10.1.175.63:5000/hello ;sleep 0.1;done
    
    Kubernetes:HPA 详解-基于 CPU、内存和自定义指标自动扩缩容

4 Cluster Management Commands

  1. certificate
    修改 certificate 资源.
  2. cluster-info
    显示集群信息
    1) 查看集群基础信息,包括master 和kubedns
    $ kubectl cluster-info 
    Kubernetes master is running at https://10.120.75.102:6443
    KubeDNS is running at https://10.120.75.102:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    2) 诊断集群
    kubectl cluster-info dump
    输出很多集群诊断信息
    
  3. top
    Display Resource (CPU/Memory/Storage) usage.
    kubectl top node [node-name 查看指定node的cpu mem信息] # (不指定node-name)显示所有节点cpu 内存使用情况
    kubectl top pod -A # 显示所有pod 的cpu 和 内存使用情况
    
  4. cordon
    标记 node 为 unschedulable
    kubectl cordon node-name 
    标记不可调度后,get nodes 发现 status 变为 Ready,SchedulingDisabled 
    
  5. uncordon
    标记 node 为 schedulable
    kubectl uncordon node-name 
    
  6. drain
    Drain node in preparation for maintenance
    该操作为驱逐或者删除node上的pod,常见常见为磁盘爆了会出现pod被驱逐现象
    $ kubectl drain node-name
    
  7. taint
    更新一个或者多个 node 上的 taints
    1) 将node01 设置污点,使其不可调度(若已有disktype标签,则会更新value为ssd,没有则添加标签)
    kubectl taint node node01 disktype=ssd:NoSchedule
    默认情况下,kubeadm 中的master就被设置为 node-role.kubernetes.io/master:NoSchedule ,因此一般的实例 master 是无法被调度到master上的;
    若通过tant ndoe master-name node-role.kubernetes.io/master:NoSchedule- 去掉污点,则master也可以被调度
    2)去掉taints,恢复node01位可调度
    kubectl taint node node01 disktype:NoSchedule-
    

5 Troubleshooting and Debugging Commands

  1. describe
    显示一个指定 resource 或者 group 的 resources 详情

    1) 查看指定ns下的pod详细信息,当pod无法正常拉起的时候可以通过这种方式排错
    kubectl -n test-online describe po my-web-7d99c588c5-tp5z5
    2) 查看 node详细信息
    kubectl describe nodes node_name
    该命令会返回 Name,Roles,Labels,Annotations,Conditions,Capacity(cpu,内存,存储)、Events(可以用于排错)等重要信息;
    
  2. logs
    输出容器在 pod 中的日志

    1) 输出指定pod 的日志
    kubectl logs web-96d5df5c8-mj4r6
    2)输出指定pod的最后2行日志
    kubectl --tail=2 logs web-96d5df5c8-mj4r6
    3)输出最近10小时的日志
    kubectl --since=10h logs web-96d5df5c8-mj4r6
    
  3. attach
    Attach 到一个运行中的 container

  4. exec
    在一个 container 中执行一个命令;
    当前同时支持 pod cmd 和 pod -- cmd模式,后续会抛弃pod cmd 模式;

    1) 单个容器
    $ kubectl exec web-96d5df5c8-4q4vx  -- hostname
    web-96d5df5c8-4q4vx
    2)多个容器, 通过  -c container_name 来选择接入哪个容器
    kubectl -n test-online exec my-web-698c8ccc85-qxh9l  -c flask-app -- bash
    
  5. port-forward
    Forward one or more local ports to a pod

  6. proxy
    运行一个 proxy 到 Kubernetes API server

  7. cp
    复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.

    1) 拷贝文件a.txt 到指定ns的 pod web-96d5df5c8-mj4r6 中 
    $ kubectl cp a.txt -n test-online web-96d5df5c8-mj4r6:/
    $ kubectl exec -n test-online web-96d5df5c8-mj4r6 -- cat /a.txt
    This is a.txt
    2)从指定 ns 的 pod web-96d5df5c8-mj4r6 中拷贝文件到本地
    拷贝文件到本地 a.txt, 注意此处 :a.txt 不能写为 :/a.txt, 因为当前不支持绝对路径,后面本地不可以写为 具体路径,只需要写一个名称即可
    kubectl cp test-online/web-96d5df5c8-mj4r6:a.txt a.txt
    拷贝pod 中文件加 dir为本地文件夹dir:
    kubectl cp test-online/web-96d5df5c8-mj4r6:dir dir
    3) 通过-c指定pod中某个容器
    $ kubectl -n xxx-iserving cp videomocap-service-5f8864d648-rgpj6:output/logs logs -c videomocap-service
    将命令将该服务videomocap-service容器workdir的output/logs 拷贝到当前logs目录。
    

    注意
    k8s 中的cp 暂时不支持绝对路径(pod_name:/a.txt 会报错),默认路径为work dir的路径;
    若没有通过-c container_name 来指定容器,则默认将 文件拷贝到第一个容器中;

  8. auth
    Inspect authorization

6 Advanced Commands

  1. diff
    Diff live version against would-be applied version
  2. apply
    通过文件名或标准输入流(stdin)对资源进行配置
    1) 创建deployment|pod|service 等资源
     将资源配置详信息写到 yaml中,通过 -f 指定文件即可创建相关资源;
     kubectl apply -f dployment-my-web.yaml
    
  3. patch
    使用 strategic merge patch 更新一个资源的 field(s)
  4. replace
    通过 filename 或者 stdin替换一个资源
  5. wait
    Experimental: Wait for a specific condition on one or many
    resources.
  6. convert
    在不同的 API versions 转换配置文件
  7. kustomize
    Build a kustomization target from a directory or a remote url.

7 Settings Commands

  1. label
    更新在这个资源上的 labels
    默认情况下,master节点角色为master,其它节点角色为none,可以通过如下方式将其它节点标记为node1角色
    $ kubectl label nodes node_name node-role.kubernetes.io/node1=
    删除标(将最后的=改为-即可)
    $ kubectl label nodes node_name node-role.kubernetes.io/node1-
    
  2. annotate
    更新一个资源的注解
  3. completion
    Output shell completion code for the specified shell (bash or zsh)
    linux:
    source <(kubectl completion bash)
    mac:
    source <(kubectl completion zsh)
    

8 Other Commands

  1. alpha
    Commands for features in alpha
  2. api-resources
    Print the supported API resources on the server
  3. api-versions
    Print the supported API versions on the server, in the form of “group/version”
  4. config
    修改 kubeconfig 文件
    修改默认 ns 为test-online(k8s 默认的为default ns)
    kubectl config set-context $(kubectl config current-context) --namespace=test-online
    
  5. plugin
    Provides utilities for interacting with plugins.
  6. version
    输出 client 和 server 的版本信息
  7. 设置kubectl 自动补全
    apt-get install bash-completion
    source /usr/share/bash-completion/bash_completion
    source <(kubectl completion bash)
    注意:<( 之间不能有空格,否则会报错
    

9 说明

docs/reference/kubectl/overview/
kubectl/kubectl-commands

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐