如何提升 Kubernetes 生产力?我有 5 个实用技巧分享给你
1. 在 Kubernetes 上下文之间切换
如果同时运行本地 Kubernetes 实例以及一个或多个云端 Kubernetes 实例,那么你可能时不时就需要在不同上下文之间切换。Kubernetes CLI(kubectl)提供了用于在不同上下文之间执行操作的命令,例如:
复制代码
current-context get-contexts rename-context delete-context set-context–use-con text
对于想要切换到的 Kubernetes 上下文,如果知道它的名称,那么可以使用如下的命令:
复制代码
kubectluse-context[CONTEXT-NAME]
但如果需要操作多个集群,并且不知道各种上下文的名称,此时就需要首先列出所有上下文,随后像这样运行 use-context 命令:
复制代码
$kubectlget-contexts CURRENTNAMECLUSTERAUTHINFONAMESPACE *docker-desktopdocker-desktopdocker-desktop minikubeminikubeminikube cloudccrdambvg43duser-crdambvg43d $kubectluse-contextminikube
其实还有更简单的方法。我用了一款名为 kubectx 的工具,该工具可以列出不同的 Kubernetes 上下文并快速切换。若要列出上下文,可以这样运行 kubectx:
复制代码
$kubectx docker-desktop minikub cloudc
切换至不同上下文的方法也很简单:
复制代码
$ kubectx[CONTEXT-NAME]
2. 在 Kubernetes 名称空间之间切换
在操作 Kubernetes 时,处理来自不同名称空间的资源,这也是一种很常见的做法。例如,你可能希望列出一个名称空间内的所有 Pod,随后检查另一个名称空间中的服务。此时我的做法是使用 Kubernetes CLI 所支持的–namespace 标记。例如,若要查看名为 Test 的名称空间中的所有 Pod,可以运行 kubectl get pods -n test。默认情况下,如果不提供名称空间标记,将使用默认的 Kubernetes 名称空间,即 default。
这个默认值可以在 kubeconfig 文件中修改,例如我们可以将默认名称空间设置为 test、kube-system 或其他任何名称空间。这样在查询资源时就不需要使用–namespace 标记了。不过更改默认值的命令略微繁琐:
复制代码
$ kubectlconfigsetcontexts.my-context.namespace my-namespace
上述命令会更改 my-context 上下文的 Namespace 字段,将其改为 my-namespace。这也意味着,举例来说,如果切换到 my-context 随后运行 kubectl get pods,将只能看到 my-namespace 名称空间下的 Pod。
除了使用 kubectx,我们还可以使用一款名为 kubens 的工具,后者可以帮助我们列出并切换至不同名称空间。
复制代码
$ kubens default docker kube-node-lease kube-public kube-system
为所选上下文设置默认名称空间,这也是一种快速简单的操作:
复制代码
$ kubensdefault Context"docker-desktop"modified. Active namespace is"default".
3. 为 Kubernetes CLI 设置别名
这是一种非常简单的技巧。操作 Kubernetes 过程中,我们可能需要频繁输入 kubectl,时间一长肯定会对输入全名的繁琐过程感到厌倦。虽然每次只需要输入七个字母,但多次频繁输入总归很麻烦。
此时的技巧是,为 kubectl 设置一个更简单的别名,例如 k:
复制代码
$ alias k=kubectl $ kgetpo NAME READY STATUS RESTARTS AGE mypod1/1Running1843h
理想情况下,我们应该将 k=kubectl 这样的别名保存到 bash_profile 中,这样每次打开终端后都将自动设置。
4.Get a terminal inside the Kubernetes cluster
在访问集群中的服务和 Pod 时,我们需要将其暴露出来,这样才可以从公网访问它们,或在本机和集群中运行的服务之间运行 Kube 代理或转发端口。
然而有时候我们可能并不想暴露任何服务或转发端口,而只需要运行某些非常简单的 Curl 命令。为此我会通过 Bash profile 加载一个函数,借此在集群内部使用 radial/busyboxplus:curl 镜像运行一个 Pod,通过这样的方式就可以访问终端,进而可以针对集群内部的服务和 IP 运行 Curl 命令。我将这个函数称之为 kbash,用法如下:
复制代码
$ kbash Ifyou don'tsee a command prompt,trypressing enter. [ root@curl:/ ]$
在上述命令提示符下,我可以针对内部的 Kubernetes DNS 名称或 IP 地址运行 Curl 命令。如果需要退出,只需要运行 exit 即可;如果需要重新连接到该 Pod,则可运行 kbash 连接到现有 Pod。同时我还将这个函数定义到了自己的 dotfiles 中。
5. 快速打开 Grafana/Jaeger/Kiali(或其他任何东西)
如果打算使用 Istio 服务网格(Service mesh),那么可能还会用到 Grafana/Jaeger/Kiali。访问这些服务时必需首先获得 Pod 名称,随后针对该 Pod 设置端口转发,最后才能打开浏览器访问转发后的地址。每次需要输入的命令都很长:
复制代码
$kubectl get pods --namespace istio-system-l"app=grafana"-o jsonpath="{.items[0].metadata.name}" grafana-6fb9f8c5c7-hrcqp $kubectl --namespace istio-systemport-forward grafana-6fb9f8c5c7-hrcqp3000:3000 $open http://localhost:3000
而更简单快捷的方法是为每个服务创建函数或别名。例如,我通过使用 Bash profile 加载的一个文件为 Grafana/Jaeger/Kiali 添加了如下设置:
复制代码
#!/bin/bash export GRAFANA_POD=$(kubectlgetpods--namespaceistio-system-l"app=grafana"-ojsonpath="{.items[0].metadata.name}") export JAEGER_POD=$(kubectlgetpod-nistio-system-lapp=jaeger-ojsonpath='{.items[0].metadata.name}') export KIALI_POD=$(kubectl-nistio-systemgetpod-lapp=kiali-ojsonpath='{.items[0].metadata.name}') alias grafana="kubectl --namespace istio-system port-forward $GRAFANA_POD 3000:3000 & open http://localhost:3000" alias jaeger="kubectl --namespace istio-system port-forward $JAEGER_POD 16686:16686 & open http://localhost:16686" alias kiali="kubectl --namespace istio-system port-forward $KIALI_POD 20001:20001 & open http://localhost:20001"
这样,如果需要打开 Jaeger,只需要运行 jaeger 就可以获得 Pod 名称,创建端口转发并打开浏览器。
如果你在集群中运行了其他什么需要频繁访问的服务,也可以用类似方式来设置别名。
原文链接:
https://www.learnistio.com/blog/5_tips_to_be_more_productive_with_kubernetes