k8s 中 nacos 的公网地址注册问题

    105

背景:在做服务上云的过程中,免不了会有混合云与传统微服务的情况,如果我们使用 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 作为注册的目标,辟如集群中机器 ip1.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 调用了。

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息