1.什么是Kubectl

Kubernetes API是管理其各种资源对象的唯一入口,它提供了一个RESTful风格的CRUD(Create、Read、Update和Delete)接口用于查询和修改集群状态,并将结果存储于集群状态存储系统etcd中。事实上,API server也是用于更新etcd中资源对象状态的唯一途径。

API Server是Kubernetes集群的网关,用户和管理员以及其他客户端仅能通过此网关接口与集群进行交互。API是面向程序员的访问接口,目前可较好地支持Golang和Python编程语言,当然,终端用户更为常用的是通用命令行工具kubectl。

image-20200707135411068

2.Kubectl 操作方式

kubectl的核心功能在于通过API Server操作Kubernetes的各种资源对象,它支持三种操作方式。分别是: 直接命令式、命令式对象配置、声明式配置。其中直接命令式的使用最为简便。

2.1 直接命令式

直接通过kubectl命令及相关的选项创建资源对象的方式即为直接命令式操作,例如下面的命令分别创建了名为nginx-deploy的Deployment控制器资源对象,以及名为nginx-svc的Service资源对象。

# 创建了名为nginx-deploy的Deployment控制器资源对象,并设置副本数为2
$ kubectl run nginx-deploy --image=nginx:1.12 --replicas=2

# 创建名为nginx-svc的Service资源对象
$ kubectl expose deployment/nginx --name=nginx-src --port=80

2.2 命令式对象配置

假设定义了Deployment对象的nginx-deploy.yaml文件,和定义了Service对象的nginx-svc.yaml文件。使用 kubectl create 命令即可进行基于命令式对象配置文件的创建操作:

$ kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml

2.3 声明式配置

由kubectl自行确定,用户只需要声明期望的状态,这种方式称为声明式对象配置。例如,假设存在定义了Deployment对象的nginx-deploy.yaml文件,以及定义了Service对象的nginx-svc.yaml文件,那么使用 kubectl apply 命令即可实现声明式配置:

$ kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml

3.Kubectl 常用

3.1 查看资源对象

  • 查看系统中所有的Namespance对象
[root@master nginx]# kubectl get namespace
NAME STATUS AGE
app-default Active 11d
default Active 11d
kube-node-lease Active 11d
kube-public Active 11d
kube-system Active 11d
  • 查看多个资源

    用户也可一次查看多个资源类别下的资源对象,例如,列出默认名称空间内的所有Pod和Service对象,并输出额外信息,可以使用如下形式的kubectl get命令

$ kubectl get pods,services -o wide
  • 查看某命名空间下的资源

​ 列出kube-namespace名称空间中拥有k8s-app标签名称的所有Pod对象

$ kubectl get pods -n kube-system k8s-app
  • 实时查看资源创建状态
$ kubectl get deployment -o wide --watch

3.2 打印资源详情

每个资源对象都包含着用户期望的状态(Spec)和现有的实际状态(Status)两种状态信息,kubectl get -o { yaml|josn } kubectl describe命令都能够打印出指定资源对象的详细描述信息。

  • 使用kubectl get -o { yaml|josn } 查看

    # 查看kube-system名称空间中拥有标签component=kube-apiserver的Pod对象的资源配置清单(期望的状态)及当前的状态信息。
    $ kubectl get pods -l component=kube-apiserve -o yaml -n kube-system
  • 使用 kubectl describe 查看

    kubectl describe命令能显示与当前对象相关的其他资源对象。

    # 查看kube-system名称空间中拥有标签component=kube-apiserver的Pod对象的详细描述信息
    $ kubectl describe pods -l component=kube-apiserve -o yaml -n kube-system

这两个命令都支持以TYPE NAMETYPE/NAME的格式指定具体的资源对象,如pods kube-apiserver-master.ilinux.iopods/kube-apiserver-master.ilinux.io

3.3 打印容器中的日志

通常一个容器中仅会运行一个进程(及其子进程),此进程作为PID为1的进程接收并处理管理信息,同时将日志直接输出至终端中,而无须再像传统的多进程系统环境那样将日志保存于文件中,因此容器日志信息的获取一般要到其控制上进行。

kubectl logs命令可打印Pod对象内指定容器的日志信息,命令格式为:

kubectl logs  [-f] [-p] (POD|TYPE/NAME) [-cCONTAINER] [options]

若Pod对象内仅有一个容器,则 -c 选项及容器名为可选。

  • 使用示例

    # 查看名称空间 kube-system 中仅有一个容器的Pod对象kube-apiserver-master.ilinux.io的日志
    $ kubectl logs kube-apiserver-master.ilinux.io -n kube-system

    为上面的命令添加-f 选项,还能用于持续监控指定容器中的日志输出,其行为类似于使用了 -f 选项的tail命令。

3.4 在容器中执行命令

kubectl exec命令是用于在指定的容器内运行其他应用程序的命令。

  • 使用示例

    # 在 kube-system名称空间中的Pod对象 kube-apiserver-master.ilinux.io 上的唯一容器中运行 ps 命令
    $ kubectl exec kube-apiserver-master.ilinux.io -n kube-system -- ps

    注意,若Pod对象中存在多个容器,则需要以  -c  选项指定容器后再运行。

3.5 删除资源对象

使命已经完成或存在错误的资源对象可使用kubectl delete命令予以删除,不过,对于受控于控制器的对象来说,删除之后其控制器可能会重建出类似的对象,例如,Deployment控制器下的Pod对象在被删除时就会被重建。

  • 使用示例

    # 删除默认名称空间中名为 nginx-svc 的Service资源对象
    $ kubectl delete services nginx-svc

    # 删除kube-system名称空间中拥有标签 app=kube-proxy 的所有Pod对象
    $ kubectl delete pods -l app=kube-proxy -n kube-system

若要删除指定名称空间中的所有的某类对象,可以使用 kubectl delete TYPE --all -n NS命令。

  • 使用示例

    # 删除 kube-public 名称空间中的所有Pod对象
    $ kubectl delete pods --all -n kube-public

kubect-del

有些资源类型(如Pod),支持优雅删除的机制,它们有着默认的删除宽限期,不过,用户可以在命令中使用--grace-period选项或 --now 选项来覆盖默认的宽限期。

4. Kubectl子命令

kubectl子命令

5. Kubectl get 输出格式

kubect-get-out

6. kubcetl create 和 kubectl apply的区别?

kubectl create:

  • kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的。

  • kubectl create命令,用同一个yaml 文件执行替换replace命令,将会不成功,fail掉。

kubectl apply:

  • kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性