关于 Kubernetes (K8s) 的 8 个提示和技巧

男性程序员在家办公场景

本文将分享若干可简化 Kubernetes 操作的技巧与窍门。

以下多数技巧均使用 kubectl——一款能对 Kubernetes 集群执行命令的强大命令行工具。

辅以专家洞察分析的最新科技新闻

通过 Think 时事通讯,了解有关 AI、自动化、数据等方面最重要且最有趣的行业趋势。请参阅 IBM 隐私声明

谢谢!您已订阅。

您的订阅将以英语提供。您会在每份时事通讯中找到一个取消订阅链接。您可以在此管理您的订阅或取消订阅。更多相关信息,请参阅我们的《IBM 隐私声明》。

Kubernetes 背景知识

1. 设置默认命名空间

您可以通过命名空间(例如 Dev1、Dev2、QA1、QA2 等)将 Kubernetes 集群划分为多个环境,每个环境可由不同用户管理。编写 kubectl 命令的不便之处在于,每次都需要 在末尾添加 --namespace 选项。用户常会遗漏此步骤,导致在错误命名空间中创建对象(pod、服务、部署)。 

通过此技巧,您可以在运行 kubectl 命令前预设命名空间偏好。执行 kubectl 命令前运行以下命令,它将为当前上下文的后续所有 kubectl 操作保存命名空间设置:

kubectl config set-context $(kubectl config current-context) --namespace=mynamespace

以下列出与命名空间相关的最常用的实用命令:

  • kubectl get namespaces
  • kubectl create namespace mynamespace
  • kubectl get pods --all-namespaces (从所有命名空间列出带状态的 Pod。)
  • kubectl get po -o wide -n <namspace1> -n <namespace2> -n <namespace3> (此命令将识别各命名空间中的 Pod)
  • kubectl describe namespace <namespace>
  • kubectl config view --minify | grep namespace (此命令确保为当前上下文正确设置命名空间。) 
IBM Cloud

Red Hat OpenShift AI on IBM Cloud:部署 AI 工作负载

将 AI 功能与 Red Hat OpenShift on IBM Cloud 结合使用。本视频将深入探讨如何利用可扩展的机器学习运营平台,高效构建、部署和管理 AI 工作负载。

2. 省时的实用别名

Kubernetes 命令通常较为冗长,因此为 kubectl 设置别名会非常实用。您无需再反复输入完整命令,这在需要单次会话中执行多条 Kubernetes 命令时能极大提升效率。

下文列举了常用命令的别名设置。在执行 kubectl 命令前运行这些别名可节省时间。 示例:您只需输入 K 而无需输入 kubectl:

  • alias k='kubectl'
  • alias kc='k config view --minify | grep name'
  • alias kdp='kubectl describe pod'
  • alias krh='kubectl run --help | more'
  • alias ugh='kubectl get --help | more'
  • alias c='clear'
  • alias kd='kubectl describe pod'
  • alias ke='kubectl explain'
  • alias kf='kubectl create -f'
  • alias kg='kubectl get pods --show-labels'
  • alias kr='kubectl replace -f'
  • alias kh='kubectl --help | more'
  • alias krh='kubectl run --help | more'
  • alias ks='kubectl get namespaces'
  • alias l='ls -lrt'
  • alias ll='vi ls -rt | tail -1'
  • alias kga='k get pod --all-namespaces'
  • alias kgaa='kubectl get all --show-labels'

 

3. 使用 vi 编辑 YAML

虽然存在多种 YAML 文件编辑器,但在终端操作时往往需要快速调优已生成的 YAML 文件。此时使用经典的 vi 编辑器(最初为 Unix 系统开发的文本编辑器)是理想选择。

vi 编辑器不仅拥有完善的文档支持,还获得活跃的开源社区贡献。然而在创建 YAML 文件时,vi 编辑器存在空格处理问题。我们需要一种实现用制表符缩进、用空格对齐的功能。在 YAML 编写过程中,使用制表符与空格的混用总会引发语法问题(例如敲击回车时默认生成 2 空格 YAML 格式)。

