三千年读史无外乎功名利禄,九万里悟道终归是诗酒田园。

Kubernetes命令行工具 - kubectl用法总结

一、Kubectl自动补全

1.BASH

在bash中设置当前shell的自动补全,要先安装bash-completion包。

source <(kubectl completion bash)

在bash shell中永久地添加自动补全:

echo "source <(kubectl completion bash)" >> ~/.bashrc

2.ZSH

在zsh中设置当前shell的自动补全:

source <(kubectl completion zsh)

在zsh shell 中永久地添加自动补全:

echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc

二、Kubectl 上下文和配置

1.显示合并的 kubeconfig 配置(config view)

kubectl config view

2.切换集群(use-context)

kubectl config use-context my-cluster-name

3.创建应用(create -f)

kubectl create -f xxx.yaml
kubectl apply -f xxx.yaml

区别:

  • create创建应用,如果已经存在了,则会提示已存在,无法创建。

  • apply创建应用,不管是否已存在,都会覆盖创建。

    apply 通过定义 Kubernetes 资源的文件来管理应用。 它通过运行 kubectl apply 在集群中创建和更新资源。 这是在生产中管理 Kubernetes 应用的推荐方法。 参见 Kubectl 文档

创建多个应用:

kubectl create -f A.yaml -f B.yaml
kubectl create -f A.yaml,B.yaml

两种方式都可以,第二种不支持tab补全。

4.创建资源(create deployment)

kubectl create deployment nginx --image=nginx

nginx为资源名称,指定镜像--image,命令后面还可以接-n指定namespace,不指定则默认为default namespace

yaml格式输出配置信息:

kubectl get deployments.apps nginx -oyaml

5.–dry-run=client

不创建资源,通过--dry-run只显示yaml配置:

kubectl create deployment nginx --image=nginx --dry-run=client -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

通过>重定向写入到yaml文件,之后可通过yaml文件去创建:

kubectl create deployment nginx2 --image=nginx --dry-run=client -oyaml > nginx2-dp.yaml
kubectl create -f nginx2-dp.yaml
kubectl get deployments.apps

6.删除(delete)

kubectl delete deployments.apps app

同时也可以通过yaml文件删除:

kubectl delete -f app.yaml

删除dashboard的pod:

kubectl delete pod dashboard-metrics-scraper-6d57655c59-qqpzp -n kubernetes-dashboard

删除后pod会被自动重建起来:

因为pod是被deployment管理的,当只有删掉deployment,pod才能被彻底删除。

如果使用delete -f xx.yaml删除时,yaml文件里面没有指定namespace,则需要通过-n参数手动指定,如:

kubectl delete -f xxx.yaml -n kube-system

三、查看和查找资源

1.查看资源(get)

查看当前命名空间下的所有services:

kubectl get services  #services可以缩写成svc

查看所有命名空间的全部Pods:

kubectl get pods --all-namespaces  #--all-namespaces可以缩写成-A

2.用扩展格式列举所有资源(-owide)

如,以扩展形式查看kub-system命名空间的pod信息:

kubectl get pod -A -owide -n kub-system

将会显示更多列信息,其中也包括IP地址(如果资源有IP地址的概念)。

扩展格式显示deploymentservice的资源信息:

kubectl get deployments.apps -n kube-system -o wide
kubectl get svc -n kube-system -owide

3.资源类型(api-resources)

列出所支持的全部资源类型和它们的简称、API 组, 是否是名字空间作用域Kind

kubectl api-resources

列出所有命名空间作用域的资源:

kubectl api-resources --namespaced=true

列出所有非命名空间作用域的资源,没有命名空间的则说明无法通过命名空间隔离:

kubectl api-resources --namespaced=false

用简单格式列举所有资源(仅显示资源名称:-o name):

kubectl api-resources -o name

列出支持listget请求的所有资源:

kubectl api-resources --verbs=list,get

列出extensions API 组中的所有资源:

kubectl api-resources --api-group=extensions

4.排序(–sort-by)

以service的metadata字段里的name排序,也就是从.yaml文件里面取数据:

kubectl get service -n kube-system --sort-by=.metadata.name

同理,从spec字段的clusterIP排序:

kubectl get service -n kube-system --sort-by=.spec.clusterIP

列出 Pods,按重启次数排序

kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

containerStatuses[0]表示containerStatuses的第0个元素的值。

5.过滤应用(-l k8s-app)

-l为label的意思,通过标签过滤。

过滤k8s-app标签为calico-node的容器:

kubectl get pods -n kube-system -l k8s-app=calico-node

同理,过滤标签为k8s-app=kube-dnsdeployment的资源,并且扩展输出:

kubectl get deployments.apps -n kube-system -o wide -l k8s-app=kube-dns

