【问题标题】:Kubernetes to find Pod IP from another PodKubernetes 从另一个 Pod 中查找 Pod IP
【发布时间】:2018-08-30 14:40:10
【问题描述】:

我有以下豆荚hello-abchello-def

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

podhello-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 kubernetes-ingress


    【解决方案1】:

    前言

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

    很遗憾,如果您的集群中没有配置 kube-dns(尽管不太可能),您将无法通过名称引用它。

    您可以阅读更多关于服务的 DNS 记录here

    此外,Kubernetes 还具有“服务发现”功能,它将服务的端口和 ips 公开到部署到同一命名空间中的任何容器中。

    解决方案

    这意味着,要达到 hello-def,您可以这样做

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

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

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

    外部访问

    此外,由于您使用的是 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


    服务发现

    当 Pod 在 Node 上运行时,kubelet 会添加一组环境 每个活动服务的变量。它支持两个 Docker 链接 兼容变量(参见 makeLinkVariables)和更简单 {SVCNAME}_SERVICE_HOST 和 {SVCNAME}_SERVICE_PORT 变量,其中 服务名称大写,破折号转换为下划线。

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

    【讨论】:

      【解决方案2】:

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

      但是,必须先在您的 k8s 集群中配置/安装 kube-dnsCoreDNS,然后才能在您的集群中使用 DNS 记录。

      具体来说,您应该通过 DNS 记录 http://hello-def-service 访问与 hello-abc-service 相同命名空间中运行的服务的 hello-def-service

      您应该能够通过 DNS 记录 hello-def-service.other_namespace.svc.cluster.local 访问在另一个命名空间 ohter_namespace 中运行的 hello-def-service

      如果由于某种原因,您的集群中没有安装 DNS 插件,您仍然可以通过 hello-abc pod 中的环境变量找到 hello-def-service 的虚拟 IP。正如here所记录的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        • 1970-01-01
        • 2019-09-10
        • 2020-08-12
        • 2020-09-13
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多