一、问题
k8s有自己的一套网络管理机制,集群内的容器和容器之间是可以相互通信的。
但是在容器化升级改造的过程中,不可能一步到位的将所有的服务全部迁移到k8s的容器当中来,毕竟新的技术在没有经过实践趟坑时,肯定不能轻易的全面铺开升级。
那么就涉及到集群外的服务访问集群内的服务,集群内容器中的ip都是k8s管理的IP,dubbo服务注册的也是获取的容器内分配的IP。
比如宿主机ip是10.20.10.xx,容器内的ip就是172.10.10.x。群外的和宿主主机同网段的服务通过拿到dubbo的注册的172.66.4.x也根本没法访问容器内的dubbo服务。

二、分析
k8s是通过Service来暴露集群内的服务,假如dubbo服务注册的是Service暴露的端口和宿主的IP那么集群外的服务就可以直接访问集群内容器中的服务了。
该方案主要有两个难点:
1.如何获取Service暴露的端口和宿主机的IP注入到POD环境变量;
2.Dubbo服务如何从环境变量获取IP和端口注册到ZK;

关于难点1:
通过downward-api的方式向Pod内注入NodeIP的env;
通过给Pod注入env的方式将NodePort注入到Pod内;(要求先创建Service)

关于难点2:
Dubbo在启动阶段提供两对系统属性,用于设置外部通信的IP和端口地址。
DUBBO_IP_TO_REGISTRY — 注册到注册中心的IP地址
DUBBO_PORT_TO_REGISTRY — 注册到注册中心的端口
DUBBO_IP_TO_BIND — 监听IP地址
DUBBO_PORT_TO_BIND — 监听端口

详见链接:https://www.jianshu.com/p/b045dbdb8e12
因此,将NodeIP和NodePort的变量名分别设置为DUBBO_IP_TO_REGISTRY和DUBBO_PORT_TO_REGISTRY
Dubbo服务启动自动获取这两个变量,并注册到ZK,不需要修改任何代码;
(备注:验证过程发现dubbo2.5.3版本不生效,dubbo2.6.0版本验证成功;2.5.3到2.6.0版本之间未验证)

三、实现过程
Helm Chart文件templates/deployment.yaml
在这里插入图片描述
文件说明
DUBBO_PORT_TO_BIND:Dubbo服务默认启动端口为20880,该变量指定Dubbo服务监听端口;端口要与Service中NodePort相同,否则dubbo服务调用报错;
DUBBO_PORT_TO_REGISTRY :注册到ZK的端口
DUBBO_IP_TO_REGISTRY:注册到ZK的IP地址

Helm Chart文件values.yaml
在这里插入图片描述
文件说明
1.指定Service的类型为NodePort;
2.指定dubbo服务默认启动端口为8080;

发版过程Pipeline文件
在这里插入图片描述
步骤1:连接k8s集群,更新helm仓库;
步骤2:查询服务是否部署,如果未部署则部署(保证能获取到Service的NodePort);
步骤3:查询对应服务的NodePort,并赋值给变量;
步骤4:更新服务,将获取到的NodePort注入POD系统变量;

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