服务网格 Istio 全系列之一 —— Istio 初探


Istio 初探

        上节轻松完成了 Istio 的安装,但是我相信安装成功的小伙伴依然云里雾里,因为看着一大坨 pod 在那里 running 着,似乎并没有产生任何作用。这节,我们会就带您“莫畏浮云遮望眼,守得云开见月明”。为了预期效果,不妨先建立一个 deployment,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        -  name: nginx
           image: nginx:1.14-alpine
           ports:
           - containerPort: 80

        创建 deployment,当然为了让你能更深刻地记住哥,把哥印在灵魂深处,你需要首先创建一个命名空间:

# kubectl create ns jiuxi
# kubectl apply -f nginx-deployment.yaml -n jiuxi

        命令执行成功后,查询 nginx pod 状态:

# kubectl get pods -n jiuxi

        截图如下:需要注意 ready 这一列,内容为 1/1,表示的含义是 pod 内有一个容器,且该容器运行成功并处于就绪状态。

image.png

        下面到了激动人心的时刻了,因为 istio 即将闪亮登场。

手动注入 sidecar

        执行如下语句:

# kube-inject -f nginx-deployment.yaml | kubectl apply  -n jiuxi -f -

        命令执行结果如下图所示:

image.png

        此时你会发现一个奇怪的现象,nginx-deployment.yaml 并没修改,但是 ready 状态却变成了 2/2。根据上面的解释可知,现在 pod 内有两个容器,且这两个容器都运行成功并处于就绪状态。为什么多了一个容器呢?

        查看 pod 的详细信息:

# kubectl get pod -n jiuxi nginx-xxxx -o yaml # xxxx 根据自己实际情况填写

        如果你有类似 rancher 的控制台,可以看得更仔细些,如下图所示。

image.png

        从上图可知。此时 nginx pod 内部一共有 3 个容器,一个初始化容器 istio-init 已经运行成功并结束了,一个就是 nginx 本尊,另外一个就是本文的主角 istio-proxy 了,它就是 sidecar,负责跟外部打交道用的。

        此时此刻,你已经为 pod 手工织入了 Istio。但是这样似乎有点不够爽。因为每建立一个 pod 都撸这么一管,感觉有点累,有没有批量或者更自然的方式呢?

命名空间注入 sidecar

        现在我们删除掉刚才创建的 nginx:

# kubectl delete deployments.apps nginx -n jiuxi

        执行如下命令在命名空间内实现自动注入 sidecar:

# kubectl label namespaces jiuxi istio-injection=enabled
# kubectl get ns jiuxi --show-labels # 查看 label 是否成功创建

        再次根据 nginx-deployment.yaml 文件创建 nginx deployment:

# kubectl apply -f nginx-deployment.yaml -n jiuxi

        创建成功后查看 pod 信息,发现已经自动织入了 sidecar。

        自此,Istio 的手动和自动织入功能完成。