Kubernetes-kubectl命令行工具

1、kubectl概述

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。运行kubectl命令的语法如下所示:

$ kubectl [command] [TYPE] [NAME] [flags]

这里的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命令获取更多的信息。

1.1 kubectl的操作

kubectl作为kubernetes的命令行工具,主要的职责就是对集群中的资源的对象进行操作,这些操作包括对资源对象的创建、删除和查看等。下表中显示了kubectl支持的所有操作,以及这些操作的语法和描述信息:

操作 语法 描述
annotate kubectl annotate (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] 添加或更新一个或多个资源的注释
api-versions kubectl api-versions [flags] 列出可用的API版本
apply kubectl apply -f FILENAME [flags] 将来自于文件或stdin的配置变更应用到主要对象中。
attach kubectl attach POD -c CONTAINER [-i] [-t] [flags] 连接到正在运行的容器上,以查看输出流或与容器交互(stdin)。
autoscale kubectl autoscale (-f FILENAME \| TYPE NAME \| TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU] [flags] 自动扩宿容由副本控制器管理的Pod。
cluster-info kubectl cluster-info [flags] 显示群集中的主节点和服务的的端点信息。
config kubectl config SUBCOMMAND [flags] 修改kubeconfig文件。
create kubectl create -f FILENAME [flags] 从文件或stdin中创建一个或多个资源对象。
delete kubectl delete (-f FILENAME \| TYPE [NAME \| /NAME \| -l label \| –all]) [flags] 删除资源对象。
describe kubectl describe (-f FILENAME \| TYPE [NAME_PREFIX \| /NAME \| -l label]) [flags] 显示一个或者多个资源对象的详细信息。
edit kubectl edit (-f FILENAME \| TYPE NAME \| TYPE/NAME) [flags] 通过默认编辑器编辑和更新服务器上的一个或多个资源对象。
exec kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [– COMMAND [args…]] 在Pod的容器中执行一个命令。
explain kubectl explain [–include-extended-apis=true] [–recursive=false] [flags] 获取Pod、Node和服务等资源对象的文档。
expose kubectl expose (-f FILENAME \| TYPE NAME \| TYPE/NAME) [–port=port] [–protocol=TCP\|UDP] [–target-port=number-or-name] [–name=name] [—-external-ip=external-ip-of-service] [–type=type] [flags] 为副本控制器、服务或Pod等暴露一个新的服务。
get kubectl get (-f FILENAME \| TYPE [NAME \| /NAME \| -l label]) [–watch] [–sort-by=FIELD] [[-o \| –output]=OUTPUT_FORMAT] [flags] 列出一个或多个资源。

 

label kubectl label (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags] 添加或更新一个或者多个资源对象的标签。
logs kubectl logs POD [-c CONTAINER] [–follow] [flags] 显示Pod中一个容器的日志。
patch kubectl patch (-f FILENAME \| TYPE NAME \| TYPE/NAME) –patch PATCH [flags] 使用策略合并补丁过程更新资源对象中的一个或多个字段。
port-forward kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT […[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] 将一个或多个本地端口转发到Pod。
proxy kubectl proxy [–port=PORT] [–www=static-dir] [–www-prefix=prefix] [–api-prefix=prefix] [flags] 为kubernetes API服务器运行一个代理。
replace kubectl replace -f FILENAME 从文件或stdin中替换资源对象。
rolling-update kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] –image=NEW_CONTAINER_IMAGE \| -f NEW_CONTROLLER_SPEC) [flags] 通过逐步替换指定的副本控制器和Pod来执行滚动更新。
run kubectl run NAME –image=image [–env=”key=value”] [–port=port] [–replicas=replicas] [–dry-run=bool] [–overrides=inline-json] [flags] 在集群上运行一个指定的镜像。
scale kubectl scale (-f FILENAME \| TYPE NAME \| TYPE/NAME) –replicas=COUNT [–resource-version=version] [–current-replicas=count] [flags] 扩宿容副本集的数量。
version kubectl version [–client] [flags] 显示运行在客户端和服务器端的Kubernetes版本。

1.2 资源对象类型

在kubernetes中,提供了很多的资源对象,开发和运维人员可以通过这些对象对容器进行编排。在下表中,是kubectl所支持的资源对象类型,以及它们的缩略别名:

资源对象类型 缩略别名
apiservices
certificatesigningrequests csr
clusters
clusterrolebindings
clusterroles
componentstatuses cs
configmaps cm
controllerrevisions
cronjobs
customresourcedefinition crd
daemonsets ds
deployments deploy
endpoints ep
events ev
horizontalpodautoscalers hpa
ingresses ing
jobs
limitranges limits
namespaces ns
networkpolicies netpol
nodes no
persistentvolumeclaims pvc
persistentvolumes pv
poddisruptionbudget pdb
podpreset
pods po
podsecuritypolicies psp
podtemplates
replicasets rs
replicationcontrollers rc
resourcequotas quota
rolebindings
roles
secrets
serviceaccounts sa
services svc
statefulsets
storageclasses

1.3 输出选项

kubectl默认的输出格式为纯文本格式,可以通过-o或者–output字段指定命令的输出格式。

$ kubectl [command] [TYPE] [NAME] -o=<output_format>
输出格式 描述
-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对象,将会包含Node名称。
-o=yaml 输出YAML格式的API对象

2、kubectl安装部署

2.1 安装kubectl

1)下载kubectl

此处是在windows下安装,因此下载kubectl.exe,下载地址:https://storage.googleapis.com/kubernetes-release/release/v1.9.0/bin/windows/amd64/kubectl.exe

并将kubectl.exe所在的地址添加至Windows的环境变量的Path中。

其他操作系统下安装kubectl,请参考:https://kubernetes.io/docs/tasks/tools/install-kubectl/#tabset-2

2)配置kubeconfig文件

RKE会在配置文件所在的目录下部署一个本地文件,该文件中包含kube配置信息以连接到新生成的群集。

默认情况下,kube配置文件被称为.kube_config_cluster.yml。将这个文件复制到你的本地~/.kube/config,就可以在本地使用kubectl了。

需要注意的是,部署的本地kube配置名称是和集群配置文件相关的。例如,如果您使用名为mycluster.yml的配置文件,则本地kube配置将被命名为.kube_config_mycluster.yml。

2.2 验证

执行kubectl命令,获取nodes的信息:

$ kubectl get nodes

3、kubectl的常用命令示例

在此部分将提供常用命令的示例,已帮助您快速了解和试用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: /k8s-nfs/nginx
          server: 192.168.8.150
      - name: nginx-conf
        nfs:
          path: /k8s-nfs/nginx/conf
          server: 192.168.8.150

2)kubectl get 命令

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

3)kubectl describe命令

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

$ kubectl describe deployments/nginx

4)kubectl exec命令

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

$ kubectl exec -it nginx-5847748bf9-49k5k /bin/bash

5)kubectl logs命令

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

$ kubectl logs nginx-5847748bf9-49k5k

6)kubectl delete命令

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

$ kubectl delete deployments/nginx

 

参考资料

1.《kubectl Usage Conventions》地址:https://kubernetes.io/docs/reference/kubectl/conventions/

2.《kubectl Commands》地址:https://kubernetes.io/docs/reference/kubectl/kubectl-cmds/

3.《Overview of kubectl》地址:https://kubernetes.io/docs/reference/kubectl/overview/

 

作者简介:
季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

K8S中文社区微信公众号