繁体   English   中英

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

[英]Expose existing and deployed Kubernetes service via LoadBalancer

我已将服务部署到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

YAML配置的规范部分如下所示:

"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": {}
    }
}

现在,我希望使用LoadBalancer将此服务公开为可从外部访问。 使用kubectl公开服务会产生如下错误:

$ kubectl expose service my-service --type="LoadBalancer"
Error from server: services "my-service" already exists

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

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

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

除了Anirudh的答案(正确的答案)......考虑到以下几点。

ServiceType字段的有效值为:

  • ClusterIP :仅使用集群内部IP - 这是默认设置,如上所述。 选择此值意味着您希望只能从群集内部访问此服务

  • NodePort:在拥有集群内部IP的基础上,在集群的每个节点(每个节点上的相同端口)上的端口上公开服务。 您可以在任何:NodePort地址上联系该服务。 这意味着您将节点端口转发到公开的容器端口。问题是,这些端口应该可以在群集中的每个节点上从外部访问。

  • LoadBalancer:除了拥有集群内部IP并在NodePort上公开服务之外,还要求云提供商提供负载均衡器,该负载均衡器转发到服务公开,作为:NodePort为每个节点LoadBalancer类型在云上创建外部负载均衡器供应商。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM