Istio ServiceEntry 流量管理
· 阅读需 9 分钟
ServiceEntry 是通常用于在 Istio 网格之外启用对服务的请求
# 现有环境
kubectl get gw
#mygw
kubectl get vs
#myvs ["mygw"] ["aa.yuan.cc"]
kubectl get dr
#mydr svc1
kubectl get pods
#pod1
#pod2
kubectl exec -it pod1 -- bash
curl https://www.baidu.com #可以访问到外网,代表所有的数据都是可以出去的
# serviceEntry 就可以解决这个问题
创建 ServiceEntry
mkdir chap4 && cd chap4
cp ../chap3/vs.yaml ../chap3/mygw1.yaml ./
# 编辑 serviceEntry yaml
vim se1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: myse
spec:
hosts:
- www.baidu.com #对此网址进行限制
ports:
- number: 443 #通过443访问
name: https
protocol: HTTPS #通过HTTPS的方式访问
resolution: DNS #解析通过DNS解析
location: MESH_EXTERNAL # MESH_EXTERNAL -- 网格外部;MESH_INTERNAL -- 网格内部
# 创建 serviceEntry
kubectl apply -f se1.yaml
# 进入pod测试
kubectl exec -it pod1 -- bash
curl https://www.baidu.com #并没有被拦截,代表通过DNS并不可行
# 相当于黑名单
# 修改 serviceEntry ,通过自定义指定不可访问
vim se1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: myse
spec:
hosts:
- www.baidu.com #对此网址进行限制
ports:
- number: 443 #通过443访问
name: https
protocol: HTTPS #通过HTTPS的方式访问
#resolution: DNS #解析通过DNS解析
resolution: STATIC
location: MESH_EXTERNAL
endpoints:
- address: 192.168.26.3 #指定访问的 www.baidu.com 就是 192.168.26.3
# 重启 serviceEntry
kubectl apply -f se1.yaml
# 进入pod测试
kubectl exec -it pod1 -- bash
curl https://www.baidu.com #访问被拦击
默认策略
# 修改策略
kubectl edit configmap istio -n istio-system -o yaml
data:
mesh: |-
accessLogFile: /dev/stdout
defaultConfig:
discoveryAddress: istiod.istio-system.svc:15012
proxyMetadata: {}
tracing:
zipkin:
address: zipkin.istio-system:9411
enablePrometheusMerge: true
outboundTrafficPolicy: # 如果不加则默认是 ALLOW_ANY
mode: REGISTRY_ONLY # 只有注册的,才可以访问
rootNamespace: istio-system
#此策略也可以在安装istio时进行设置:
istioctl install --set profile=demo -y --set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY
# 测试
kubectl exec -it pod1 -- bash
curl https://www.jd.com #访问不通
curl svc1 #可以访问通,返回111
# 模拟环境 创建 podx
vim /root/podx.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: podx
name: podx
spec:
terminationGracePeriodSeconds: 0
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: podx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
#启动 podx
kubectl apply -f /root/podx.yaml
#启动 svcx
kubectl expose --name=svcx pod podx --port=80
# 使用 pod1 测试
kubectl exec -it pod1 -- bash
curl svcx #可以访问到
# 更改 podx 的 namespace 再次测试 (default namespace 没有自动被 istio 注入)
kubectl apply -f podx.yaml -n default
kubectl expose --name=svcx pod podx --port=80 -n default
------------
#pod1 还是可以访问通的,可能是集群内是可以访问的通的,只是限制出口的流量
kubectl get pods -n default
kubectl delete pod podx -n default
kubectl get svc svcx -n default
kubectl delete svc svcx -n default
# 相当于设置 se 白名单
# 修改 serviceEntry yaml
vim se1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: myse
spec:
hosts:
- www.baidu.com #此处就相当于了放行
- www.jd.com
ports:
- number: 443 #通过443访问
name: https
protocol: HTTPS #通过HTTPS的方式访问
resolution: DNS #解析通过DNS解析
#resolution: STATIC
location: MESH_EXTERNAL
# 启动 se ,进行测试
kubectl apply -f se1.yaml
# 使用 pod1 测试
kubectl exec -it pod1 -- bash
curl https://www.jd.com #可以访问通
curl https://www.baidu.com #可以访问通
curl https://www.qq.com #访问不通
#如果想修改的所有放行,则修改回之前的策略
kubectl edit configmap istio -n istio-system -o yaml
outboundTrafficPolicy: # 如果不加则默认是 ALLOW_ANY
mode: ALLOW_ANY # 改为所有
#删除 se
kubectl delete -f se1.yaml
# pod 则默认都可以访问外网地址
workEntry

**目的是把 其他主机/虚拟机/服务器 纳入到service mesh里 **
此处现将我们现有的测试环境做一套快 照,不然环境弄乱了不好恢复.....
- 启用主动注册的性能 (先不做)
istioctl install --set profile=demo --set
values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true
- 启动 自动注册 和 智能DNS
istioctl install --set profile=demo --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true --set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE='\"true\"'
#此处本地的测试环境启动智能DNS会失败,就启动自动注册就好
istioctl install --set profile=demo --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true
kubectl get pods -n istio-system -o wide
#istiod 10.244.186.142
kubeadm config view
# podSubnet: 10.244.0.0/16
新创建虚拟机进行测试
#创建虚拟机 IP:192.168.26.23, ping k8s pod 的 ip 是 ping 不通的
ping 10.244.186.142 #不通
#添加网关
route add -net 10.244.0.0 gw 192.168.26.82 netmask 255.255.0.0 #gw的ip是gw所在节点的IP,可以写进配置文件中永久生效
ping 10.244.186.142 #可以访问了
## 下载 sidecar 安装包,根据系统来选择
https://storage.googleapis.com/istio-release/releases/1.10.3/deb/istio-sidecar.deb
dpkg -i istio-sidecar.deb
https://storage.googleapis.com/istio-release/releases/1.10.3/rpm/istio-sidecar.rpm
rpm -ivh istio-sidecar.rpm
创建 WorkloadGroup
cd chap4 && vim mywg.yaml
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
name: mywg
namespace: ns1
spec:
metadata:
annotations: {}
labels:
app: test #指定的标签
template:
ports: {}
serviceAccount: sa1 #使用sa1来管理
# 创建 wg
kubectl get wg
kubectl apply -f mygw.yaml && kubectl get wg
# 创建 sa
kubectl get sa
# default 1 ##是在 default 的 namespace
kubens
# ns1 所在 ns1 的 namespace 上
#创建sa1
kubectl create sa sa1
# 生成虚拟机安装所需要的文件
mkdir 11
istioctl x workload entry configure -f mywg.yaml -o 11
ls 11
# cluster.env hosts istio-token mesh.yaml root-cert.pem
# 把11目录及里面的东西拷贝到虚拟机
scp -r 11/ 192.168.26.23:~