1 资源管理
create
根据文件或者输入来创建资源
# 创建Deployment和Service资源
$ kubectl create -f demo-deployment.yaml
$ kubectl create -f demo-service.yaml
delete
删除资源
# 根据yaml文件删除对应的资源,不会被删除yaml文件
$ kubectl delete -f demo-deployment.yaml
$ kubectl delete -f demo-service.yaml
# 通过具体的资源名称来进行删除,同时删除deployment和service资源
$ kubectl delete 具体的资源名称
get
获取资源信息
# 查看所有的资源信息
$ kubectl get all
$ kubectl get --all-namespaces
# 查看pod列表
$ kubectl get pod
# 显示mypod节点的标签信息,如果不指定默认显示所有的
$ kubectl get pod [mypod] --show-labels
# 查看标签为example的pod
$ kubectl get pods -l app=example
# 查看pod详细信息,包括pod具体运行在哪个节点上(ip地址信息)
$ kubectl get pod -o wide
# 查看所有pod所属的命名空间
$ kubectl get pod --all-namespaces
# 查看所有node节点列表
$ kubectl get node
# 显示mynode节点的标签信息
$ kubectl get node mynode --show-labels
# 查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
$ kubectl get svc
$ kubectl get svc -n kube-system
# 查看命名空间
$ kubectl get ns
$ kubectl get namespaces
# 查看目前所有的replica set,显示了所有的pod的副本数,以及他们的可用数量以及状态等信息
$ kubectl get rs
# 查看已经部署了的所有应用,可以看到容器,以及容器所用的镜像,标签等信息
$ kubectl get deploy -o wide
$ kubectl get deployments -o wide
通过--field-selector
指定参数可以对查询的结果进行筛选过滤,例如要查询在i-node4mx4knp5dezenp5up节点上的pod列表,可以依据pod描述文件中的spec.nodeName进行筛选,可以通过使用逗号分隔多个选择条件
kubectl get pods --field-selector spec.nodeName=i-node4mx4knp5dezenp5up
不同的 Kubernetes 资源类型支持不同的字段选择器, 所有资源类型都支持 metadata.name和 metadata.namespace 字段。 使用不被支持的字段选择器会报错:field selector is not a known field selector
通过如下方式可以查看pod的制定标签内容,例如查看.metadata.namespace值
kubectl get pod <pod-name> -o=jsonpath='{.metadata.namespace}'
run
在集群中创建并运行一个或多个容器镜像。
# 示例,运行一个名称为nginx,镜像为nginx:1.10,副本数为3,标签为app=example,端口为80的容器实例,并绑定到k8s-node1上
$ kubectl run nginx --image=nginx:1.10 --replicas=3 --labels="app=example" --port=80 --overrides='{"apiVersion":"apps/v1","spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"k8s-node1"}}}}}'
expose
暴露端口让外部可以访问
# 创建一个nginx服务并且暴露端口到80让外界访问
$ kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service
set
命令用于对资源进行设置,例如进行一些范围限制、具体镜像设置。
# 将deployment的nginx容器cpu限制为“200m”,将内存设置为“512Mi”
$ kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi
# 设置所有nginx容器中 Requests和Limits
$ kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi
# 删除nginx中容器的计算资源值
$ kubectl set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0
# 所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”
$ kubectl set image deployments,rc nginx=nginx:1.9.1 --all
# 将daemonset abc的所有容器镜像更新为“nginx:1.9.1”
$ kubectl set image daemonset abc *=nginx:1.9.1
edit
用于编辑资源信息
# 编辑Deployment nginx的一些信息
$ kubectl edit deployment nginx
# 编辑service类型的nginx的一些信息
$ kubectl edit service/nginx
2 容器管理
apply
通过文件名或控制台输入,对资源进行配置。如果资源不存在,将会新建一个。可以使用 JSON 或者 YAML格式。
# 将pod.json中的配置应用到pod
$ kubectl apply -f ./pod.json
# 将控制台输入的JSON配置应用到Pod
$ cat pod.json | kubectl apply -f -
参数选项:
- -f, --filename=[]: 包含配置信息的文件名,目录名或者URL。
- -o, --output=“”: 输出模式。"-o name"为快捷输出(资源/name).
- –record[=false]: 在资源注释中记录当前 kubectl 命令。
- -R, --recursive[=false]: 递归处理文件夹下的文件
- –schema-cache-dir=“~/.kube/schema”: 非空则将API schema缓存为指定文件,默认缓存到’$HOME/.kube/schema’
- –validate[=true]: 如果为true,在发送到服务端前先使用schema来验证输入。
patch
更新资源的字段,也就是修改资源的部分内容
# 更新k8s-node-1节点unschedulable为true
$ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
replace
通过文件或者标准输入替换原有资源
# 使用pod.json中的数据替换pod
$ kubectl replace -f ./pod.json
# 强制执行
$ kubectl replace --force -f ./pod.json
convert
不同的版本之间转换配置文件
# 将'pod.yaml' 转换为最新版本并输出
$ kubectl convert -f pod.yaml
# 通过pod.yaml输出资源的最新状态并转化为json输出
$ kubectl convert -f pod.yaml --local -o json
# 将文件下的所有文件转换为最新版本
$ kubectl convert -f . | kubectl create -f -
label
用于更新(增加、修改或删除)资源上的 label(标签)
# 给名为foo的Pod添加label unhealthy=true
$ kubectl label pods foo unhealthy=true
# 覆盖更新pod的label
$ kubectl label --overwrite pods foo status=unhealthy
# 给 namespace 中的所有 pod 添加 label
$ kubectl label pods --all status=unhealth
# 删除名为“bar”的label 。(使用“ - ”减号相连)
$ kubectl label pods foo bar-
annotate
更新一个或多个资源的注解Annotations信息
# 更新Pod“foo”,设置annotation “description”为“my frontend”
$ kubectl annotate pods foo description='my frontend'
# 根据“pod.json”中的type和name更新pod的annotation
$ kubectl annotate -f pod.json description='my frontend'
# 通过删除名为“description”的annotations
$ kubectl annotate pods foo description-
Kubernets部署相关命令
rollout
用于对deployments,daemonsets的版本进行管理。子命令包括:history
(查看历史版本)、pause
(暂停资源)、resume
(恢复暂停资源)、status
(查看资源状态)、undo
(回滚版本)
# 语法
$ kubectl rollout SUBCOMMAND
# 回滚到之前的deployment
$ kubectl rollout undo deployment/abc
# 查看daemonet的状态
$ kubectl rollout status daemonset/foo
rolling-update命令: 滚动更新ReplicationController,该命令会逐步使用新的ReplicationController去替换旧的,最终实现Pod滚动更新。
# 使用frontend-v2.json中的新RC数据更新frontend-v1的pod
$ kubectl rolling-update frontend-v1 -f frontend-v2.json
scale
扩容或缩容
# 将foo中的pod副本数设置为3。
$ kubectl scale --replicas=3 rs/foo
# 将由“foo.yaml”配置文件中的Pod资源副本设为3
$ kubectl scale --replicas=3 -f foo.yaml
# 如果当前副本数为2,则将其扩展至3。
$ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
autoscale
弹性伸缩策略 ,根据流量的多少来自动进行扩展或者缩容
# 使用默认的自动伸缩策略,使其Pod数量在2到10之间
$ kubectl autoscale deployment foo --min=2 --max=10
# 使用RC“foo”设定,使其Pod的数量介于1和5之间,CPU使用率维持在80%
$ kubectl autoscale rc foo --max=5 --cpu-percent=80
3 容器交互
describe
显示特定资源的详细信息
# 查看my-nginx pod的详细状态
$ kubectl describe po my-nginx
logs
打印pod容器的日志,如果pod中只有一个容器,可以省略容器名。命令具体参数如下:
- -c, --container=“”: 容器名。
- -f, --follow[=false]: 指定是否持续输出日志(实时日志)。
- –interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true。
- –limit-bytes=0: 输出日志的最大字节数。默认无限制。
- -p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。
- –since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
- –tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。
- –timestamps[=false]: 在日志中包含时间戳
# 返回仅包含一个容器的pod nginx的日志快照
$ kubectl logs nginx
# 返回pod ruby中已经停止的容器web-1的日志快照
$ kubectl logs -p -c ruby web-1
# 持续输出pod ruby中的容器web-1的日志
$ kubectl logs -f -c ruby web-1
exec
进入容器进行交互,命令选项:
- -c, --container=“”: 容器名。如果未指定,使用pod中的一个容器。
- -p, --pod=“”: Pod名。
- -i, --stdin[=false]: 将控制台输入发送到容器。
- -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。
# 进入nginx容器,执行一些命令操作
$ kubectl exec -it nginx-deployment-58d6d6ccb8-lc5fp bash
attach
连接到一个正在运行的容器。
-c, --container="": pod中的容器名。默认选择第一个 pod。
-i, --stdin[=false]: 将控制台输入发送到容器。
-t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。
# 获取pod 123456-7890中ruby-container的输出
$ kubectl attach mypod -c ruby-container
# 切换到终端模式,将输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台
$ kubectl attach mypod -c ruby-container -i -t
cp
拷贝文件或者目录到pod容器中,用于pod和外部的文件交换,将容器中的内容和外部的内容进行交换。
4 集群管理
certificate命令:用于证书资源管理,授权等
# 例如,当有node节点要向master请求,那么是需要master节点授权的
$ kubectl certificate approve node-csr-81F5uBehyEyLWco5qavBsxc1GzFcZk3aFM3XW5rT3mw node-csr-Ed0kbFhc_q7qx14H3QpqLIUs0uKo036O2SnFpIheM18
cluster-info 命令:显示集群信息
$ kubectl cluster-info
top 命令:用于查看资源的cpu,内存磁盘等资源的使用率
# 以前需要heapster,后替换为metrics-server
$ kubectl top pod --all-namespaces
cordon命令:用于标记某个节点不可调度
uncordon命令:用于标签节点可以调度
drain命令:用于在维护期间排除节点。
taint命令:用于给某个Node节点设置污点