安装 Istio 0.2.12

介绍

Istio 是 Service Mesh 的具体实现,它使用十分简单的方式为微服务构建一层网络.这层网络具有可控性,而运行在这层网络上的微服务并不需要做出任何改动,即可无缝使用.

Istio主要由Envoy、Pilot、Mixer组成,各自的有特定的功能:

  • Envoy: 以 sidecar 的形式和应用服务运行与同一个 pod 中,通过修改 iptables 来代理应用程序的所有出入流量

  • Pilot: 类似控制中心,根据设定的指令,控制所有 Envoy 的行为

  • Mixer: 从 Envoy 处获取流量属性, 根据预设的规则对流量进行处理

部署

curl -SL -O https://github.com/istio/istio/releases/download/0.2.12/istio-0.2.12-linux.tar.gz
tar -zxf istio-0.2.12-linux.tar.gz
cd istio-0.2.12

# 将istioctl 移到系统路径下,方便执行命令
mv bin/istioctl /usr/local/bin
cd install/kubernetes/

ls
# addons  istio-auth.yaml  istio-initializer.yaml  istio-one-namespace-auth.yaml  istio-one-namespace.yaml  istio.yaml  mesh-expansion.yaml  README.md

# 查看 README.md ,其中有对每个yaml文件的说明,
# 可以选择部署 istio.yaml ;或可以选择部署 istio-auth.yaml,不过它会使 sidecar 之间的连接启用 TLS 验证.
# 部署前,需要注意两者的svc的都是 LoadBalancer 的访问方式, 可以将其改为 NodePort 的方式,方便本地调试验证

kubectl apply -f istio.yaml
# 若提示: unable to recognize xxxxxx 的信息,则是有些配置还未来得及生效,再 apply 一次就好.

注入

为了使 Istio 生效,必须要满足以下几个条件:

  1. 每个 Pod 只能绑定一个 Service
  2. Service 暴露的端口必须设置了 Name
  3. Deployment 必须设置了至少一个 Label
  4. Pod 中必须包含一个 Istio Sidecar 的 Container

因此,需要修改部署的 yaml 文件.这里就用到了 istioctl ,需要使用istioctl kube-inject命令,这里用官方的 sample 下的 bookinfo 作为示例:

kubectl apply -f <(istioctl kube-inject -f istio-0.2.12/samples/bookinfo/kube/bookinfo.yaml)

istioctl接收到参数kube-inject后,会主动修改指定的 yaml 文件,自动注入 Sidecar 的参数配置.

验证

在创建 Istio 时,已经包含了 Istio-Ingress, 如果没有将 LoadBalancer 方式改为 NodePort,则可以使用以下命令查看访问端口:

echo (kubectl get po -n istio-system -l istio=ingress -o 'jsonpath={.items[0].status.hostIP}'):(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')

跟上URI路径:/productpage,即可访问 bookinfo 的内容.

addon

如果需要监控 Istio, 内部的 install/kubernetes/addons/ 目录下的几个 yaml 配置可以直接启动生效.

kubectl apply -f install/kubernetes/addons/