前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes命令行工具 - kubectl用法总结

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

原创
作者头像
RokasYang
发布2022-12-17 19:18:19
1.6K0
发布2022-12-17 19:18:19
举报
文章被收录于专栏:RokasYang

一、Kubectl自动补全

1.BASH

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

代码语言:shell
复制
source <(kubectl completion bash)

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

代码语言:shell
复制
echo "source <(kubectl completion bash)" >> ~/.bashrc

2.ZSH

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

代码语言:shell
复制
source <(kubectl completion zsh)

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

代码语言:shell
复制
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc

二、Kubectl 上下文和配置

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

代码语言:shell
复制
kubectl config view

2.切换集群(use-context)

代码语言:shell
复制
kubectl config use-context my-cluster-name

3.创建应用(create -f)

代码语言:shell
复制
kubectl create -f xxx.yaml
kubectl apply -f xxx.yaml

区别:

  • create创建应用,如果已经存在了,则会提示已存在,无法创建。
  • apply创建应用,不管是否已存在,都会覆盖创建。

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

创建多个应用:

代码语言:shell
复制
kubectl create -f A.yaml -f B.yaml
kubectl create -f A.yaml,B.yaml

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

4.创建资源(create deployment)

代码语言:shell
复制
kubectl create deployment nginx --image=nginx

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

yaml格式输出配置信息:

代码语言:shell
复制
kubectl get deployments.apps nginx -oyaml

5.--dry-run=client

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

代码语言:shell
复制
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文件去创建:

代码语言:shell
复制
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)

代码语言:shell
复制
kubectl delete deployments.apps app

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

代码语言:shell
复制
kubectl delete -f app.yaml

删除dashboard的pod:

代码语言:shell
复制
kubectl delete pod dashboard-metrics-scraper-6d57655c59-qqpzp -n kubernetes-dashboard

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

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

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

代码语言:shell
复制
kubectl delete -f xxx.yaml -n kube-system

三、查看和查找资源

1.查看资源(get)

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

代码语言:shell
复制
kubectl get services  #services可以缩写成svc

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

代码语言:shell
复制
kubectl get pods --all-namespaces  #--all-namespaces可以缩写成-A

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

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

代码语言:shell
复制
kubectl get pod -A -owide -n kub-system

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

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

代码语言:shell
复制
kubectl get deployments.apps -n kube-system -o wide
kubectl get svc -n kube-system -owide

3.资源类型(api-resources)

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

代码语言:shell
复制
kubectl api-resources

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

代码语言:shell
复制
kubectl api-resources --namespaced=true

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

代码语言:shell
复制
kubectl api-resources --namespaced=false

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

代码语言:shell
复制
kubectl api-resources -o name

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

代码语言:shell
复制
kubectl api-resources --verbs=list,get

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

代码语言:shell
复制
kubectl api-resources --api-group=extensions

4.排序(--sort-by)

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

代码语言:shell
复制
kubectl get service -n kube-system --sort-by=.metadata.name

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

代码语言:shell
复制
kubectl get service -n kube-system --sort-by=.spec.clusterIP

列出 Pods,按重启次数排序

代码语言:shell
复制
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

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

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

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

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

代码语言:shell
复制
kubectl get pods -n kube-system -l k8s-app=calico-node

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

代码语言:shell
复制
kubectl get deployments.apps -n kube-system -o wide -l k8s-app=kube-dns

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

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

代码语言:shell
复制
kubectl get pods -n kube-system -l k8s-app=calico-node --show-labels

显示deployment的标签:

代码语言:shell
复制
kubectl get deployments.apps -n kube-system --show-labels

同理,显示service的标签:

代码语言:shell
复制
kubectl get svc -n kube-system --show-labels

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

代码语言:shell
复制
kubectl get pods -A --field-selector=status.phase=Running

四、更新资源

1.set

滚动更新frontendwww容器镜像:

代码语言:shell
复制
kubectl set image deployment/frontend www=image:v2

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

