Kubernetes, чтобы найти Pod IP от другого Pod - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующие стручки hello-abc и hello-def.

И я хочу отправить данные от hello-abc до hello-def.

Как pod hello-abc узнает IP-адрес hello-def?

И я хочу сделать это программно.

Какой самый простой способ для 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

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы должны быть в состоянии достичь hello-def-service из модулей в hello-abc через DNS, как указано здесь: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

Однако, kube-dns или CoreDNS должны быть настроены / установлены в вашем кластере k8s, прежде чем DNS-записи могут быть использованы в вашем кластере.

В частности, вы должны достичь hello-def-service через запись DNS http://hello-def-service для службы, работающей в том же пространстве имен, что и hello-abc-service

И вы должны быть в состоянии достичь hello-def-service, работающего в другом пространстве имен ohter_namespace через запись DNS hello-def-service.other_namespace.svc.cluster.local.

Если по какой-то причине в вашем кластере не установлены надстройки DNS, вы все равно можете найти виртуальный IP-адрес hello-def-service через переменные среды в модулях hello-abc. Как задокументировано здесь .

0 голосов
/ 30 августа 2018

Введение

Поскольку вы определили службу, которая маршрутизирует каждое развертывание, если вы развернули и службы, и развертывания в одном и том же пространстве имен, вы можете во многих современных кластерах kubernetes использовать kube-dns и просто ссылаться на службу по имени.

К сожалению, если kube-dns не настроен в вашем кластере (хотя это маловероятно), вы не можете ссылаться на него по имени.

Подробнее о записях DNS для сервисов можно прочитать здесь

Кроме того, Kubernetes имеет функцию «Обнаружение служб», которая предоставляет порты и ips ваших служб в любой контейнер, развернутый в том же пространстве имен.

Решение

Это означает, что для достижения hello-def вы можете сделать это следующим образом

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

на основе обнаружения службы https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

Предостережение : вполне возможно, что в случае изменения порта службы новые переменные среды получат только модули, созданные после изменения в том же пространстве имен.

Внешний доступ

Кроме того, вы также можете подключиться к этой услуге извне, поскольку вы используете функцию NodePort, если ваш диапазон NodePort доступен извне.

Для этого вам потребуется доступ к сервису по node-ip: nodePort

Вы можете узнать NodePort, который был случайно назначен вашему сервису с помощью kubectl describe svc/hello-def-service

Ingress

Чтобы получить доступ к вашему сервису извне, вы должны внедрить входной сервис, такой как nginx-ingress

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

коляска

Если ваши 2 службы тесно связаны между собой, вы можете включить оба в один и тот же модуль, используя функцию Kubernetes Sidecar. В этом случае оба контейнера в модуле будут использовать один и тот же виртуальный сетевой адаптер и доступны через 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

...