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

时间:2021-01-08 17:00:51

标签: 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 loadblancer my-service --tcp=80 ) 自动分配工作正常,但它会暴露 NodePort ,这是我们试图避免的。

我可以像 oc expose deploy my-deployment --external-ip="10.10.0.100 --port=80" 一样手动指定 ExternalIP,但我想知道它是否可以自动完成。

1 个答案:

答案 0 :(得分:2)

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

幸运的是,您想在 LoadBalancer 类型下修复的问题是社区中讨论广泛的问题。一个新补丁已合并到最新的 Kubernetes 代码库中。

在 1.20 CHANGELOG 下,您可以在此处看到更改。

<块引用>

现在可以通过设置(新)参数 Service.spec.allocateLoadBalancerNodePorts=false 来禁用为 LoadBalancer 类型的服务自动分配 NodePort。默认是为 LoadBalancer 类型的服务分配 NodePort,这是现有行为。 (#92744, @uablrek) [SIG 应用程序和网络]

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

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

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