在观察和阅读许多其他人操作Kubernetes和Istio的过程中,我了解到在设置环境和使用各种工具,技巧和技巧的过程中,为了进一步提高生产力积累经验。本文总结了我每天使用的5个技巧和工具,以进一步提高我在使用Kubernetes和Istio时的工作效率。1.在Kubernetes上下文之间切换如果您同时运行本地Kubernetes实例和一个或多个云Kubernetes实例,您可能需要不时在不同上下文之间切换。KubernetesCLI(kubectl)提供了在不同上下文之间执行操作的命令,例如:current-contextget-contextsrename-contextdelete-contextset-context-use-context对于你想切换到的Kubernetes上下文,如果你知道它的名字,那么可以使用如下命令:kubectluse-context[CONTEXT-NAME]但是如果需要操作多个集群,不知道各个context的名字,就需要先列出所有的context,然后运行use-context像这样命令:$kubectlget-contextsCURRENTNAMECLUSTERAUTHINFONAMESPACE*docker-desktopdocker-desktopdocker-desktopminikubeminikubeminikubecloudccrdambvg43duser-crdambvg43d$kubectluse-contextminikube其实还有更简单的方法。我使用一个名为kubectx的工具,它可以列出不同的Kubernetes上下文并在它们之间快速切换。要列出上下文,可以像这样运行kubectx:$kubectxdocker-desktopminikubcloudc切换到不同上下文的方法也很简单:$kubectx[CONTEXT-NAME]2.在Kubernetes命名空间之间切换操作Kubernetes时,进程来自不同的名称空间资源,这也是很常见的做法。例如,您可能想要列出一个命名空间中的所有pod,然后检查另一个命名空间中的服务。我此时的方法是使用KubernetesCLI支持的--namespace标志。例如,要查看名为Test的命名空间中的所有Pod,您可以运行kubectlgetpods-ntest。默认情况下,如果未提供命名空间标记,则将使用默认的Kubernetes命名空间default。这个默认值可以在kubeconfig文件中修改,例如我们可以将默认命名空间设置为test、kube-system或任何其他命名空间。这消除了在查询资源时使用--namespace标志的需要。不过更改默认值的命令略显繁琐:$kubectlconfigsetcontexts.my-context.namespacemy-namespace上面的命令会将my-context上下文的Namespace字段更改为my-namespace。这也意味着,例如,如果您切换到my-context然后运行??kubectlgetpods,您将只会在my-namespace命名空间中看到Pod。除了使用kubectx,我们还可以使用一个名为kubens的工具,它可以帮助我们列出和切换到不同的命名空间。$kubensdefaultdockerkube-node-leasekube-publickube-system为所选上下文设置默认命名空间,这也是一个快速简单的操作:$kubensdefaultContext"docker-desktop"modified.Activenamespaceis"default"。3.为KubernetesCLI设置别名是一项非常简单的技巧。在操作Kubernetes的过程中,我们可能需要经常进入kubectl。时间长了,我们肯定会厌倦繁琐的输入全名的过程。虽然每次只需要输入七个字母,但是频繁输入也很麻烦。此时的技巧是为kubectl设置一个更简单的别名,例如k:$aliask=kubectl$kgetpoNAMEREADYSTATUSRESTARTSAGEmypod1/1Running1843h理想情况下,我们应该将k=kubectl这样的别名保存到bash_profile中,这样每次打开终端时都会自动设置。4.在Kubernetes集群中运行终端访问集群中的服务和Pod时,我们需要将它们暴露出来,以便可以从公网访问,或者运行一个Kube代理或者Forward端口。然而,有时我们可能不想暴露任何服务或转发端口,而只是需要运行一些非常简单的Curl命令。为此,我将通过Bash配置文件加载一个函数,以便使用radial/busyboxplus:curl图像在集群内运行一个Pod。这样,我就可以访问终端,然后对集群内的服务和IP运行Curl命令。我将此函数称为kbash并像这样使用它:$kbashIfyoudon'tseeacommandprompt,trypressingenter.[root@curl:/]$在上面的命令提示符下,我可以针对内部KubernetesDNS名称或IP地址运行Curl命令。如果需要退出,直接运行exit即可;如果需要重新连接到pod,可以运行kbash连接到现有的pod。同时,我也在自己的dotfiles中定义了这个函数。5.快速打开Grafana/Jaeger/Kiali如果你打算使用Istio服务网格(Servicemesh),你也可以使用Grafana/Jaeger/Kiali。访问这些服务时,首先要获取Pod名称,然后为Pod设置端口转发,最后打开浏览器访问转发的地址。每次需要输入的命令很长:$kubectlgetpods--namespaceistio-system-l"app=grafana"-ojsonpath="{.items[0].metadata.name}"grafana-6fb9f8c5c7-hrcqp$kubectl--namespaceistio-systemport-forwardgrafana-6fb9f8c5c7-hrcqp3000:3000$openhttp://localhost:3000更简单快捷的方法是为每个服务创建函数或别名。例如,我使用从Bash配置文件加载的文件为Grafana/Jaeger/Kiali添加了以下设置:#!/bin/bashexportGRAFANA_POD=$(kubectlgetpods--namespaceistio-system-l"app=grafana"-ojsonpath="{.items[0].metadata.name}")exportJAEGER_POD=$(kubectlgetpod-nistio-system-lapp=jaeger-ojsonpath='{.items[0].metadata.name}')exportKIALI_POD=$(kubectl-nistio-systemgetpod-lapp=kiali-ojsonpath='{.items[0].metadata.name}')aliasgrafana="kubectl--namespaceistio-systemport-forward$GRAFANA_POD3000:3000&openhttp://localhost:3000"aliasjaeger="kubectl--namespaceistio-systemport-forward$JAEGER_POD16686:16686&openhttp://localhost:16686"aliaskiali="kubectl--namespaceistio-systemport-forward$KIALI_POD20001:20001&openhttp://localhost:20001"这样如果需要打开Jaeger,你只需要运行jaeger获取pod名称,创建端口转发并打开浏览器。如果你在集群中运行其他经常访问的服务,你也可以通过类似的方式设置别名。
