kubectl的核心功能在于通过API Server操作kubernetes的各种资源对象,它支持三种操作方式,其中直接命令式(Imperative commands)的使用最为简便,是了解k8s集群管理的一种有效途径;

Kubectl 命令常用操作示例

1.创建资源对象

  • 直接通过kubectl命令及相关的选项创建资源对象的方式即为直接命令式操作,例如下面的命令分别创建了名为nginx的pod控制器资源对象,以及名为nginx-svc的Service对象:
    1. kubectl run nginx --image=nginx:1.16
    2. kubectl expose pod/nginx --name=nginx-svc --port=80
  • 用户也可以根据资源清单创建资源对象,即命令式对象配置文件,例如,存在定义了Deployment对象的nginx-deploy.yaml文件,和定义了Service对象的nginx-svc.yaml文件,使用 kubectl create 命令即可进行基于命令式对象配置文件的创建操作:
    kubectl create deployment --image=nginx:1.16 deploy-nginx
    kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml
    
  • 还可以将创建交由kubectl自行确定,用户只需要声明期望的状态,这种方式称为声明式对象配置。使用 kubectl apply 命令即可实现声明式配置:
    kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml
    

2.查看资源对象

  • 运行着实际负载的k8s系统上通常会存在多种资源对象,用户可分类列出感兴趣的资源对象及其相关的状态信息,kubectl get 正式用于完成此类功能的命令。例如,列出系统上所有的Namespace资源对象:
    kubectl get namespaces/ns
    
  • 也可一次查看多个资源类别下的资源对象,例如,列出默认名称空间内的所有Pod和Service对象,并输出额外信息:
    kubectl get pods,services/svc -o wide
    
  • k8s系统的大部分资源都隶属于某个Namespace对象,缺省的名称空间为default,若需要获取指定Namespace中的资源对象信息,需要使用-n或—namespace指明。例如:列出kube-namespace名称空间中拥有k8s-app标签名称的所有Pod对象:
    kubectl get pods -l k8s-app -n kube-system
    

3.打印资源对象的详细信息

  • 每个资源对象都包含着 用户期望的状态(Spec)现有的实际状态(Status) 两种状态信息,kubect get -o {yaml|json}kubectl describe 命令都能够打印出指定资源对象的详细描述信息。例如,查看kube-system名称空间中拥有标签component=kube-apiserver的Pod对象的资源配置清单的状态信息,并输出为yaml格式:
    kubectl get pods -l component=kube-apiserver -o yaml -n kube-system
    
  • kubectl describe 能显示与当前对象的其他资源对象,如Event或Controller等:
    kubectl describe pods -l component=kube-apiserver -n kube-system
    

4.打印容器中的日志信息

  • kubectl logs 命令可打印Pod对象内指定容器的日志信息,命令格式为 kubectl logs [-f] [-p] (POD|TYPE/NAME) [-c CONTAINER] [options], 若Pod对象内仅有一个容器,则 -c 选项及容器名为可选。例如,查看名称空间kube-system中仅有一个容器的Pod对象kube-apiserver-master的日志:
    kubectl logs -n kube-system kube-apiserver-master
    


为上面命令添加 -f 选项,能用于持续监控指定容器中的日志输出。

5.在容器中执行命令

  • kubectl exec 命令用于在指定的容器内运行其他应用程序的命令,例如,在kube-system 名称空间中的Pod对象kube-apiserver-master上的唯一容器中运行ps命令:
    kubectl exec kube-apiserver-master -n kube-system -- ps
    


注意:若Pod对象中存在多个容器,则需要以-c选项指定容器后再运行;
进入到pod的容器内,进行交互式命令:

kubectl exec -it kube-apiserver-master -n kube-system -- /bin/bash

