Kubernetes 从另一个 Pod 中查找 Pod IP

Kubernetes to find Pod IP from another Pod

我有以下 pods hello-abchello-def.

我想将数据从 hello-abc 发送到 hello-def

pod hello-abc 怎么知道 hello-def 的 IP 地址?

我想以编程方式执行此操作。

hello-abc 找到 hello-def 位置的最简单方法是什么?

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
name: hello-abc-deployment

spec:
replicas: 1

template:
    metadata:
    labels:
        app: hello-abc
    spec:
    containers:
    - name: hello-abc
        image: hello-abc:v0.0.1
        imagePullPolicy: Always
        args: ["/hello-abc"]
        ports:
        - containerPort: 5000

---
apiVersion: extensions/v1beta1
kind: Deployment

metadata:
name: hello-def-deployment

spec:
replicas: 1

template:
    metadata:
    labels:
        app: hello-def
    spec:
    containers:
    - name: hello-def
        image: hello-def:v0.0.1
        imagePullPolicy: Always
        args: ["/hello-def"]
        ports:
        - containerPort: 5001

---
apiVersion: v1
kind: Service

metadata:
name: hello-abc-service

spec:
ports:
- port: 80
    targetPort: 5000
    protocol: TCP

selector:
    app: hello-abc
type: NodePort

---
apiVersion: v1
kind: Service

metadata:
name: hello-def-service

spec:
ports:
- port: 80
    targetPort: 5001
    protocol: TCP

selector:
    app: hello-def
type: NodePort

前言

由于您已经定义了一个路由到每个部署的服务,如果您将服务和部署都部署到同一个命名空间中,您可以在许多现代 kubernetes 集群中利用 kube-dns 并通过以下方式简单地引用该服务姓名。

不幸的是,如果 kube-dns 未在您的集群中配置(尽管这不太可能),您将无法通过名称引用它。

您可以阅读有关服务 DNS 记录的更多信息 here

此外 Kubernetes 功能 "Service Discovery" 它将服务的端口和 ip 公开到部署到同一名称空间的任何容器中。

解决方案

这意味着,要访问 hello-def,您可以这样做

curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}

基于服务发现https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

警告:如果服务端口发生变化,很可能只有在同一命名空间中更改后创建的 pods 才能接收新的环境变量。

外部访问

此外,由于您使用的是 NodePort 功能,因此您也可以从外部访问您的服务,只要您的 NodePort 范围可以从外部访问。

这需要您通过 node-ip:nodePort

访问您的服务

您可以通过 kubectl describe svc/hello-def-service

找到随机分配给您的服务的 NodePort

入口

要从外部访问您的服务,您应该实施入口服务,例如 nginx-ingress

https://github.com/helm/charts/tree/master/stable/nginx-ingress https://github.com/kubernetes/ingress-nginx

边车

如果您的 2 个服务紧密耦合,您可以使用 Kubernetes Sidecar 功能将两者包含在同一个 pod 中。在这种情况下,pod 中的两个容器将共享相同的虚拟网络适配器并可通过 localhost:$port

访问

https://kubernetes.io/docs/concepts/workloads/pods/pod/#uses-of-pods


服务发现

When a Pod is run on a Node, the kubelet adds a set of environment variables for each active Service. It supports both Docker links compatible variables (see makeLinkVariables) and simpler {SVCNAME}_SERVICE_HOST and {SVCNAME}_SERVICE_PORT variables, where the Service name is upper-cased and dashes are converted to underscores.

在此处阅读有关服务发现的更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

您应该能够通过此处指定的 DNS 从 hello-abc 中的 pods 访问 hello-def-servicehttps://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

但是,kube-dnsCoreDNS 必须在您的 k8s 集群中 configured/installed 才能在您的集群中使用 DNS 记录。

具体来说,您应该可以通过与 hello-abc-service

相同命名空间中的服务 运行 的 DNS 记录 http://hello-def-service 访问 hello-def-service

并且您应该能够通过 DNS 记录 hello-def-service.other_namespace.svc.cluster.local.

访问另一个命名空间 ohter_namespace 中的 hello-def-service 运行

如果由于某种原因,您的集群中没有安装 DNS 附加组件,您仍然可以通过 hello-abc [=35] 中的环境变量找到 hello-def-service 的虚拟 IP =].正如记录 here.