运维开发网

kubectl命令详解

运维开发网 https://www.qedev.com 2021-02-25 12:24 出处:51CTO 作者:hellojinni
k8s常用命令整理

#查看node节点资源使用情况

kubectl top node

查看指定标签的node情况

kubectl top no -l env=product

#查看指定命名空间下所有pod的资源使用情况

kubectl top pod-name -n namespaces

#查看指定pod内的所有容器的资源使用情况

kubectl top  po pod-name -n namespaces --containers

获取多个pod的信息

kubectl get pods pod1 pod2

获取多种对象的信息

kubectl get pod/pod1   rc/rc1

同时应用多个yaml文件,以多个-f file参数表示

kubectl get pod -f pod1.yaml -f pod2.yaml

kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml

可根据目录下的所有yaml,json文件创建

kubectl create -f 目录

查看集群信息

kubectl cluster-info 

获取namespace信息

kubectl get ns

查看所有pod列表

kubectl get po --all-namespaces

或者

kubectl get po -A

-A:--all-namespaces

显示pod/node的详细信息

kubectl describe po  pod-name

kubectl describe no  no-name

只显示pod/node的名字

kubectl get po  -o name

kubectl get no  -o name

显示pod的更多信息

kubectl get po pod-name -o wide

以yaml格式显示pod的详细信息

kubectl get po pod-name -o yaml

监控Node/Pod状态的变化

kubectl get node -w

kubectl get po -w

将输出结果按某个字段排序,可以通过--sort-by参数以jsonpath表达式进行制定

按照名称排序pod

kubectl get pods --sort-by=.metadata.name

按照创建时间排序pod/no/pv/pvc

默认降序

kubectl get po  --sort-by=metadata.creationTimestamp

kubectl get po  --sort-by=.status.startTime

kubectl get node  --sort-by=.metadata.creationTimestamp

kubectl get pvc -n smalltools  --sort-by=.metadata.creationTimestamp

replace

replace命令用于对已有资源进行更新、替换。如前面create中创建的nginx,当我们需要更新resource的一些属性的时候,如果修改副本数量,增加、修改label,更改image版本,修改端口等。都可以直接修改原yaml文件,然后执行replace命令。 注:名字不能被更新。另外,如果是更新label,原有标签的pod将会与更新label后的rc断开联系,有新label的rc将会创建指定副本数的新的pod,但是默认并不会删除原来的pod。所以此时如果使用get po将会发现pod数翻倍,进一步check会发现原来的pod已经不会被新rc控制。

kubectl replace -f xxx.yaml

强制替换,删除原有资源,然后重新创建资源,在没有用deployment的情况下可以理解为重启pod

kubectl replace --force -f xxx.yaml

kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

patch

如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。 如前面创建pod的label是app=nginx-2,如果在运行过程中,需要把其label改为app=nginx-3

kubectl patch pod rc-nginx-2-kpiqt  -p '{"metadata":{"labels":{"app":"nginx-3"}}}'

edit

edit提供了另一种更新resource源的操作,通过edit能够灵活的在一个common的resource基础上,发展出更过的significant resource。例如,使用edit直接更新前面创建的pod的命令为:

kubectl edit po rc-nginx-btv4j

上面命令的效果等效于:

kubectl get po rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml

vim /tmp/nginx-tmp.yaml

kubectl replace -f  /tmp/nginx-tmp.yaml

apply

apply命令提供了比patch,edit等更严格的更新resource的方式。通过apply,用户可以将resource的configuration使用source control的方式维护在版本库中。每次有更新时,将配置文件push到server,然后使用kubectl apply将更新应用到resource。kubernetes会在引用更新前将当前配置文件中的配置同已经应用的配置做比较,并只更新更改的部分,而不会主动更改任何用户未指定的部分。 apply命令的使用方式同replace相同,不同的是,apply不会删除原有resource,然后创建新的。apply直接在原有resource的基础上进行更新。同时kubectl apply还会resource中添加一条注释,标记当前的apply。类似于git操作。

如果目标资源对象不存在,则进行创建;否则进行更新。

kubectl apply -f test.yaml

可以使用kubectl edit 命令编辑运行中的资源对象,例如:

kubectl edit deploy nginx

kubectl edit configmap coredns -n kube-system