那么有何解决方案呢?在使用 vi 编辑器创建 YAML 文件前,创建包含以下配置行的 ~/.vimrc 文件以使编辑更便捷:

  • set smarttab
  • set expandtab
  • set shiftwidth=4
  • set tabstop=4
  • set number

4. 通过 kubectl 命令生成 YAML

我们可以通过 kubectl 命令行工具创建复杂的 YAML 文件。

大多数开发人员认为直接编写 YAML 文件颇为耗时,且 Kubernetes 的 YAML 文件往往冗长且难以手动编写。相比从空白编辑器开始创建,通过 kubectl 命令生成 YAML 文件会轻松许多。

下列命令将创建名为  yamlfile 的 YAML 文件 。通过 kubectl 命令生成 YAML 后,您可根据需求进行修改,无需从零开始编写:

  • kubectl run busybox --image=busybox --dry-run=client -o yaml --
    restart=Never > yamlfile.yaml
    
    kubectl create job my-job --dry-run=client -o yaml --image=busybox -- date>yamlfile.yaml
    
  • kubectl get -o yaml deploy/nginx > 1.yaml(确保您
    拥有一个名为 nginx 的部署)
    
  • kubectl run busybox --image=busybox --dry-run=client -o yaml 
    --restart=Never -- /bin/sh -c "while true; do echo hello; echo 
    hello again;done" > yamlfile.yaml
    
  • kubectl run wordpress --image=wordpress –-expose –-port=8989 -
    -restart=Never -o yaml
    
  • kubectl run test --image=busybox --restart=Never --dry -
    run=client -o yaml -- bin/sh -c 'echo test;sleep 100' > 
    yamlfile.yaml(请注意  --bin  参数位于末尾。此命令将生成 yaml 文件。)
    

(请注意 --bin  参数位于末尾。此命令将生成 yaml 文件。)

另一种生成 YAML 文件的有效方法是使用  wget 命令直接从互联网获取文件。 

5. 切换 Kubernetes 命名空间

在技巧 1 中,我们学习了使用 Kubernetes 命名空间的相关命令并保存设置,从而避免每次手动添加参数。现在我们将扩展该技巧,简化命名空间与 kubectl 上下文之间的切换操作。

现有多种工具可辅助此操作,我们推荐分别使用 kubectx 和 kubens 来管理上下文与命名空间。 您可以在 此处查看 kubectx 与 kubens 的详细说明。

以下载 kubectx 和 kubens 工具的 Linux 二进制文件为例:

  • wget https://github.com/ahmetb/kubectx/releases/download/v0.9.0/kubectx_v0.9.0_linux_x86_64.tar.gz
    
  • wget https://github.com/ahmetb/kubectx/releases/download/v0.9.0/kubens_v0.9.0_linux_x86_64.tar.gz
    

通过以下命令解压:

  • tar -xvf kubectx_v0.9.0_linux_x86_64.tar.gz
    
  • tar -xvf kubens_v0.9.0_linux_x86_64.tar.gz
    

最后将它们移动到 PATH 中:

  • sudo mv kubectx /usr/local/bin
  • sudo mv kubens /usr/local/bin

安装完成后,只需使用 kubens 即可列出命名空间并在其间切换:

当操作多个集群时,kubectx 能让上下文切换变得轻松自如:

6. Shell 自动补全

您是否了解 kubectl 为 BASH 和 ZSH 提供了自动补全功能?这是一项可选配置。

假设您已理解 Kubernetes 概念并具备 kubectl 使用经验,但可能不擅长记忆命令。首先安装 bash-completion,随后启用 kubectl 自动补全功能。您可以在安装和设置 kubectl文档页面找到适用于您环境的具体配置说明。

以下是启用自动补全功能的配置选项:

现在,尽情使用 Tab 键吧!

7. 查看资源利用率

top 命令或许是监控进程与系统资源最常用的工具之一。它提供基于字符的简易界面,可快速获取关键信息。

查看各节点资源利用率:

查看各 Pod 资源利用率:

