当前位置: 首页 > 科技观察

8Kubernetes运维技巧

时间:2023-03-12 11:01:51 科技观察

本文转载自微信公众号《新钛云服务》,作者朱翔翻译。转载本文请联系新钛云服务公众号。在本文中,我们将探讨一些可以让Kubernetes更容易使用的提示和技巧。下面给出的大部分技巧都使用kubectl,这是一个强大的命令行工具,可让您对Kubernetes集群执行命令。1、设置默认命名空间可以使用命名空间(例如Dev1、Dev2、QA1、QA2等)将Kubernetes集群划分为多个环境,每个环境可以由不同的用户管理。运行kubectl命令的不便之处之一是每次编写命令时,都需要在最后使用--namespace选项。运维人员经常忘记这一点,并最终在错误的命名空间中创建对象(pod、服务、部署)。使用这个技巧,您可以在运行kubectl命令之前设置命名空间首选项。在执行kubectl命令之前运行以下命令,它将为您当前上下文的所有后续kubectl命令保存命名空间:kubectlconfigset-context$(kubectlconfigcurrent-context)--namespace=mynamespace一些最常用和有用的命名空间命令是下面列出:kubectlgetnamespaceskubectlcreatenamespacemynamespacekubectlgetpods--all-namespaces(列出所有命名空间中的状态的所有Pod。)kubectlgetpo-owide-n-n-n(此命令将识别每个命名空间中的容器)kubectldescribenamespacekubectlconfigview--minify|grepnamespace(此命令将确保您在当前上下文中正确设置命名空间。)2.配置常用别名以节省时间Kubernetes命令可能很长,因此设置一些别名来运行kubectl非常有帮助。您将不再需要一遍又一遍地拼出完整的命令,当您想在一个会话中执行多个Kubernetes命令时,这会让您的工作更加轻松。我们在下面列出了一些常用命令的别名。在执行kubectl命令之前运行这些命令以节省一些时间。示例:无需键入kubectl,只需键入k:aliask='kubectl'aliaskc='kconfigview--minify|grepname'aliaskdp='kubectldescribepod'aliaskrh='kubectlrun--help|more'aliasugh='kubectlget--帮助|更多'aliasc='clear'aliaskd='kubectldescribepod'aliaske='kubectlexplain'aliaskf='kubectlcreate-f'aliaskg='kubectlgetpods--show-labels'aliaskr='kubectlreplace-f'aliaskh='kubectl--help|更多'aliaskrh='kubectlrun--help|more'aliasks='kubectlgetnamespaces'aliasl='ls-lrt'`aliasll='vils-rt|tail-1'`aliaskga='kgetpod--all-namespaces'aliaskgaa='kubectlgetall--show-labels'3.使用vi编辑YAML有许多不同的编辑器可用于编写YAML文件,但很多时候,您可能需要在终端上快速调整生成的YAML。这是我们经常使用vi的地方,vi是最初为Unix操作系统创建的文本编辑器。Vi编辑器有很好的文档记录,并得到开源社区的大力支持。但是,在创建YAML文件时vi编辑器的问题之一是格式问题。我们需要一种方法来缩进制表符并与空格对齐。编辑YAML文件时,始终使用制表符和空格来生成空格(例如,按Enter键时YAML默认为2个空格)。创建~/.vimrc并添加以下内容,以便更轻松地创建YAML文件并使用vi编辑它们:setsmarttabsetexpandtabsetshiftwidth=4settabstop=4setnumber4.从kubectl命令创建YAML我们可以使用kubectl工具从命令行。大多数人会争辩说使用YAML文件很无聊,而Kubernetes的YAML文件可能非常冗长并且难以从头开始创建。使用kubectl命令从空白页面创建YAML文件比使用编辑器要容易得多。以下命令将创建一个YAML文件yamlfile。使用这些kubectl命令创建YAML文件后,您可以根据需要修改它并使用它而不是从头开始编写它:kubectlrunbusybox--image=busybox--dry-run=client-oyaml--restart=Never>yamlfile。yamlkubectlcreatejobmy-job--dry-run=client-oyaml--image=busybox--date>yamlfile.yamllkubectlget-oyamlldeploy/nginx>1.yaml(Ensurethatyouhaveadeploymentnamedasnginx)kubectlrunbusybox--image=busybox--dry-run=client-oyaml--restart=Never--/bin/sh-c"whiletrue;doechohello;echohelloagain;done">yamlfile.yamllkubectlrunwordpress--image=wordpress--expose--port=8989--restart=Never-oyamlkubectlruntest--图像=busybox--restart=Never--dry-run=client-oyaml--bin/sh-c'echotest;sleep100'>yamlfile.yaml(在末尾添加--bin。这将创建yaml文件。)创建YAML文件另一个好主意是使用wget命令直接从Internet获取文件。5.在Kubernetes命名空间之间切换在技巧1中,我们学习了一些有用的命令来使用Kubernetes命名空间并保存它们,这样您就不必添加到每个命令。让我们扩展这个技巧,让它更容易在命名空间和kubectl上下文之间切换。有几种工具可以提供帮助,但我们喜欢使用kubectx和kubens分别管理上下文和命名空间。您可以在此处(https://github.com/ahmetb/kubectx/)找到kubectx和kubens的详细信息。以下是为kubectx和kubens实用程序下载Linux二进制文件的方法:wgethttps://github.com/ahmetb/kubectx/releases/download/v0.9.0/kubectx_v0.9.0_linux_x86_64.tar.gzcom/ahmetb/kubectx/releases/download/v0.9.0/kubens_v0.9.0_linux_x86_64.tar.gz然后,提取它们:tar-xvfkubectx_v0.9.0_linux_x86_64.tar.gztar-xvfkubens_v0.9.0_linux_x86_64.tar.gz最后,将它们移动到路径:tar-xvfkubectx_v0.9.0_linux_x86_64.tar.gztar-xvfkubens_v0.9.0_linux_x86_64.tar.gz安装后,您可以简单地使用kubens列出命名空间并在它们之间切换:当使用多个集群时,kubectx会在上下文之间切换abreeze:6.Shell自动补全你知道kubectl为BASH和ZSH提供自动补全吗?这是一个可选配置。假定您了解Kubernetes概念并且对kubectl有一些经验,但您可能不太擅长记住命令。首先安装bash-completion,然后启用kubectl自动完成。您可以在您的环境的“安装和设置kubectl(https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion)”文档页面中找到所有详细信息。以下是自动完成的配置选项:7.查看资源利用率Top命令可能是最流行的监控进程和系统资源的工具之一。它提供了一个简单的基于字符的界面,可以快速访问关键信息。您可以查看每个节点的资源利用率:每个Pod的资源利用率:方便的监控命令可帮助您以理想的时间间隔显示命令,而无需一遍又一遍地运行它。以下示例使其每五秒运行一次(默认为两秒):watchkubectltopnode-n5注意:需要为您的环境下载监视工具。你的Kubernetes集群也需要运行heapster来执行top命令,否则你会得到以下错误:“Errorfromserver(NotFound):theservercouldnotfindtherequestedresource(getserviceshttp:heapster:)”8.扩展kubectl并使用原始输出来创建您自己的命令。Kubectl命令提供了apiserver存储的资源的摘要视图。apiserver存储了很多不显示的字段。您可以使用带有原始资源输出的kubectlget命令来创建您自己的可视化和命令。您可以使用以下命令以JSON格式打印原始资源:kubectlgetdeployments-ojson您还可以使用api直接调用资源:kubectlget--raw=/apis/apps/v1/deployments您甚至可以将输出与jq等工具结合使用,以提供不同的可视化、过滤输出或将输出提供给其他工具以实现自动化。例如,在具有多个命名空间和部署的集群上很难发现问题,但以下示例使用原始API扫描集群中的所有部署,并仅过滤具有失败副本的部署:kubectlget--raw=/apis/apps/v1/deployments|jq``'.items[]|{name:.metadata.name,replicas:.status.replicas,available:(.status.availableReplicas//0),unavailable:(.status.unavailableReplicas//0)}|select(.unavailable>0)'下面是对上述命令的快速解释:首先,我们调用KubernetesAPI返回所有部署。默认输出是JSON。很难将JSON文档的结构可视化,但您可以将其通过管道传输到jq以获得更好的输出,例如:kubectlget--raw=/apis/apps/v1/deployments|jq。请注意,输出中的每个部署都有一个数组。最后我们要检查这个数组的状态字段。以下命令显示了当字段不可用时如何仅打印所需数据和默认值0:kubectlget--raw=/apis/apps/v1/deployments|jq``'.items[]|{name:.metadata.name,replicas:.status.replicas,available:(.status.availableReplicas//0),unavailable:(.status.unavailableReplicas//0)}'最后一块拼图是使用select函数来仅显示具有不可用副本的部署:kubectlget--raw=/apis/apps/v1/deployments|jq``'.items[]|{name:.metadata.name,replicas:.status.replicas,available:(.status.availableReplicas//0),unavailable:(.status.unavailableReplicas//0)}|select(.unavailable>0)'*本文翻译自https://www.ibm.com/cloud/blog/8-kubernetes-tips-and-tricks,版权归原作者所有