6.显示标签(–show-labels)

输出pod信息时,过滤calico-node的pod,并且显示标签信息

kubectl get pods -n kube-system -l k8s-app=calico-node --show-labels

显示deployment的标签:

kubectl get deployments.apps -n kube-system --show-labels

同理,显示service的标签:

kubectl get svc -n kube-system --show-labels

7.查看运行中的Pods(–field-selector=status.phase=Running)

kubectl get pods -A --field-selector=status.phase=Running

四、更新资源

1.set

滚动更新frontendwww容器镜像:

kubectl set image deployment/frontend www=image:v2

比如更新deployment里的nginx镜像,更新到v2版本:

kubectl set image deployment/nginx nginx=nginx=v2

更新前:

更新后:

2.apply

创建nginx3.yaml配置文件:

kubectl create deployment nginx3 --image=nginx --dry-run=client -oyaml  > nginx3.yaml

通过此配置文件创建nginx3的deployment:

kubectl apply -f nginx3.yaml

之后修改这个yaml文件,将nginx改成nginx:v2,再通过apply来更新配置:

kubectl apply -f nginx3.yaml

此时可以看到,镜像更新成功:

3.edit

编辑deployment里的nginx容器:

kubectl edit deployments.apps nginx

可以编辑里面的任何内容,比如把基础镜像升级到v2版本,则将imgae: nginx改成image: nginx:v2

同理,也可以编辑serviced

kubectl edit svc/docker-registry

修改编辑操作时用的默认编辑器:

KUBE_EDITOR="nano" kubectl edit svc/docker-registry

单次使用生效,如果想永久生效则将此变量申明为环境变量:

bash下,写到~/.bashrc里面:

echo 'export KUBE_EDITOR="nano"' >> ~/.bashrc

zsh下,写到~/.zshrc里面:

echo 'export KUBE_EDITOR="nano"' >> ~/.zshrc

4.replace

修改yaml文件后,用replace来替换升级:

kubectl replace -f nginx3.yaml  #这里也可以用apply,效果一样

往yaml加了个标签,可以看到replace之后,标签成功加上。

五、查看日志

1.查看Pod日志

kubectl logs my-pod

2.动态输出Pod日志(-f)

kubectl logs -f my-pod

3.显示后N行(–tail N)

kubectl logs --tail 10 my-pod  #获取后10行

4.多容器场景,指定容器获取(-c)

当一个pod里面有多个container时,使用-c来指定容器:

kubectl logs my-pod -c my-container

这里只有一个容器,可以通过-c来指定。

给这个yaml文件,再加一个redis容器,则通过-c指定redis容器来获取最后五行日志:

5.查看Pod/Node状态(describe)

kubectl describe pod nginx3-6f47ffccb5-xjh8m
kubectl describe nodes k8s-node01|tail -n 10

六、执行命令

1.在Pod里面执行命令

kubectl exec my-pod -- cmd

2.在指定Pod的指定容器中执行命令

kubectl exec my-pod -c my-container -- cmd

3.进入Pod

kubectl exec -ti my-pod -- bash

有些pod基础镜像没有bash,则用sh代替。

七、POD状态表

状态说明
Pending(挂起)Pod已被Kubernetes系统接收,但仍有一个或多个容器未被创建,可以通过kubectl describe查看处于Pending状态的原因。
Running(运行中)Pod已被绑定到一个节点上,并且所有的容器都已经被创建,而且至少有一个是运行状态,或者是正在启动或重启,可以通过kubectl logs查看Pod日志。
Succeeded(成功)所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过logs和describe查看Pod日志和状态。
Unknown(未知)通常是由于通信问题造成的无法获得Pod的状态。
ImagePullBackOffErrImagePull镜像拉取失败,一般是由于镜像不存在、网络不通或者需要登录认证引起的,可以使用describe命令查看具体原因。
CrashLoopBackOff容器启动失败,可以通过logs命令查看具体原因,一般为启动命令不正确,健康检查不通过等。
OOMKilled容器内存溢出,一般是容器的内存Limit设置的过小,或者程序本身有内存溢出,可以通过logs查看程序启动日志。
TerminatingPod正在被删除,可以通过describe查看状态。
SysctlForbiddenPod自定义了内核配置,但kubelet没有添加内核配置或配置的内核参数不支持,可以通过describe查看具体原因。
Completed容器内部主进程退出,一般计划任务执行结束会显示该状态,此时可以通过logs查看容器日志。
ContainerCreatingPod正在创建,一般为正在下载镜像,或者有配置不当的地方,可以通过describe查看具体原因。

附带PDF版本:

kubectl用法总结

赞(34)
转载请注明出处:RokasYang's Blog » Kubernetes命令行工具 -

相关推荐

  • 暂无文章