介绍
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 生效,必须要满足以下几个条件:
- 每个 Pod 只能绑定一个 Service
- Service 暴露的端口必须设置了 Name
- Deployment 必须设置了至少一个 Label
- 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/