实用的 watch 命令能按指定间隔刷新显示,无需反复手动执行。以下示例设定每 5 秒运行一次(默认间隔为 2 秒): 

watch kubectl top node -n 5

注意: watch 命令需根据您的环境另行下载。

您的 Kubernetes 集群需要运行 heapster 服务才能使 top 命令正常工作,否则将出现以下错误: “Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)”

8. 扩展 kubectl 并利用原始输出创建自定义命令

kubectl 命令提供的是 apiserver 所存储资源的汇总视图。apiserver 实际存储的字段远多于显示内容。您可以通过 kubectl get 命令获取原始资源输出,从而创建自定义可视化界面与命令。 

使用以下命令以 JSON 格式输出原始资源:

kubectl get deployments -o json

您也可以直接通过 API 调用访问资源:

kubectl get --raw=/apis/apps/v1/deployments

甚至可以将输出与  jq  等工具结合,实现多样化可视化呈现、输出过滤或将数据传递至其他工具进行高级自动化处理。 

例 如,在包含多命名空间与多部署的集群中排查问题可能较为困难,但以下示例使用原始 API 扫描集群内所有部署,并筛选出仅含故障副本的部署:

 

kubectl get --raw=/apis/apps/v1/deployments | jq '.items[] 
| {name: .metadata.name, replicas: .status.replicas, available:
 (.status.availableReplicas // 0), unavailable:
 (.status.unavailableReplicas // 0)} | select (.unavailable > 0)'

对上述命令的简要说明:

  • 首先,调用 Kubernetes API 来返回所有部署。默认输出为 JSON 格式。JSON 文档的结构可能难以直观查看,但可通过管道传递至 jq 工具获得更清晰展示,如下例所示:

    kubectl get --raw=/apis/apps/v1/deployments | jq .

  • 注意响应文档包含每个部署对应的 项目 数组。我们需要彻底检查该数组末端的 状态 字段。以下命令演示如何仅打印所需数据,并在字段不可用时提供默认值 0:

     

    kubectl get --raw=/apis/apps/v1/deployments | jq '.items[] |
    {name: .metadata.name, replicas: .status.replicas, available:
     (.status.availableReplicas // 0), unavailable: 
    (.status.unavailableReplicas // 0)}'
    
  • 关键环节在于使用  select  函数仅显示包含不可用副本的部署:

     

    kubectl get --raw=/apis/apps/v1/deployments | jq '.items[] | 
    {name: .metadata.name, replicas: .status.replicas, available:
     (.status.availableReplicas // 0), unavailable: 
    (.status.unavailableReplicas // 0)} | select (.unavailable > 0)'
    

摘要

希望这些技巧和窍门能助您提升 Kubernetes 使用效率。若您有钟爱的技巧或原创心得,欢迎与我们分享。

请记得体验  IBM Cloud Kubernetes Service ,将所学技巧投入实践。

想要获得免费 Kubernetes 实操经验?欢迎使用 IBM CloudLab——这款全新交互平台提供  Kubernetes 认证教程 ,无需任何成本与配置。

作者

Ravi Saraswathi

IBM Chief Architect

IBM Blog

Marcelo Borges

Lead Cloud Solution Architect

相关解决方案
IBM Red Hat OpenShift

Red Hat OpenShift on IBM Cloud 是一个完全托管的 OpenShift 容器平台 (OCP)。

探索 Red Hat OpenShift
容器解决方案

容器解决方案能够运行和扩展容器化工作负载,并实现安全性、开源创新和快速部署。

深入了解容器
云咨询服务

利用 IBM 的云咨询服务发掘新功能并提升业务敏捷性。了解如何通过混合云战略和专家合作共同制定解决方案、加快数字化转型并优化性能。

云服务
采取后续步骤

开始使用完全托管的 Red Hat OpenShift 平台或深入了解 IBM Cloud Kubernetes 生态系统的灵活性。借助根据您的需求定制的安全可扩展解决方案,加快您的开发与部署流程。

探索 Red Hat OpenShift 深入了解 Kubernetes