前提条件: consul 部署在k8s 的节点上
1、通过DNS获取POD的IP
1.1、服务启动脚本
#!/bin/bash
# 启动服务,获得pod中的IP,POD中的hosts配置最后一行就是它自己的IP
export HOST_IP=$(tail -n 1 /etc/hosts|awk 'END {print}'| awk '{for(i =1; i <=NF; i++){ if($i~/[0-9]\.[0-9]/) print $i}}')
echo ${HOST_IP}
#通过环境变量传递给微服务
java -jar -DHOST_IP=${HOST_IP} /opt/service/sample/sample-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
1.2、微服务修改配置
spring:
application:
name: sample
cloud:
consul:
host: ${consul_host:10.0.10.110}
port: ${consul_port:8500}
discovery:
register: true
service-name: ${spring.application.name}
health-check-path: /actuator/health
healthCheckInterval: 10s
tags: urlprefix-/${spring.application.name}
instance-id: {spring.application.instance_id:${random.value}}}
health-check-critical-timeout: 30s
hostname: ${HOST_IP}
2、在K8S的样本文件通过env获取 POD信息
参考:https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/
2.1、样本文件修改
…………
env:
- name: CONSUL_HOST
value: 10.0.10.110
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
………….
2.2、检查环境变量是否生效:
[root@kvm13-pre ~]# kubectl exec -it sample-6f7fcd5567-9sxl9 -n lenovo /bin/bash
root@sample-6f7fcd5567-9sxl9:/opt/service/sample# echo $POD_IP
10.244.3.94
root@sample-6f7fcd5567-9sxl9:/opt/service/sample#
2.3、服务启动脚本:
#!/bin/bash
# 启动服务
java -jar -DHOST_IP=${POD_IP} /opt/service/lenovo_sample/sample-service-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
2.4、微服务修改配置
spring:
application:
name: sample
cloud:
consul:
host: ${consul_host:10.0.10.110}
port: ${consul_port:8500}
discovery:
register: true
service-name: ${spring.application.name}
health-check-path: /actuator/health
healthCheckInterval: 10s
tags: urlprefix-/${spring.application.name}
instance-id: {spring.application.instance_id:${random.value}}}
health-check-critical-timeout: 30s
hostname: ${HOST_IP}
3、效果
能够看到所有服务 都是使用POD 的IP来注册到consul上