6.删除资源对象

  • 使命已经完成或存在错误的资源对象可使用 kubectl delete 命令予以删除,不过,对于受控于控制器的对象来说,删除之后其控制器可能会重建出类似的对象。例如,删除默认名称空间中名为nginx-svc的Service资源对象:
    kubectl delete services nginx-svc
    
  • 例如,删除kube-system名称空间中拥有标签 app=monitor 的所有Pod对象:
    kubectl delete pods -l app=monitor -n kube-sytem
    
  • 例如,删除指定名称空间下的所有的某类对象,可以使用 kubectl delet TYPE —all -n NS:
    kubectl delete pods --all -n kube-public
    
  • 还可以指定文件来删除:
    kubectl delete -f nginx-deploy.yaml
    

7.部署Service对象

  • kubectl expose 命令可用于创建Service对象以将应用程序暴露(expose)于网络中。例如,将deployment的deploy-nginx服务暴露到集群外部:
    kubectl expose deployment deploy-nginx --port=8881 --target-port=80 --type=NodePort
    
  • —port: Service的端口
  • —target-port: 容器服务的端口
  • —type: Service的类型

8.扩容和缩容

  • 将Deployment对象deploy-nginx的Pod副本数量扩容为2个:
    kubectl scale deployment deploy-nginx --replicas=2
    

9.修改对象

  • kubectl edit命令可调用默认编辑器对活动对象的可配置属性进行编辑。例如,修改此前创建的Service对象deploy-nginx的类型为CLusterIP,使用 kubectl edit service deploy-nginx 打开编辑页面后修改type属性的值为ClusterIP,并删除NodePort属性,然后保存即可。对活动对象的修改将实时生效,但资源对象的有些属性并不支持运行时修改,此种情况下,编辑器将不允许保存退出。

10.资源配置清单格式文档

除了极少数的资源之外,k8s系统上的绝大多数资源都是由使用者所创建的。创建时,需要通过用户提供的资源配置清单,其本质上是一个JSON或YAML格式的文本文件,由资源对象的配置信息组成,支持使用Git等进行版本控制。

事实上,对集合所有的资源来说,它有apiVersion、kind、metadata、spec和status五个一级字段;

  • kind和apiVersion字段,用于标识对象所属的资源类型、API群组及相关的版本;

  • metadata字段用于描述对象的属性信息,为资源提供元数据信息,如名称、隶属的名称空间和标签等;

    • namespace: 指定当前对象隶属的名称空间,默认值为default;
    • name: 设定当前对象的名称,在其所属的名称空间的同一类型中必须唯一;
    • labels: 设定用于标识当前对象的标签,键值数据,常被用作挑选条件;
    • annotations: 非标识型键值数据,用来作为挑选条件,用于labels的补充;
  • spec则用于定义用户期望的状态,不同的资源类型,其状态的意义也各有不同;

  • status则记录着活动对象的当前状态信息,它由k8s系统自行维护,对用户来说为只读字段,不能由用户手动操作它;

  • 定义资源配置清单时,尽管apiVersion、kind和metadata有章可循,但spec字段对不同的资源来说却是千差万别的,因此用户需要参考Kubernetes API的参考文档来了解各种可用属性字段,可以使用 kubectl explain 直接获取相关的使用帮助,它将根据给出的对象类型或相应的嵌套字段来显示相关的下一级文档。例如,要了解Pod资源的一级字段:

    kubectl explain pods
    
  • 需要了解一级字段表示的对象之下的二级对象字段时,只需要指定其一级字段的对象名称即可,三、四级以此类推: ```

    kubectl explain pods.spec

KIND: Pod VERSION: v1

RESOURCE: spec

DESCRIPTION: Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

PodSpec is a description of a pod.

FIELDS: activeDeadlineSeconds Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer.

affinity If specified, the pod’s scheduling constraints

automountServiceAccountToken AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.

containers <[]Object> -required- List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.




用户可以以资源清单为基础,在k8s系统上以陈述式或声明式进行资源对象管理

- 陈述式管理方式:包括create、delete、get和replace等命令。陈述式对象配置的管理操作直接作用于活动对象,即便仅修改配置清单中的极小一部分内容,使用replace命令进行的对象更新也将导致整个对象被替换。进一步地,混合使用陈述式命令进行清单文件带外修改时,必然会导致用户丢失活动对象的当前状态;
- 声明式管理方式:声明式并不直接指明要进行的对象管理操作,而是提供配置清单文件给k8s系统,并委托系统跟踪活动对象的状态变动。资源对象的创建、删除及修改操作全部通过唯一的命令 apply 来完成,并且每次操作时,提供给命令的配置信息都将保存于对象的注解信息(kubectl.kubernetes.io/last-applied-configuration)中,并通过对比检查活动对象的当前状态、注解中的配置信息及资源清单中的配置信息三房进行变更合并,从而实现仅修改变动字段的高级补丁机制;

陈述式对象配置相较于声明式对象配置来说,其缺点在于同一目录下的配置文件必须同时进行同一种操作,例如,要么都创建,要么都更新等,而且其他用户的更新也必须反映在配置文件中,不然其更新在下一次的更新中将会被覆盖。因此,**声明式对象配置是优先推荐给用户使用的管理机制。**

<a name="9a6b5138"></a>
### 11.Node管理

- 
禁止Pod调度到该节点上

kubectl cordon



- 
驱逐该节点上的所有Pod

kubectl drain ```