代码语言:shell
复制
kubectl set image deployment/nginx nginx=nginx=v2

更新前:

更新后:

2.apply

创建nginx3.yaml配置文件:

代码语言:shell
复制
kubectl create deployment nginx3 --image=nginx --dry-run=client -oyaml  > nginx3.yaml

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

代码语言:shell
复制
kubectl apply -f nginx3.yaml

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

代码语言:shell
复制
kubectl apply -f nginx3.yaml

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

3.edit

编辑deployment里的nginx容器:

代码语言:shell
复制
kubectl edit deployments.apps nginx

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

同理,也可以编辑serviced

代码语言:shell
复制
kubectl edit svc/docker-registry

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

代码语言:shell
复制
KUBE_EDITOR="nano" kubectl edit svc/docker-registry

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

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

代码语言:shell
复制
echo 'export KUBE_EDITOR="nano"' >> ~/.bashrc

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

代码语言:shell
复制
echo 'export KUBE_EDITOR="nano"' >> ~/.zshrc

4.replace

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

代码语言:shell
复制
kubectl replace -f nginx3.yaml  #这里也可以用apply,效果一样

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

五、查看日志

1.查看Pod日志

代码语言:shell
复制
kubectl logs my-pod

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

代码语言:shell
复制
kubectl logs -f my-pod

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

代码语言:shell
复制
kubectl logs --tail 10 my-pod  #获取后10行

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

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

代码语言:shell
复制
kubectl logs my-pod -c my-container

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

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

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

代码语言:shell
复制
kubectl describe pod nginx3-6f47ffccb5-xjh8m
kubectl describe nodes k8s-node01|tail -n 10

六、执行命令

1.在Pod里面执行命令

代码语言:shell
复制
kubectl exec my-pod -- cmd

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

代码语言:shell
复制
kubectl exec my-pod -c my-container -- cmd

3.进入Pod

代码语言:shell
复制
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查看程序启动日志。

Terminating

Pod正在被删除,可以通过describe查看状态。

SysctlForbidden

Pod自定义了内核配置,但kubelet没有添加内核配置或配置的内核参数不支持,可以通过describe查看具体原因。

Completed

容器内部主进程退出,一般计划任务执行结束会显示该状态,此时可以通过logs查看容器日志。

ContainerCreating

Pod正在创建,一般为正在下载镜像,或者有配置不当的地方,可以通过describe查看具体原因。

附带PDF版本:

kubectl用法总结

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Kubectl自动补全
    • 1.BASH
      • 2.ZSH
      • 二、Kubectl 上下文和配置
        • 1.显示合并的 kubeconfig 配置(config view)
          • 2.切换集群(use-context)
            • 3.创建应用(create -f)
              • 4.创建资源(create deployment)
                • 5.--dry-run=client
                  • 6.删除(delete)
                  • 三、查看和查找资源
                    • 1.查看资源(get)
                      • 2.用扩展格式列举所有资源(-owide)
                        • 3.资源类型(api-resources)
                          • 4.排序(--sort-by)
                            • 5.过滤应用(-l k8s-app)
                              • 6.显示标签(--show-labels)
                                • 7.查看运行中的Pods(--field-selector=status.phase=Running)
                                • 四、更新资源
                                  • 1.set
                                    • 2.apply
                                      • 3.edit
                                        • 4.replace
                                        • 五、查看日志
                                          • 1.查看Pod日志
                                            • 2.动态输出Pod日志(-f)
                                              • 3.显示后N行(--tail N)
                                                • 4.多容器场景,指定容器获取(-c)
                                                  • 5.查看Pod/Node状态(describe)
                                                  • 六、执行命令
                                                    • 1.在Pod里面执行命令
                                                      • 2.在指定Pod的指定容器中执行命令
                                                        • 3.进入Pod
                                                        • 七、POD状态表
                                                        相关产品与服务
                                                        容器服务
                                                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                                        领券
                                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档