在 Kubernetes/Openshift 中将部署公开为 ClusterIP 和 ExternalIP

Exposing deployment as ClusterIP and ExternalIP in Kubernetes/Openshift

我们的 Openshift 集群在 network/cluster 中使用以下定义创建:

spec:
  clusterNetwork:
  - cidr: 10.0.0.0/23
    hostPrefix: 26
  externalIP:
    autoAssignCIDRs:
    - 10.10.0.0/24
  networkType: Calico
  serviceNetwork:
  - 10.20.0.0/24

我想知道是否可以创建服务类型 ClusterIP(不是 LoadBalancer)并自动为其分配 ExternalIP?

如果服务定义为 LoadBalancer (oc create svc loadblanacer my-service --tcp=80) 自动分配工作正常,但它暴露了我们试图避免的 NodePort。

我可以像 oc expose deploy my-deployment --external-ip="10.10.0.100 --port=80" 那样手动指定 ExternalIP,但正在尝试弄清楚它是否可以自动完成。

很遗憾,ExternalIPs 字段无法在 ClusterIP 服务类型下自动填写。 ClusterIP 仅供内部访问。您的解决方法不是预期行为,因此服务控制器无法自动处理。

幸运的是,您要在 LoadBalancer 类型下修复的问题是社区中讨论得很好的问题。新补丁已合并到最新的 Kubernetes 代码库中。

1.20下CHANGELOG,可以看到这里有变化

Automatic allocation of NodePorts for services with type LoadBalancer can now be disabled by setting the (new) parameter Service.spec.allocateLoadBalancerNodePorts=false. The default is to allocate NodePorts for services with type LoadBalancer which is the existing behavior. (#92744, @uablrek) [SIG Apps and Network]

因此,当您将集群升级到 Kubernetes v1.20 并应用类似的东西时。

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  allocateLoadBalancerNodePorts: false
  type: LoadBalancer

节点端口分配将被禁用,您无需任何 hacky 方法即可解决您的问题。