在观察和阅读很多其它人操作 Kubernetes 和 Istio 的过程中, 我了解到了他们为了进一步提高生产力, 在搭建环境以及使用各类工具, 技巧和诀窍过程中积累的经验. 本文总结了我每天都会使用的 5 个技巧和工具, 它们进一步提高了我操作 Kubernetes 和 Istio 时的生产力.
1. 在 Kubernetes 上下文之间切换
如果同时运行本地 Kubernetes 实例以及一个或多个云端 Kubernetes 实例, 那么你可能时不时就需要在不同上下文之间切换. Kubernetes CLI(kubectl)提供了用于在不同上下文之间执行操作的命令, 例如:
current-contextget-contextsrename-contextdelete-contextset-context - use-context
对于想要切换到的 Kubernetes 上下文, 如果知道它的名称, 那么可以使用如下的命令:
kubectl use-context [CONTEXT-NAME]
但如果需要操作多个集群, 并且不知道各种上下文的名称, 此时就需要首先列出所有上下文, 随后像这样运行 use-context 命令:
- $ kubectl get-contexts
- CURRENT NAME CLUSTER AUTHINFO NAMESPACE
- * docker-desktop docker-desktop docker-desktop
- minikube minikube minikube
- cloudc crdambvg43d user-crdambvg43d
- $ kubectl use-context minikube
其实还有更简单的方法. 我用了一款名为 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 标记了. 不过更改默认值的命令略微繁琐:
$ kubectl config set contexts.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
为所选上下文设置默认名称空间, 这也是一种快速简单的操作:
- $ kubens default
- Context "docker-desktop" modified.
- Active namespace is "default".
3. 为 Kubernetes CLI 设置别名
这是一种非常简单的技巧. 操作 Kubernetes 过程中, 我们可能需要频繁输入 kubectl, 时间一长肯定会对输入全名的繁琐过程感到厌倦. 虽然每次只需要输入七个字母, 但多次频繁输入总归很麻烦.
此时的技巧是, 为 kubectl 设置一个更简单的别名, 例如 k:
- $ alias k=kubectl
- $ k get po
- NAME READY STATUS RESTARTS AGE
- mypod 1/1 Running 18 43h
理想情况下, 我们应该将 k=kubectl 这样的别名保存到 bash_profile 中, 这样每次打开终端后都将自动设置.
4. 在 Kubernetes 集群中运行 terminal
在访问集群中的服务和 Pod 时, 我们需要将其暴露出来, 这样才可以从公网访问它们, 或在本机和集群中运行的服务之间运行 Kube 代理或转发端口.
然而有时候我们可能并不想暴露任何服务或转发端口, 而只需要运行某些非常简单的 Curl 命令. 为此我会通过 Bash profile 加载一个函数, 借此在集群内部使用 radial/busyboxplus:curl 镜像运行一个 Pod, 通过这样的方式就可以访问终端, 进而可以针对集群内部的服务和 IP 运行 Curl 命令. 我将这个函数称之为 kbash, 用法如下:
- $ kbash
- If you don't see a command prompt, try pressing 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-system port-forward grafana-6fb9f8c5c7-hrcqp 3000:3000
- $ open http://localhost:3000
而更简单快捷的方法是为每个服务创建函数或别名. 例如, 我通过使用 Bash profile 加载的一个文件为 Grafana/Jaeger/Kiali 添加了如下设置:
- #!/bin/bash
- export GRAFANA_POD=$(kubectl get pods --namespace istio-system -l "app=grafana" -o jsonpath="{.items[0].metadata.name}")
- export JAEGER_POD=$(kubectl get pod -n istio-system -l App=jaeger -o jsonpath='{.items[0].metadata.name}')
- export KIALI_POD=$(kubectl -n istio-system get pod -l App=kiali -o jsonpath='{.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 名称, 创建端口转发并打开浏览器.
如果你在集群中运行了其他什么需要频繁访问的服务, 也可以用类似方式来设置别名.
来源: http://news.51cto.com/art/201908/601258.htm