Dubbo应用迁移到Kubernetes(2)

然后我们看这个getValueFromConfig(),它调用了下面的函数,可以看到,它是先找环境变量,再找properties。

public static String getSystemProperty(String key) { String value = System.getenv(key); if (StringUtils.isEmpty(value)) { value = System.getProperty(key); } return value; }

所以我们通过环境变量,就能修改Dubbo发布到zookeeper上的地址和端口。假如我们通过docker镜像启动了一个dubbo provider,并且它的服务端口是8888,假设主机地址为192.168.1.10,那么我们通过下面的命令,

docker run -e DUBBO_IP_TO_REGISTRY=192.168.1.10 -e DUBBO_PORT_TO_REGISTRY=8888 -p 8888:8888 dubbo_image

就能让内部的服务以192.168.1.10:8888的地址发布。

我们通过官方的实例来演示一下,因为官方提供的案例都很久了,所以我自己重新搞了一个示例,代码在https://github.com/XinliNiu/dubbo-docker-sample.git 。

先启动一个zookeeper,暴露2181端口。

docker run --name zkserver --rm -p 2181:2181 -d zookeeper:3.4.9

看一下zk起来了

niuxinli@niuxinli-B450M-DS3H:~/dubbo-samples-docker$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5efc1f17fba0 zookeeper:3.4.9 "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp zkserver

把代码导入IDE,修改dubbo-docker-provide.xml,把地址改成刚发布到zk的地址和端口,我的地址是192.168.1.8。

运行DubboApplication,这时候可以看到在zk上注册了服务。

Dubbo应用迁移到Kubernetes

修改dubbo-docker-consumer.xml里的zk地址,执行单元测试,能正常访问。

把DubboApplication导出成可以执行的jar包,名字叫app.jar,创建如下Dockerfile

FROM openjdk:8-jdk-alpine ADD app.jar app.jar ENV JAVA_OPTS="" ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar

创建dubbo-demo镜像,在同样的目录里执行docker build。

docker build --no-cache -t dubbo-demo .

正常启动镜像

docker run -p 20880:20880 -it --rm dubbo-demo

发现是172.16.0.3的地址,这个是访问不了的。

Dubbo应用迁移到Kubernetes

传入环境变量重新启动,

docker run -e DUBBO_IP_TO_REGISTRY=192.168.1.8 -e DUBBO_PORT_TO_REGISTRY=20880 -p 20880:20880 -it --rm dubbo-demo

这时候就变成主机地址了。

Dubbo应用迁移到Kubernetes

在Kubernetes中使用Dubbo

当在Kubernetes中启动多个副本的时候,指定具体的IP和具体的端口,都是不可行的,因为每个机器的IP都不一样,不能写很多个yaml文件,而且一旦指定了具体端口,那这台主机的这个端口就被占用了。

我们可以通过创建Service,使用NodePort的方式,把端口固定住,这样端口的问题就解决了。因为是对外服务,所以使用ClusterIP肯定是不行了,IP有两种解决办法:

(1)使用Kubernetes的downward api动态的传入主机的ip。

(2)传固定的loadbalancer的地址,例如在所有的node之外有一个F5。

不管哪种方法,都是一种妥协的办法,很不“云原生”,我演示一下使用downward api动态传入主机地址,并使用nodeport固定端口的方式。

我的kubernetes集群如下:

角色地址
master   192.168.174.50  
node1   192.168.174.51  
node2   192.168.174.52  
node3   192.168.174.53  

zk的地址是192.168.1.8,它与集群的主机互通。

我没有建private镜像仓库,把我之前打好的dubbo-demo直接push到docker-hub上了,名字是nxlhero/dubbo-demo。

创建Service,使用的NodePort为30001,创建4个副本,这样3台机器上正好有一台起两个pod。

apiVersion: v1 kind: Service metadata: name: dubbo-docker labels: run: dubbo spec: type: NodePort ports: - port: 20880 targetPort: 20880 nodePort: 30001 selector: run: dubbo-docker --- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-docker spec: selector: matchLabels: run: dubbo replicas: 4 template: metadata: labels: run: dubbo spec: containers: - name: dubbo-docker image: nxlhero/dubbo-demo env: - name: DUBBO_IP_TO_REGISTRY valueFrom: fieldRef: fieldPath: status.hostIP - name: DUBBO_PORT_TO_REGISTRY value: "30001" tty: true ports: - containerPort: 20880

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6c3a9f62a1fcf8b41c92b421fd577450.html