从 docker 容器访问默认命名空间中具有群集 IP 的 k8s 服务



我有一个使用 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 个问题。

  1. docker 镜像如何获取 URL 或访问 URL?

  2. 如何在我的终端中访问相同的 URL,以便通过它发出一些 curl 命令?

我希望我对解释清楚。

如果你的 docker 容器在 kubernetes 集群之外,那么你就无法访问你的ClusterIP服务。

正如您从其名称中猜到的那样,ClusterIP类型的服务只能从群集内部访问。
集群内,我指的是由 Kubernetes 管理的任何资源。
在属于 K8S 集群的 VM 中运行的独立 docker 容器不是由 K8S 管理的资源。

因此,为了实现您想要的,您将拥有这些可能性:

  1. 在容器内设置hostPort。这不会被推荐,并且在文档中被列为不良做法。对于非常具体的情况,请保留此用法。
  2. 将服务切换到NodePort而不是ClusterIP。这样,您将能够使用节点 IP + 节点端口访问它。
  3. 使用LoadBalancer类型的服务,但此解决方案需要一些配置,并且并不简单。
  4. 使用IngressIngressController,但就像负载均衡器一样,此解决方案需要一些配置,而且不是那么简单。

根据您的工作以及这是否至关重要,您必须选择这些解决方案之一。

  • 1 和 2 用于调试/开发
  • 3 和 4 用于生产,但您必须与 k8s 管理员合作
您可以使用
  • 来自同一命名空间中任何其他 pod 的服务oxd-server的名称来访问它,即,如果该服务由提供 HTTPS 的 pod 支持,则可以在https://oxd-server:8443/访问该服务。

    如果要访问此服务的客户端 Pod 位于不同的命名空间中,则可以使用oxd-server.<namespace>名称。在您的情况下,这将oxd-server.default,因为您的服务位于默认命名空间中。

  • 若要从群集外部(从终端(访问此服务以进行本地调试,可以使用端口转发。

    然后,您可以使用 URLlocalhost:8443发出任何请求,并且请求将被端口转发到服务。

kubectl port-forward svc/oxd-server 8443:8443
  • 如果要从群集外部访问此服务以供生产使用,可以将该服务设置为type: NodePorttype: LoadBalancer。在此处查看服务类型。

最新更新