k8s+dubbo架构集群内外网络通讯解决方案

1.问题

k8s有自己的一套网络管理机制,集群内的容器和容器之间是可以相互通信的。

但是在容器化升级改造的过程中,不可能一步到位的将所有的服务全部迁移到k8s的容器当中来,毕竟新的技术在没有经过实践趟坑时,肯定不能轻易的全面铺开升级。

那么就涉及到集群外的服务访问集群内的服务,集群内容器中的ip都是k8s管理的IP,dubbo服务注册的也是获取的容器内分配的IP。

比如宿主机ip是10.201.7.xx,容器内的ip就是172.66.4.x。群外的和宿主主机同网段的服务通过拿到dubbo的注册的172.66.4.x也根本没法访问容器内的dubbo服务。

2.分析

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版本之间未验证)

3.实现过程

Helm Chart文件templates/deployment.yaml
deployment截图

配置说明

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
Helm Chart文件valuesyaml截图

配置说明

1.指定Service的类型为NodePort;

2.指定dubbo服务默认启动端口为8080;

发版过程Pipeline文件
发版过程Pipeline截图

步骤1:连接k8s集群,更新helm仓库;

步骤2:查询服务是否部署,如果未部署则部署(保证能获取到Service的NodePort);

步骤3:查询对应服务的NodePort,并赋值给变量;

步骤4:更新服务,将获取到的NodePort注入POD系统变量。

# 推荐文章
  1.深刻理解Docker镜像大小
  2.k8s专题[1.k8s基础概念]
  3.k8s专题[10.使用Spinnaker持续发布应用]
  4.k8s专题[2.k8s设计原则]
  5.k8s专题[3.k8s基础组件]

评论


:D 一言句子获取中...