系列文章:
总目录索引:九析带你轻松完爆 istio 服务网格系列教程
目录
1 流量管理
2 创建命名空间
3 资源文件准备
3.1 创建网关文件
3.2 创建虚拟服务文件
3.3 创建 k8s service 文件
3.4 创建 k8s deployment 文件:
3.5 修改 istio-ingressgateway deployment
4 尝试网关路由功能
4.1 确定 INGRESS_HOST
4.2 编辑浏览器所在主机 hosts 文件
4.3 访问 tomcat
5 小节
1 流量管理(traffic management)
如果你对博客有任何疑问,请告诉我。
istio 四大特性是流量管理(traffic management)、安全(security)、策略(policies)和遥测(observability)。
本节重点介绍 istio 流量管理。流量管理的本质是对网络流量的路由和控制。生活中经常有这样的例子,比如下雨塌方,交警会疏导新的交通路线,这便是路由;比如景区周末实行单双号限行,这便是流量控制。
在介绍流量管理之前,首先介绍一下网络流向,介绍一个 http 请求在安装了 istio 的 k8s 中都经过哪些点,有了这个介绍之后,再谈流量管理将是水到渠成的事情。
下图便是网络流向图:
当用户使用浏览器发起一个请求( http://jiuxi.com/xxx )进入 k8s 中的 istio-ingressgateway,因为在 istio-ingressgateway 上设置了 istio 的 gateway,而且此 gateway 又绑定了 virtual service,在 virtual service 设置了 2 条路由规则,分别指向 tomcat 和 nginx 这 2 个 k8s service,而每个 service 又关联到各自的 pod,于是此请求最终可根据 url 触达到 pod 内的容器。
了解了请求流向的整个流程,下面介绍如何操作。前提是你已经安装好了 k8s 和 istio。关于如何安装和配置 istio,可以查看本人的系列文章第一章。
2 创建命名空间
kubectl create ns jiuxi
istio 默认安装在 jiuxi 这个命名空间下,并且设置在 jiuxi 命名空间自动注入 sidecar。相关操作请参考本人系列文章的第一章。
3 资源文件准备
从上图可知,共需要 4 个资源文件(yaml):
1 jiuxi-gateway.yaml
2 jiuxi-virtual-svc.yaml
3 jiuxi-svc.yaml( tomcat 和 nginx 的 service 写在一个文件)
4 jiuxi-deploy.yaml(tomcat 和 nginx 的 deployment 写在一个文件)
3.1 创建网关文件
网关文件 jiuxi-gateway.yaml 文件内容如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: jiuxi-gateway
namespace: jiuxi
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- jiuxi.com
port:
number: 80
name: http
protocol: HTTP
创建资源:
kubectl apply -f jiuxi-gateway.yaml
3.2 创建虚拟服务文件
虚拟服务文件 jiuxi-virtual-svc.yaml 文件内容如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: jiuxi-virtual-svc
namespace: jiuxi
spec:
gateways:
- jiuxi-gateway
hosts:
- jiuxi.com
http:
- route:
- destination:
host: tomcat-svc
port:
number: 8080
weight: 50
- destination:
host: nginx-svc
port:
number: 80
weight: 50
创建资源:
kubectl apply -f jiuxi-virtual-svc.yaml
3.3 创建 k8s service 文件
服务文件 jiuxi-svc.yaml 文件内容如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: jiuxi
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-pod
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: jiuxi
spec:
ports:
- name: port
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: tomcat-pod
创建资源:
kubectl apply -f jiuxi-svc.yaml
3.4 创建 k8s deployment 文件
jiuxi-deploy 文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
namespace: jiuxi
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: port
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat-deploy
name: tomcat-deploy
namespace: jiuxi
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-pod
template:
metadata:
labels:
app: tomcat-pod
spec:
containers:
- image: docker.io/kubeguide/tomcat-app:v1
imagePullPolicy: Always
name: tomcat
ports:
- containerPort: 8080
name: port
protocol: TCP
创建资源:
kubectl apply -f jiuxi-deploy.yaml
3.5 修改 istio-ingressgateway deployment
这一步非常重要,因为默认情况下 istio-ingressgateway 对应的容器并没有暴露在服务网格之外,所以我们需要将其暴露出来。编辑 istio-system 命名空间下的 istio-ingressgateway deployment:
kubectl edit deployment -n istio-system istio-ingressgateway
修改内容如下截图所示:
4 尝试网关路由功能
4.1 确定 INGRESS_HOST
kubectl get pod -n istio-system -o wide
执行结果如下图所示,本人的 INGRESS_HOST 就是 10.110.101.205。
4.2 编辑浏览器所在主机 hosts 文件
vim /etc/hosts # linux
c:/windows/system32/drivers/etc/hosts # windows
添加 DNS 记录:
10.110.101.205 jiuxi.com # 根据个人实际情况改写
4.3 访问 tomcat
浏览器输入 http://jiuxi.com,帮尝试多刷新几次,你就会看到流量分别路由到 tomcat 和 nginx 服务去了,并且流量上基本达到了均分,各 50%。
5 小节
自此我们使用了 istio 的 gateway 和 virtual service 实现了流量管理的功能。下面我们还会继续庖丁解牛 istio 其他强大的特性。