Rancher 2.6+:如何指定NodePort服务的目标FQDN?
关于Rancher 2.6及以上版本配置NodePort服务目标FQDN的问题
Kubernetes原生的NodePort服务本身不支持直接指定目标FQDN,它的核心作用是把集群内Service的端口映射到节点端口,流量默认转发到集群内的Pod或后端Service的IP,而非外部FQDN。但针对你需要对接外部LB的场景,可以通过以下两种方式实现需求:
方式一:ExternalName Service + NodePort组合使用
先创建一个ExternalName类型的Service,指向你的目标外部FQDN:
apiVersion: v1 kind: Service metadata: name: external-target-service spec: type: ExternalName externalName: your-target-fqdn.example.com
再创建NodePort类型的Service,将流量转发到这个ExternalName Service:
apiVersion: v1 kind: Service metadata: name: nodeport-proxy-service spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 # 可自定义固定NodePort,不指定则由集群自动分配 externalTrafficPolicy: Cluster
这种方式下,NodePort的流量会先经过集群内的kube-proxy,再转发到指定的外部FQDN。
方式二:通过Ingress对接外部LB
如果你的外部LB是通过Ingress暴露服务,直接在Ingress规则中配置后端为外部FQDN即可,无需依赖NodePort:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: external-lb-ingress annotations: nginx.ingress.kubernetes.io/upstream-vhost: "your-target-fqdn.example.com" nginx.ingress.kubernetes.io/server-snippet: | resolver 8.8.8.8; # 指定DNS解析器,确保能解析外部FQDN spec: rules: - host: your-ingress-host.example.com http: paths: - path: / pathType: Prefix backend: service: name: external-target-service port: number: 80
这里的external-target-service就是前面创建的ExternalName Service,Ingress控制器会负责将流量转发到指定的外部FQDN。
需要注意的是,Rancher本身没有额外的专属注解来让NodePort服务直接指向FQDN,这是由Kubernetes的Service模型设计决定的,NodePort的定位就是面向集群内后端服务的转发。

内容的提问来源于stack exchange,提问作者Guillaume Barré
相关产品推荐
相关产品推荐

