我有一个使用 k8s 编排的服务器,它的服务如下所示
➜ installations ✗ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
oxd-server ClusterIP 10.96.124.25 <none> 8444/TCP,8443/TCP 3h32m
它是豆荚。
➜ helm git:(helm-rc1) ✗ kubectl get po
NAME READY STATUS RESTARTS AGE
sam-test-oxd-server-6b8f456cb6-5gwwd 1/1 Running 0 3h2m
现在,我有一个带有env
变量的 docker 映像,该变量需要此服务器的 URL。
我这里有 2 个问题。
docker 镜像如何获取 URL 或访问 URL?
如何在我的终端中访问相同的 URL,以便通过它发出一些 curl 命令?
我希望我对解释清楚。
如果你的 docker 容器在 kubernetes 集群之外,那么你就无法访问你的ClusterIP
服务。
正如您从其名称中猜到的那样,ClusterIP
类型的服务只能从群集内部访问。
在集群内,我指的是由 Kubernetes 管理的任何资源。
在属于 K8S 集群的 VM 中运行的独立 docker 容器不是由 K8S 管理的资源。
因此,为了实现您想要的,您将拥有这些可能性:
- 在容器内设置
hostPort
。这不会被推荐,并且在文档中被列为不良做法。对于非常具体的情况,请保留此用法。 - 将服务切换到
NodePort
而不是ClusterIP
。这样,您将能够使用节点 IP + 节点端口访问它。 - 使用
LoadBalancer
类型的服务,但此解决方案需要一些配置,并且并不简单。 - 使用
Ingress
和IngressController
,但就像负载均衡器一样,此解决方案需要一些配置,而且不是那么简单。
根据您的工作以及这是否至关重要,您必须选择这些解决方案之一。
- 1 和 2 用于调试/开发
- 3 和 4 用于生产,但您必须与 k8s 管理员合作
来自同一命名空间中任何其他 pod 的服务
oxd-server
的名称来访问它,即,如果该服务由提供 HTTPS 的 pod 支持,则可以在https://oxd-server:8443/
访问该服务。如果要访问此服务的客户端 Pod 位于不同的命名空间中,则可以使用
oxd-server.<namespace>
名称。在您的情况下,这将oxd-server.default
,因为您的服务位于默认命名空间中。若要从群集外部(从终端(访问此服务以进行本地调试,可以使用端口转发。
然后,您可以使用 URL
localhost:8443
发出任何请求,并且请求将被端口转发到服务。
kubectl port-forward svc/oxd-server 8443:8443
- 如果要从群集外部访问此服务以供生产使用,可以将该服务设置为
type: NodePort
或type: LoadBalancer
。在此处查看服务类型。