在命令执行之后,会通过yaml格式展现该对象的定义和状态,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。

查看RC和service列表

kubectl get rc,svc

显示RC和service详细信息,也可以单独分开查看

kubectl describe svc,rc

显示node的详细信息

kubectl describe no  node-name

驱逐节点(drain)

首先驱逐node上的pod,pod在其他节点重新创建,然后将节点标记为禁止调度

驱逐已经运行的业务容器

kubectl drain node_name  --ignore-daemonsets  --delete-local-data --force

需要删除本地存储时加  --delete-local-data

隔离,停止调度(cordon)

将node标记为禁止调度,之后创建的pod,无法被调度到该节点,此节点旧的pod不受影响。

将test03节点标记为unschedulable,即“隔离”踢出集群调度范围,升级组件的时候常用到此命令。

kubectl cordon test03

恢复调度(节点加入集群,恢复调度)

kubectl uncordon test03

删除(delete)

首先驱逐node上的pod,pod在其他节点重新创建,然后从master上删除该节点,master对其不可见,失去对其控制,master不可对其恢复。

删除节点(要先驱逐节点上的pod,在执行删除)

kubectl delete no node_name

基于yaml定义的名称删除pod

kubectl delete -f jdk.yaml

删除所有pod

kubectl delete po --all

删除某个pod或者service

kubectl delete svc  nginx-service

kubectl delete po nginx-54lzx

删除所有包含某个label的pod和service

kubectl delete po,svc -l name=label-name

强制删除pod

kubectl delete po test --grace-period=0 --force -n ns

恢复调度,需进入node节点,重启kubelet;基于node的自动注册功能,节点重新恢复使用。

systemctl restart kubelet

执行容器的命令(exec)

执行Pod的date命令,默认使用Pod中的第1个容器执行。

kubectl exec pod-name  date

指定Pod中某个容器执行date命令

kubectl exec pod-name -c container-name date

进入容器

通过bash获得pod中某个容器的tty,相当于登录容器。

kubectl exec -it pod-name -c container-name /bin/bash

kubectl exec -it pod-name -c container-name /bin/sh

kubectl exec -it pod-name -c container-name sh

kubectl exec -it pod-name -c container-name bash

kubectl exec -it pod-name -c container-name /bin/csh

kubectl exec -it pod-name -c container-name /bin/ash

查看容器日志(logs)

pod中只有一个容器的时候

kubectl logs pod-name

pod中有多个容器的时候,打印所有容器日志

kubectl logs nginx --all-containers=true

容器有标签的时候

kubectl logs -l app=nginx --all-containers=true

当pod中包含多个容器时,通过-c参数指定容器的名称查看日志:-c 也可以省略,直接跟容器名

kubectl logs -f  -c  container-name pod-name

kubectl logs job/hello

kubectl logs deployment/nginx -c nginx-1

-p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。

--since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。

--v=0: 指定输出日志的级别。

查看pod下的容器名

kubectl get po pod-name -n namespaces -o=go-template='{{range  .spec.containers}}{{printf "%s\n" .name}}{{end}}'

kubectl get po pod-name -n namespaces -o=go-template='{{range .spec.containers}}{{.name}}{{"\n"}}{{end}}'

查看pv的挂载路径

kubectl get pv yw-localnas-analysis  -o go-template='{{.spec.nfs.path}}{{"\n"}}'

将pod的开放端口映射到本地

将集群上pod的80端口映射到本地的8888端口,通常用于测试。在浏览器http://127.0.0.1:8888中就能够访问到容器提供的服务了:

kubectl port-forward --address 0.0.0.0  pod/pod-name 8888:80

在pod和本地之间复制文件

把pod上的/etc/fstab复制到本地的/opt目录:

kubectl cp pod-name:/etc/fstab  /opt

检查可用的API资源类型列表

该命令经常用于检查特定类型的资源是否已经定义,列出所有资源对象类型:

kubectl api-resources

使用命令行插件

为了扩展kubectl的功能,k8s引入插件机制,用户自定义插件的可执行文件名需要以"kubectl-"开头,复制到$PATH中的某个目录(如/usr/local/bin,或者/usr/bin),然后就可以通过kubectl  plugin-name运行自定义插件了。

使用 kubectl plugin list 命令可以查看当前系统中已安装的插件列表

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号