19

8个Kubernetes运维的技巧

 3 years ago
source link: http://os.51cto.com/art/202010/630288.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在本文中,我们将探索一些技巧和窍门,这些技巧将使使用Kubernetes更加容易。下面给出的大多数技巧都使用kubectl,这是一个功能强大的命令行工具,可让您对Kubernetes集群执行命令。

1.设置默认namespace

您可以使用namespace(例如,Dev1,Dev2,QA1,QA2等)将Kubernetes集群划分为多个环境,并且每个环境可以由不同的用户管理。运行kubectl命令的不便之一是,每次编写命令时,都需要在最后使用该--namespace 选项。运维人员通常会忘记这一点,最终在错误的namespace中创建对象(pod,service,deployment)。

使用此技巧,您可以在运行kubectl命令之前设置namespace首选项。在执行kubectl命令之前运行以下命令,它将为您的当前上下文保存所有后续kubectl命令的namespace:

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

下面列出了一些最常用和有用的namespace命令:

kubectl get namespaces

kubectl create namespace mynamespace

kubectl get pods --all-namespaces (列出所有namespace中具有状态的所有Pod。)

kubectl get po -o wide -n -n -n (此命令将标识每个namespace中的容器)

kubectl describe namespace

kubectl config view --minify | grep namespace (此命令将确保您为当前上下文正确设置namespace。)

2.配置常用的aliases别名以节省时间

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='vils -rt | tail-1'`

alias kga='k get pod --all-namespaces'

alias kgaa='kubectl get all --show-labels'

3.使用vi编辑YAML

有许多不同的编辑器可用于编写YAML文件,但是在很多时候,您可能需要在终端上快速调整生成的YAML。这是使用我们经常使用vi的地方,vi是最初为Unix操作系统创建的文本编辑器。

Vi编辑器有据可查,并且得到了开源社区很好的支持。但是,创建YAML文件时vi编辑器的问题之一是格式问题。我们需要一种缩进制表符并与空格对齐的方法。在编辑YAML文件时,总是使用制表符和空格键来产生空格(例如,在按回车键时,将2个空格作为YAML的默认值)。

创建 ~/.vimrc 并添加以下内容,从而使创建YAML文件并用vi编辑变得更加容易:

set smarttab

set expandtab

set shiftwidth=4

set tabstop=4

set number

4.从kubectl命令创建YAML

我们可以使用kubectl工具从命令行创建复杂的YAML文件。

大多数人会认为,使用YAML文件很无聊,而Kubernetes的YAML文件可能非常冗长且难以从头开始创建。使用kubectl命令而不是使用编辑器从空白页创建YAML文件要容易得多。

以下命令将创建一个YAML文件 yamlfile。通过这些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 (Ensure that you have a deployment named as 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文件。)

创建YAML文件的另一个好办法是使用wget 命令直接从Internet获得文件 。

5.在Kubernetes namespace之间切换

在技巧1中,我们学习了一些有用的命令来使用Kubernetes namespace并保存它们,以便您不必添加到每个命令中。让我们扩展技巧,使其更容易在namespace和kubectl上下文之间切换。

有几种工具可以提供帮助,但是我们喜欢使用kubectx和kubens分别管理上下文和namespace。您可以在此处(https://github.com/ahmetb/kubectx/)找到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列出namespace并在它们之间切换:

当使用多个集群时,kubectx使在上下文之间切换变得轻而易举:

6. Shell自动补全

您知道kubectl为BASH和ZSH提供自动完成功能吗?这是一个可选配置。

假设您了解Kubernetes的概念并且对kubectl有一定的经验,但是也许您不太擅长记住命令。首先安装bash-completion,然后启用kubectl自动补全。您可以在适用于您环境的“ Install and Set kubectl(https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) ”文档页面中找到所有详细信息。

以下是具有自动完成功能的配置选项:

7.查看资源利用率

Top命令可能是监视进程和系统资源的最受欢迎的工具之一。它提供了一个基于字符的简单界面,可以快速访问关键信息。

您可以看到每个节点的资源利用率:

每个Pod的资源利用率:

便捷的监视命令可以帮助您以理想的时间间隔显示命令,而不必一遍又一遍地运行它。以下示例使它每五秒钟运行一次(默认值为两秒钟):

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之类的工具结合使用,以提供不同的可视化效果,过滤输出或将输出提供给其他工具以实现自动化。

例如,在具有多个namespace和部署的集群上很难找到问题,但是下面的示例使用原始API扫描集群中的所有deployment,并仅过滤具有失败副本的deployment:

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返回所有deployment。默认输出为JSON。很难形象化JSON文档的结构,但是您可以通过管道将其传递给jq以获得更好的输出,例如下面的示例:

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

请注意,输出中对每个deployment都有一个数组。最后我们要检查这个数组的状态字段。下面的命令显示如何在字段不可用时仅打印所需的数据和默认值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函数仅显示具有不可用副本的deployment:

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)'

*本文译自 https://www.ibm.com/cloud/blog/8-kubernetes-tips-and-tricks,版权归原作者所有


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK