@liuhui0803
2019-08-08T11:15:32.000000Z
字数 3549
阅读 1047
Kubernetes
Istio
运维
生产力
我通过观察和阅读了解到很多人操作Kubernetes和Istio的过程中,为了进一步提高生产力,在搭建环境以及使用各类工具、技巧和诀窍过程中积累的经验。本文总结了我每天都会使用的5个技巧和工具,它们进一步提高了我操作Kubernetes和Istio时的生产力。
如果同时运行本地Kubernetes实例以及一个或多个云端Kubernetes实例,那么你可能时不时就需要在不同上下文之间切换。Kubernetes CLI(kubectl
)提供了用于在不同上下文之间执行操作的命令,例如:
对于想要切换到的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]
在操作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".
这是一种非常简单的技巧。操作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
中,这样每次打开终端后都将自动设置。
在访问集群中的服务和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中。
如果打算使用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名称,创建端口转发并打开浏览器。
如果你在集群中运行了其他什么需要频繁访问的服务,也可以用类似方式来设置别名。
本文最初发布于Learn Istio Service Mesh博客,经原作者授权由InfoQ中文站翻译并分享。