k8s 中 nacos 的公网地址注册问题
背景:在做服务上云的过程中,免不了会有混合云与传统微服务的情况,如果我们使用 nacos 作为注册中心,那么在 k8s 容器内注册的信息,在外部部署的服务是无法直接访问的。那么是否有办法支持集群内网都注册到 nacos 中并且可方便访问呢。
将需要对外暴露的服务 server
改为 NodePort
---
apiVersion: v1
kind: Service
metadata:
name: example-name
labels:
appName: example-name
spec:
type: NodePort
ports:
- name: example-name
# 服务运行的端口
port: 8080
targetPort: 8080
# 对外的 NodePort 的端口,范围为 30000-32767
nodePort: 30001
selector:
appName: example-name
---
这样的话我们就可以用集群中任意机器的 ip:30001
访问到这个服务。
修改服务的注册逻辑
这里我们采取手动注册的方式,通过环境变量的方式注入两个参数
MY_NODE_IP``MY_NODE_PORT
作为注册的目标,辟如集群中机器 ip
为 1.2.3.4
端口为 30001
k8s 部署的 yaml 修改即可
env:
- name: MY_NODE_PORT
value: "31001"
- name: MY_NODE_IP
value: "1.2.3.4"
@Slf4j
@Configuration
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class})
public class NacosDiscoveryClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = {"spring.cloud.nacos.discovery.register-enabled", "k8s.config.nodePortEnabled"})
public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties) {
log.info("手动注册准备开始");
// 更改服务详情中的元数据,增加服务注册时间
String myNodePort = System.getenv("MY_NODE_PORT");
log.info("当前环境的 MY_NODE_PORT = {}", myNodePort);
String myNodeIp = System.getenv("MY_NODE_IP");
log.info("当前环境的 MY_NODE_IP = {}", myNodeIp);
if (StringUtils.isNotBlank(myNodePort) && StringUtils.isNotBlank(myNodeIp)) {
nacosDiscoveryProperties.setIp(myNodeIp);
nacosDiscoveryProperties.setPort(Integer.parseInt(myNodePort));
}
NacosWatch nacosWatch = new NacosWatch(nacosDiscoveryProperties);
log.info("当前环境注册成功 \n{}", JSONObject.toJSONString(nacosWatch));
return nacosWatch;
}
}
那么这样注册到我们的 nacos
就是我们的机器外网 ip 和端口了,其他服务就可以走 nacos
进行 rpc
调用了。