今天,让我们一起来在k8s环境下,体验一下envoy.
环境说明:
- ubuntu 20.04.2 三台
- k8s: v1.22.2,1个master节点 + 2 个worker节点
- Harbor-2.4 ,域名:hb.cn
- docker:
实验的目标:
使用envoy POD做反向代理,访问另一个POD tomcat(业务容器),并通过NodePort的方式,把envoy的服务暴露去出,实现可以在k8s中任意node节点上访问,如下。
操作步骤:
第1步:准备tomcat 的文件.
上图中设置了tomcat服务的名称为:tomcat-9-svc,端口为80.
注意:hb.cn/repo/tomcat:9,是我harbor私服上的镜像,大家也可以使用docker hub上的。
第2步:部署到k8s中。
第3步:准备一份envoy.yaml。
设置了监听10000端口,访问时跳转到集群的tomcat-9-svc服务的80端口。
admin: address: socket_address: { address: 127.0.0.1, port_value: 9901 } static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http codec_type: AUTO route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: some_service } http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: some_service connect_timeout: 0.25s type: LOGICAL_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: some_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: tomcat-9-svc port_value: 80 |
第4步:创建configmap.
查看一个ConfigMap:
可以看到,我们创建了一个ConfigMap,它的key为envoy.yml。下面的步骤中,会把这个文件放入到容器中,作为配置文件,所以,这个文件名称不能错。
第5步:准备一份k8s部署的yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: labels: run: envoy name: envoy apiVersion: apps/v1 kind: Deployment metadata: labels: run: envoy name: envoy spec: replicas: 1 selector: matchLabels: run: envoy template: metadata: labels: run: envoy spec: containers: - image: hb.cn/repo/envoy-dev:1.23.0-dev name: envoy volumeMounts: - name: envoy-config-101 mountPath: "/etc/envoy" readOnly: true volumes: - name: envoy-config-101 configMap: name: envoy-config-101 --- apiVersion: v1 kind: Service metadata: name: envoy-svc spec: selector: run: envoy type: NodePort ports: - port: 80 nodePort: 31234 targetPort: 10000 |
以上配置几点说明如下:
- hb.cn/repo/envoy-dev:1.23.0-dev,是我harbor私服上的envoy镜像,也可以使用docker hub上的。
- 使用envoy-config-101 configmap,并挂到容器里的/etc/envoy目录中,名称为:envoy.yaml。
- 把容器里的10000端口,以NodePort方式,暴露为31234端口
第6步:部署envoy pod.
第7步:访问k8s的其中一个woker节点,验证是否成功。
可以看到,上面使用是的envoy的31234 服务端口,但显示的是tomcat的输出,证明转发(反向代理)是成功的。tomcat上没有任何的war包,所以看到404。
扩展:
在第5步中,我是如何知道envoy.xml文件,应该放在/etc/envoy/目录下呢?
我们可以使用docker inpect命令来寻找答案。如下图。镜像的Cmd是容器的入口,有个-c参数,指定了envoy进程启动时,读取/etc/envoy/envoy.yaml文件。
参考:
envoy入门(1)(docker环境)_湾区的候鸟的博客-CSDN博客