使用istio + servicemesh搭建服务网格
官方文档:
https://istio.io/latest/zh/docs/setup/getting-started/
1. 下载istio安装包
https://github.com/istio/istio/releases/tag/1.7.0
2. 通过istioctl安装
istioctl install
3. Sidecar注入
官方文档
https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/
3.1 手动注入
istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -
命令istioctl kube-inject会将创建sidecar需要的配置插入到sleep.yaml得配置中
3.2 自动注入
kubectl label namespaces <nsName> istio-injection=enabled
这样在namespace nsName 中创建得pod会被自动注入sidecar
3.3 自动注入不生效怎么办
原因一:准入控制器相关问题
参考:
https://istio.io/latest/zh/docs/ops/configuration/mesh/webhook/
Istio 使用 ValidatingAdmissionWebhooks 验证 Istio 配置,使用 MutatingAdmissionWebhooks 自动将 Sidecar 代理注入至用户 Pod。
# a) 首先判断当前使用的apiserver默认会开启哪些准入控制器(admission controllers)
kube-apiserver -h | grep enable-admission-plugins
# b) 如果没有ValidatingAdmissionWebhooks和MutatingAdmissionWebhooks,则需修改apiserver启动参数开启
# 编辑/etc/kubernetes/manifests/kube-apiserver.yaml修改如下,然后重建
# --enable-admission-plugins=NodeRestriction,ValidatingAdmissionWebhooks,MutatingAdmissionWebhooks
# c) 如果已开启,那么需要确认名为istio-sidecar-injector的webhook是否存在
kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io
# d) 如果不存在,说明istio部署有问题,如果存在还不生效,需要看一下istio-sidecar-injector的配置
kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector -o yaml
# e) 主要查看matchLabels字段,可以自动注入的labek并不是istio-injection=enabled
4. 开启both sidecar
为接收端配置containerPort即可开启both sidecar,可以对比下开启both sidecar前后iptables的差别:
--- iptables.1 2020-09-09 17:56:26.452129512 +0800
+++ iptables.2 2020-09-09 17:56:18.308026728 +0800
@@ -1,5 +1,6 @@
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
# 首先在PREROUTING链这里将所有的流量导向ISTIO_INBOUND
+ISTIO_INBOUND tcp -- 0.0.0.0/0 0.0.0.0/0
Chain INPUT (policy ACCEPT)
target prot opt source destination
@@ -11,7 +12,11 @@
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
-Chain ISTIO_IN_REDIRECT (1 references)
+Chain ISTIO_INBOUND (1 references)
+target prot opt source destination
# 然后在ISTIO_INBOUND中将访问containerPort端口的流量导向ISTIO_IN_REDIRECT
# ISTIO_IN_REDIRECT和ISTIO_REDIRECT规则一样,都是将流量重定向到本地15001端口
+ISTIO_IN_REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8088
+
+Chain ISTIO_IN_REDIRECT (2 references)
target prot opt source destination
REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 redir ports 15001