章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
    • kubectl使用技巧
      • kubernetes卷的几种类型
      • kubernetes安全框架
      • 云原生-什么是HPA和PDB、VPA
      • k8s部署php项目示例
      • 配置kubeconfig 文件访问 Kubernetes 集群
      • configmap配置的几种方式
      • k8s配置go服务
      • k8s部署java项目
      • kubernetes部署prometheus监控
      • kubernetes部署elk日志系统
      • kubernetes环境devops流水线
      • kubernetes高阶技能必备的工具
      • deployment中使用configmap、secret的方式
      • 业务pod 飘移pending排查分析
    • elk

    • jenkins

    • GitLabCI_CD

    • 专题
    • Kubernetes笔记
    章工运维
    2023-06-20
    目录

    kubectl使用技巧

    # 一、使用kubectl查询、创建、编辑和删除资源

    对于刚开始使用命令行工具的开发者,最保险的方法是提出问题(读取操作),而不是发出命令(写入操作),所以从使用 get 命令开始是个不错的选择。

    • Kubectl get

    使用 get 命令可以获取当前集群中可用的资源列表,包括:

    • Namespace

    • Pod

    • Node

    • Deployment

    • Service

    • ReplicaSet

    每个 get 命令都能提供集群中可用资源的详细信息。例如 get nodes 命令就提供了 Kubernetes 的状态和版本。

    这些命令大多数还具有简写版本。例如,要获取命名空间,可以使用 kubectl get ns 命令:

    $ kubectl get ns
    NAME              STATUS   AGE
    charts            Active   8d
    default           Active   9d
    kube-node-lease   Active   9d
    kube-public       Active   9d
    kube-system       Active   9d
    
    1
    2
    3
    4
    5
    6
    7
    • Kubectl create

    可以查询资源后,下一步是创建资源。我们可以用 kubectl 在集群中创建任何类型的资源,包括:

    • Service

    • Cronjob

    • Deployment

    • Job

    • Namespace(ns)

    其中,一些资源的创建需要设置配置文件、命名空间以及资源名称。例如,创建命名空间就需要一个额外参数来指定命名空间。

    $ kubectl create ns hello-there
    namespace/hello-there created
    
    1
    2

    Linux 里可以使用 cron 创建定时运行的任务。同样的,这里我们使用 cronjob 每五秒钟返回一次“hello”。

    $ kubectl create cronjob my-cron --image=busybox --schedule="*/5 * * * *" -- echo hello``cronjob.batch/my-namespaced-cron created

    我们也可以使用 cronjob 的简写版本 cj。

    $ kubectl create cj my-existing-cron --image=busybox --schedule="*/15 * * * *" -- echo hello``cronjob.batch/my-existing-cron created

    • Kubectl edit

    当我们创建好资源后,如果需要修改,该怎么办?这时候就需要 kubectl edit 命令了。

    我们可以用这个命令编辑集群中的任何资源。它会打开默认文本编辑器。如果我们要编辑现有的 cron job,则可以执行:

    $ kubectl edit cronjob/my-existing-cron
    
    1

    我们要编辑的配置如下:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      creationTimestamp: "2020-04-19T16:06:06Z"
      managedFields:
      - apiVersion: batch/v1beta1
        fieldsType: FieldsV1
        fieldsV1:
          f:spec:
            f:concurrencyPolicy: {}
            f:failedJobsHistoryLimit: {}
            f:jobTemplate:
              f:metadata:
                f:name: {}
              f:spec:
                f:template:
                  f:spec:
                    f:containers:
                      k:{"name":"my-new-cron"}:
                        .: {}
                        f:command: {}
                        f:image: {}
                        f:imagePullPolicy: {}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    原本调度间隔设置为 15 秒:

    我们将其更改为每 25 秒:

    编写完成后,可以看到修改已生效。

    $ kubectl edit cronjob/my-existing-cron
    cronjob.batch/my-existing-cron edited
    
    1
    2

    另外,我们可以通过 KUBE_EDITOR 命令来使用其他编辑器。

    $ KUBE_EDITOR="nano" kubectl edit cronjob/my-existing-cron
    
    1
    • Kubectl delete

    学会了以上命令后,下面我们将进行删除操作。刚刚编辑的 cronjob 是两个 cronjobs 之一,现在我们删除整个资源

    $ kubectl delete cronjob my-existing-cron
    cronjob.batch "my-existing-cron" deleted
    
    1
    2

    需要注意的是,如果不知道资源是否有关联信息,最好不要删除。因为删除后无法恢复,只能重新创建。

    • Kubectl apply

    上文提到,某些命令需要配置文件,而 apply 命令可以在集群内调整配置文件应用于资源。虽然也可以通过命令行 standard in (STNIN) 来完成,但 apply 命令更好一些,因为它可以让你知道如何使用集群,以及要应用哪种配置文件。作为示例,下文会将 Helm 的基于角色的访问控制(RBAC)配置用于服务帐户。

    $ kubectl apply -f commands.yaml
    serviceaccount/tiller created
    clusterrolebinding.rbac.authorization.k8s.io/tiller created
    
    1
    2
    3

    我们可以应用几乎任何配置,但是一定要明确所要应用的配置,否则可能会引发意料之外的后果。

    # 二、使用kubectl对kubernetes进行故障排除

    • Kubectl describe

    describe 命令可以查看资源的详细信息。比较常见的用法是查看一个 Pod 或节点信息,以检查是否有异常、资源是否耗尽。

    该命令可以查看的资源包括:

    • Nodes

    • Pods

    • Services

    • Deployments

    • Replica sets

    • Cronjobs

    举个例子,我们用 describe 命令查看上文集群中 cronjob 的详细信息。

    $ kubectl describe cronjob my-cron
    
    1

    以下是部分信息:

    Name:                         my-cron
    Namespace:                    default
    Labels:                       <none>
    Annotations:                  <none>
    Schedule:                     */5 * * * *
    Concurrency Policy:           Allow
    Suspend:                      False
    Successful Job History Limit: 3
    Failed Job History Limit:     1
    Starting Deadline Seconds:    <unset>
    Selector:                     <unset>
    Parallelism:                  <unset>
    Completions:                  <unset>
    Pod Template:
      Labels: <none>
      Containers:
       my-cron:
        Image:     busybox
        Port:      <none>
        Host Port: <none>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    • Kubectl logs

    虽然 describe 命令可以让你知道 Pod 内部应用程序发生的事,但 logs 命令可以提供 Kubernetes 中 Pod 的更多详细信息。了解这种区别可以帮助开发者更好地对应用程序内部以及 Kubernetes 内部发生的问题,并进行故障排除,这二者往往并不相同。

    $ kubectl logs cherry-chart-88d49478c-dmcfv -n charts
    
    1

    以上命令的部分输出结果如下:

    172.17.0.1 - - [19/Apr/2020:16:01:15 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:20 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:25 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:30 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:35 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:40 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:45 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:50 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    172.17.0.1 - - [19/Apr/2020:16:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "kube-probe/1.18" "-"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    grep 命令可以过滤无关信息或查看特定事件。例如,下面的 kube-probe 可能是无关信息,我们用 grep 命令对其进行过滤。

    $ kubectl logs cherry-chart-88d49478c-dmcfv -n charts | grep -vie kube-probe
    127.0.0.1 - - [10/Apr /2020:23:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" “-”
    
    1
    2

    在有些部署中,存在一个 Pod 有多个容器的情况,因此我们可以在 logs 命令中使用 -c <容器名称>,以查找指定容器的日志。

    • Kubectl exec

    与 docker exec 命令相似,exec 命令也可以在容器中直接对应用程序进行故障排除。尤其当 Pod 的日志无法定位问题时, 它会特别好用。另外要注意的是,使用 exec 命令时,必须要以 Pod 内使用的 shell 作为命令的最后一个参数。

    $ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
    root@cherry-chart-88d49478c-dmcfv:/#
    
    1
    2
    • Kubectl cp

    Kubectl cp 命令与 Linux cp 命令类似,用于容器之间复制文件和目录。另外,该命令还能在自动化失败等紧急情况下进行恢复备份。

    以下是将本地文件拷贝到容器的示例。命令格式为:kubectl cp namespace/podname:/path/tofile。

    $ kubectl cp commands_copy.txt charts/cherry-chart-88d49478c-dmcfv:commands.txt
    $ kubectl exec -it cherry-chart-88d49478c-dmcfv -n charts -- /bin/bash
    root@cherry-chart-88d49478c-dmcfv:/# ls
    bin  boot  commands.txt  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    1
    2
    3
    4

    下面是将容器内的文件拷贝到本地计算机上的示例。命令格式为:

    kubectl cp namespace/podname:/path/tofile。

    $ kubectl cp charts/cherry-chart-88d49478c-dmcfv:commands.txt commands_copy.txt
    $ ls
    commands_copy.txt
    
    1
    2
    3

    # kubectl客户端快捷使用

    ##kubectl
    curl -L https://dl.k8s.io/release/v1.24.2/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl
    chmod +x /usr/local/bin/kubectl
    ##复制master节点.kube下的config过来
    mkdir -p $HOME/.kube
    wget xxxxxxx:8888/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    kubectl get node
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    参考链接 (opens new window)

    微信 支付宝
    上次更新: 2023/06/21, 07:37:46

    ← kubernetes核心概念 kubernetes卷的几种类型→

    最近更新
    01
    不花一分钱从0到1建站教程
    04-22
    02
    批量拿取多台服务器的日志文件
    04-21
    03
    高德MCP智能体搞定旅游计划
    04-19
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式