该命令会删除该节点上的所有Pod(DaemonSet除外),在其他node上重新启动它们,通常该节点需要维护时使用该命令。直接使用该命令会自动调用 kubectl cordon <node> 命令。当该节点维护完成,启动了kubelet后,在使用 kubectl uncordon <node> 即可将该节点添加到kubernetes集群中。

12.kubectl的子命令列表

命令 功能说明
create 通过文件或标准输入创建资源
expose 基于rc、service、deployment或pod创建Service资源
run 在集群中使用指定镜像启动容器
set 设置指定资源的特定属性 |
get 显示一个或多个资源
explain 打印资源文档
edit 编辑资源
delete 基于文件名、stdin、资源或名字,以及资源和选择器删除资源
rollout 管理资源的滚动更新
rolling-update 对ReplicationController执行滚动升级
scale 伸缩Deployment、ReplicaSet、RC或Job的规模
authscale 对Deployment、ReplicaSet或RC进行自动伸缩
certificate 配置数字证书资源
cluster-info 打印集群信息
top 打印资源(CPU/Memory/Storage)使用率
cordon 将指定node设定为”不可用(unschedulable)”状态
uncordon 将指定node设定为”可用(schedulable)”状态
drain 指定的node进入维护模式
taint 为node声明污点及其标准行为
describe 显示指定的资源或资源组的详细信息
logs 显示一个Pod内某容器的日志
attach 附加终端至一个运行中的容器
exec 在容器中执行指定命令
port-forward 将本地的一个或多个端口转发至指定的Pod
proxy 创建能够访问Kubernetes API Server的代理
cp 在容器间复制文件或目录
auth 打印授权信息
apply 基于文件或stdin将配置应用于资源
patch 使用策略合并补丁更新资源字段
replace 基于文件或stdin替换一个资源
convert 为不同的API版本转换配置文件
label 更新指定资源的label
annotate 更新资源的annotation
completion 输出指定的shell的补全码
version 打印Kubernetes服务端和客户端的版本信息
api-versions 以”group/version”格式打印服务器支持的API版本信息
config 配置kubeconfig文件的内容
plugin 运行命令行插件
help | 打印任一命令的帮助信息

13.kubectl get命令的常用输出格式

输出格式 格式说明
-o wide 显示资源的额外信息
-o name 仅打印资源的名称
-o yaml YAML格式化输出API对象信息
-o json JSON格式化输出API对象信息
-o go-template 以自定义的go模版格式化输出API对象信息
-o custom-columns 自定义要输出的字段 |