kubectl的核心功能在于通过API Server操作kubernetes的各种资源对象,它支持三种操作方式,其中直接命令式(Imperative commands)的使用最为简便,是了解k8s集群管理的一种有效途径;
Kubectl 命令常用操作示例
1.创建资源对象
- 直接通过kubectl命令及相关的选项创建资源对象的方式即为直接命令式操作,例如下面的命令分别创建了名为nginx的pod控制器资源对象,以及名为nginx-svc的Service对象:
kubectl run nginx --image=nginx:1.16kubectl 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
KIND: Pod VERSION: v1
RESOURCE: spec
