通过LoadBalancer公开现有和已部署的Kubernetes服务

che*_*tan 5 service kubernetes

我已经将服务部署到kubernetes集群中,如下所示:

$ kubectl get svc my-service
NAME               CLUSTER_IP       EXTERNAL_IP   PORT(S)    SELECTOR                AGE
my-service         192.168.202.23   <none>        8080/TCP   name=my-service         38d
Run Code Online (Sandbox Code Playgroud)

YAML配置的spec部分如下所示:

"spec": {
        "ports": [
            {
                "name": "http-port",
                "protocol": "TCP",
                "port": 8080,
                "targetPort": 8080
            }
        ],
        "selector": {
            "name": "my-service"
        },
        "clusterIP": "192.168.202.23",
        "type": "ClusterIP",
        "sessionAffinity": "None"
    },
    "status": {
        "loadBalancer": {}
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想公开使用LoadBalancer可以从外部访问此服务。使用kubectl暴露服务会产生如下错误:

$ kubectl expose service my-service --type="LoadBalancer"
Error from server: services "my-service" already exists
Run Code Online (Sandbox Code Playgroud)

是否无法“编辑”现有已部署的服务并使之可从外部访问?

Ani*_*han 6

您创建的服务类型ClusterIP是在群集外部不可见的。如果您编辑服务并将type字段更改为NodePortLoadBalancer,它将公开它。

有关这些服务类型及其含义的文档位于:http : //kubernetes.io/docs/user-guide/services/#publishing-services---service-types


小智 5

除了 Anirudh 答案(正确答案)之外......请考虑以下因素。

\n\n

ServiceType 字段的有效值为:

\n\n
    \n
  • ClusterIP:仅使用集群内部 IP - 这是默认值,并在上面进行了讨论。选择此值意味着您希望只能从集群内部访问此服务

  • \n
  • NodePort:除了拥有集群内部 IP 之外,还在集群每个节点上的端口上公开服务(每个节点上的相同端口)。您\xe2\x80\x99将能够联系任何 :NodePort 地址上的服务。\n这意味着您将把节点端口转发到暴露的容器端口。问题是,这些端口应该在每个节点上都可以从外部访问集群。

  • \n
  • 负载均衡器:除了拥有集群内部 IP 并在 NodePort 上公开服务之外,还向云提供商请求一个负载均衡器,该负载均衡器转发到作为每个 Node 的 :NodePort 公开的服务\nLoadBalancer 类型在 NodePort 上创建一个外部负载均衡器云提供商。

    \n\n

    对外部负载均衡器的支持因提供商而异,实施方式也不同。支持 GCE 和 AWS(不确定现在是否有其他云提供商支持),但如果您想将其安装在自己的基础设施中,则需要安装 HAPROXY 或 ngnix 容器(或类似容器)来平衡流量,此功能不适合你。

  • \n
\n