• Kubernetes集群管理工具kubectl命令技巧大全


    一. kubectl概述

    Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

    kubectl命令的语法如下所示:

    kubectl [command] [TYPE] [NAME] [flags]
    
    • comand:指定要在一个或多个资源执行,例如操作create,get,describe,delete。

    • TYPE:指定资源类型,资源类型不区分大小写,您可以指定单数,复数或缩写形式。例如,以下命令产生相同的输出:

    kubectl get pod pod1 
    kubectl get pods pod1 
    kubectl get po pod1
    
    • NAME:指定资源的名称,名称区分大小写。如果省略名称,则显示所有资源的详细信息,例如:
    kubectl get pods
    
    • flags:指定可选的参数。例如,可以使用-s或者–server参数指定Kubernetes API server的地址和端口。

    注意:在命令行中指定的标志将覆盖默认值和任何相应的环境变量。

    如果需要帮助,可以通过kubectl help命令获取更多的信息。

    二. kubectl操作的简短说明和常规语法

    Basic Commands (Beginner):
      create         从文件或标准输入创建一个或多个资源
      expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
    Kubernetes Service
      run            在集群中运行一个指定的镜像
      set            为 objects 设置一个指定的特征
     
    Basic Commands (Intermediate):
      explain        查看资源的文档
      get            显示一个或更多 resources
      edit           使用默认编辑器编辑和更新服务器上一个或多个资源的定义
      delete         从文件,stdin或指定标签选择器,名称,资源选择器或资源中删除资源
     
    Deploy Commands:
      rollout        通过逐渐替换指定的复制控制器及其容器来执行滚动更新
      scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
      autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
     
    Cluster Management Commands:
      certificate    修改 certificate 资源
      cluster-info   显示集群信息
      top            Display Resource (CPU/Memory/Storage) usage.
      cordon         标记 node 为 unschedulable
      uncordon       标记 node 为 schedulable
      drain          Drain node in preparation for maintenance
      taint          更新一个或者多个 node 上的 taints
     
    Troubleshooting and Debugging Commands:
      describe       显示一个指定 resource 或者 group 的 resources 详情
      logs           输出容器在 pod 中的日志
      attach         Attach 到一个运行中的 container
      exec           在一个 container 中执行一个命令
      port-forward   Forward one or more local ports to a pod
      proxy          运行一个 proxy 到 Kubernetes API server
      cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
      auth           Inspect authorization
     
    Advanced Commands:
      apply          通过文件名或标准输入流(stdin)对资源进行配置
      patch          使用 strategic merge patch 更新一个资源的 field(s)
      replace        通过 filename 或者 stdin替换一个资源
      wait           Experimental: Wait for one condition on one or many resources
      convert        在不同的 API versions 转换配置文件
     
    Settings Commands:
      label          更新在这个资源上的 labels
      annotate       更新一个资源的注解
      completion     Output shell completion code for the specified shell (bash or zsh)
     
    Other Commands:
      alpha          Commands for features in alpha
      api-resources  Print the supported API resources on the server
      api-versions   Print the supported API versions on the server, in the form of "group/version"
      config         修改 kubeconfig 文件
      plugin         Runs a command-line plugin
      version        输出 client 和 server 的版本信息
    

    有关命令操作的更多信息,请参见kubectl官方参考文档

    三. kubectl常用命令

    kubectl作为kubernetes的命令行工具,主要的职责就是对集群中的资源的对象进行操作,这些操作包括对资源对象的创建、删除和查看等。

    四. kubectl输出选项

    所有kubectl命令的默认输出格式是人类可读的纯文本格式。要以特定格式将详细信息输出到终端窗口,可以将-o--output标志添加到受支持的kubectl命令中,例:

    kubectl [command] [TYPE] [NAME] -o=<output_format>
    

    根据kubectl操作,支持以下输出格式

    输出格式 描述
    -o custom-columns= spec 使用逗号分隔的自定义列列表打印表。
    -o custom-columns-file=filename 使用文件中的自定义列模板打印表
    -o json 输出JSON格式的API对象。
    -o jsonpath=template 打印在jsonpath表达式中定义的字段。
    -o jsonpath-file=filename 打印文件中jsonpath表达式定义的字段
    -o name 仅打印资源名称,而不打印其他任何内容。
    -o wide 以纯文本格式输出,并带有任何其他信息。对于Pod,包含节点名称。
    -o yaml 输出YAML格式的API对象。

    示例:

    以下命令将单个pod的详细信息输出为YAML格式的对象

    kubectl get pod web-pod-13je7 -o yaml
    

    五. kubectl常用命令示例

    1、kubectl create命令

    此命令通过文件或者stdin创建一个资源对象,假设这里存在一个nginx部署的YAML配置文件,可以通过执行下面的命令创建部署对象。

    kubectl create -f nginx-deployment.yaml
    

    nginx部署的YAML配置文件的示例代码如下:

    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: nginx
      revisionHistoryLimit: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          imagePullSecrets:
            - name: dc-hspfd
          containers:
          # 应用的镜像
          - image: nginx
            name: nginx
            imagePullPolicy: IfNotPresent
            # 应用的内部端口
            ports:
            - containerPort: 80
              name: nginx80
            # 持久化挂接位置,在docker中      
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: nginx-data
            - mountPath: /etc/nginx
              name: nginx-conf
          volumes:
          # 宿主机上的目录
          - name: nginx-data
            nfs:
              path: /nfs/nginx
              server: 192.168.1.10
          - name: nginx-conf
            nfs:
              path: /k8s-nfs/nginx/conf
              server: 192.168.1.10
    

    Kubernetes 清单可以用 json 或 yaml 来定义。使用的文件扩展名包括 .yaml, .yml 和 .json。

    kubectl create -f ./my-manifest.yaml           # 创建资源
    kubectl create -f ./my1.yaml -f ./my2.yaml     # 从多个文件创建资源
    kubectl create -f ./dir                        # 通过目录下的所有清单文件创建资源
    kubectl create -f https://git.io/vPieo         # 使用 url 获取清单创建资源
    kubectl run nginx --image=nginx                # 开启一个 nginx 实例
    kubectl explain pods,svc                       # 获取 pod 和服务清单的描述文档
    
    • 通过标准输入创建多个 YAML 对象
    cat <<EOF | kubectl create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox-sleep
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "1000000"
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox-sleep-less
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "1000"
    EOF
    

    2、kubectl get 命令

    通过此命令列出一个或多个资源对象,在这里通过kubectl get命令获取default命名空间下的所有部署。

    kubectl get deployment
    # 具有基本输出的 get 命令
    kubectl get services                          # 列出命名空间下的所有 service
    kubectl get pods --all-namespaces             # 列出所有命名空间下的 pod
    kubectl get pods -o wide                      # 列出命名空间下所有 pod,带有更详细的信息
    kubectl get deployment my-dep                 # 列出特定的 deployment
    kubectl get pods --include-uninitialized      # 列出命名空间下所有的 pod,包括未初始化的对象
     
    # 有详细输出的 describe 命令
    kubectl describe nodes my-node
    kubectl describe pods my-pod
     
    kubectl get services --sort-by=.metadata.name # List Services Sorted by Name
    
    # 根据重启次数排序,列出所有 pod
    kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
     
    # 查询带有标签 app=cassandra 的所有 pod,获取它们的 version 标签值
    kubectl get pods --selector=app=cassandra rc -o 
      jsonpath='{.items[*].metadata.labels.version}'
    
    # 获取命名空间下所有运行中的 pod
    kubectl get pods --field-selector=status.phase=Running
     
    # 所有所有节点的 ExternalIP
    kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
    

    3、kubectl describe命令

    此命令用于显示一个或多个资源对象的详细信息,在这里通过获取上述nginx部署的信息。

    kubectl describe deployments/nginx
    

    4、kubectl exec命令

    此命令用于在Pod中的容器上执行一个命令,此处在nginx的一个容器上执行/bin/bash命令。

    kubectl exec -it nginx-c5cff9dcc-dr88w /bin/bash
    

    5、kubectl logs命令

    此命令用于获取Pod中一个容器的日志信息,此处获取nginx一个容器的日志信息。

    kubectl logs nginx-c5cff9dcc-dr88w
    

    6、kubectl delete命令

    此命令用于删除集群中已存在的资源对象,可以通过指定名称、标签选择器、资源选择器等。

    kubectl delete -f ./pod.json                                              # 使用 pod.json 中指定的类型和名称删除 pod
    kubectl delete pod,service baz foo                                        # 删除名称为 "baz" 和 "foo" 的 pod 和 service
    kubectl delete pods,services -l name=myLabel                              # 删除带有标签 name=myLabel 的 pod 和 service
    kubectl delete pods,services -l name=myLabel --include-uninitialized      # 删除带有标签 name=myLabel 的 pod 和 service,包括未初始化的对象
    kubectl -n my-ns delete po,svc --all                                      # 删除命名空间 my-ns 下所有的 pod 和 service,包括未初始化的对象
    

    7、kubectl edit 命令

    使用默认编辑器 编辑服务器上定义的资源。

    使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式。

    文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项。

    语法:

    kubectl edit (RESOURCE/NAME | -f FILENAME)
    

    示例:

    # 编辑名为“docker-registry”的service
    kubectl edit svc/docker-registry
    
    # 使用一个不同的编辑器
    KUBE_EDITOR="nano" kubectl edit svc/docker-registry
    
    # 编辑名为“docker-registry”的service,使用JSON格式、v1 API版本
     kubectl edit svc/docker-registry --output-version=v1 -o json
    

    选项:

      -f, --filename=[]: 用来指定待编辑资源的文件名,目录名或者URL。
      -o, --output="yaml": 输出格式,可选yaml或者json中的一种。
           --output-version="": 输出资源使用的API版本(默认使用api-version)。
    

    8、kubectl rolling-update 命令

    此命令用于滚动更新,对镜像、端口等的更新

    kubectl rolling-update frontend-v1 -f frontend-v2.json           # 滚动更新 pod:frontend-v1
    kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2  # 变更资源的名称并更新镜像
    kubectl rolling-update frontend --image=image:v2                 # 更新 pod 的镜像
    kubectl rolling-update frontend-v1 frontend-v2 --rollback        # 中止进行中的过程
    at pod.json | kubectl replace -f -                              # 根据传入标准输入的 JSON 替换一个 pod
    

    9、node 和集群管理

    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                                                  # #显示 master 和 service 的地址
    kubectl cluster-info dump                                             # #将集群的当前状态转储到标准输出
    kubectl cluster-info dump --output-directory=/path/to/cluster-state   # #将集群的当前状态转储到目录 /path/to/cluster-state
     
    # 如果带有该键和效果的污点已经存在,则将按指定的方式替换其值
    kubectl taint nodes foo dedicated=special-user:NoSchedule
    

    参考资料

    1.《kubectl概述》:https://kubernetes.io/docs/reference/kubectl/overview/#syntax

    2.《kubectl命令概述》:https://kubernetes.io/docs/reference/kubectl/overview/#syntax

  • 相关阅读:
    chm打开看不到内容时好时坏
    pugixml应用随笔
    鸟哥书:记一笔
    c++ stl list使用总结(转)
    增加swap分区
    复制虚拟机,链接网络问题:没有找到合适的设备:没有找到可用于链接System eth0 的
    Python编码相关文章推荐
    Python Counter() 的实现
    Python Counter()计数工具
    浏览器自动化工具-Selenium
  • 原文地址:https://www.cnblogs.com/Aaron-23/p/13036917.html
Copyright © 2020-2023  润新知