官方文档:

https://istio.io/latest/zh/docs/setup/getting-started/

1. 下载istio安装包

https://github.com/istio/istio/releases/tag/1.7.0

2. 通过istioctl安装

Profile说明

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