DNS в Kubernetes не работает должным образом - PullRequest
0 голосов
/ 09 мая 2019

Я хорошо разбираюсь в Docker, но, должно быть, здесь что-то не так с K8.Я запускаю skaffold с minikube и пытаюсь заставить DNS работать между контейнерами.Вот мое развертывание:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: my-api
  labels:
    app: my-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      name: my-api
      labels:
        app: my-api
    spec:
      containers:
      - name: my-api-postgres
        image: postgres:11.2-alpine
        env:
        - name: POSTGRES_USER
          value: "my-api"
        - name: POSTGRES_DB
          value: "my-api"
        - name: POSTGRES_PASSWORD
          value: "my-pass"
        ports:
        - containerPort: 5432
      - name: my-api-redis
        image: redis:5.0.4-alpine
        command: ["redis-server"]
        args: ["--appendonly", "yes"]
        ports:
        - containerPort: 6379
      - name: my-api-node
        image: my-api-node
        command: ["npm"]
        args: ["run", "start-docker-dev"]
        ports:
        - containerPort: 3000

Однако в этом сценарии my-api-node не может связаться с my-api-postgres через DNS-имя хоста my-api-postgres.Есть идеи, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы определили все 3 контейнера как часть одного и того же модуля.Модули имеют общее сетевое пространство имен, поэтому в текущей настройке (что не правильно, подробнее об этом через секунду) вы можете общаться с другими контейнерами, используя localhost:<port>.

«Правильный» способ сделать это - создать развертывание для каждого приложения и поставить перед этими развертываниями services .

Ваш пример будет примерно (не проверен):

kind: Deployment
apiVersion: apps/v1
metadata:
  name: my-api-node
  namespace: my-api
  labels:
    app: my-api-node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api-node
  template:
    metadata:
      name: my-api-node
      labels:
        app: my-api-node
    spec:
      containers:
      - name: my-api-node
        image: my-api-node
        command: ["npm"]
        args: ["run", "start-docker-dev"]
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  namespace: my-api
  name: my-api-node
spec:
  selector:
    app: my-api-node
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: my-api-redis
  namespace: my-api
  labels:
    app: my-api-redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api-redis
  template:
    metadata:
      name: my-api-redis
      labels:
        app: my-api-redis
    spec:
      containers:
      - name: my-api-redis
        image: redis:5.0.4-alpine
        command: ["redis-server"]
        args: ["--appendonly", "yes"]
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  namespace: my-api
  name: my-api-redis
spec:
  selector:
    app: my-api-redis
  ports:
  - protocol: TCP
    port: 6379
    targetPort: 6379
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: my-api-postgres
  namespace: my-api
  labels:
    app: my-api-postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api-postgres
  template:
    metadata:
      name: my-api-postgres
      labels:
        app: my-api-postgres
    spec:
      containers:
      - name: my-api-postgres
        image: postgres:11.2-alpine
        env:
        - name: POSTGRES_USER
          value: "my-api"
        - name: POSTGRES_DB
          value: "my-api"
        - name: POSTGRES_PASSWORD
          value: "my-pass"
        ports:
        - containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  namespace: my-api
  name: my-api-postgres
spec:
  selector:
    app: my-api-postgres
  ports:
  - protocol: TCP
    port: 5432
    targetPort: 5432

DNS-записи регистрируются для сервисов , так что вы подключаетесь к ним и пересылаетесь в модули за ним(упрощенный).Если вам нужно получить доступ к приложению-узлу из внешнего мира, это целая дополнительная сделка, и вам следует взглянуть на услуги типа LoadBalancer или Ingress .

0 голосов
/ 10 мая 2019

В качестве дополнения к johnharris85 DNS, когда вы будете отделять свои приложения, что вы должны сделать в вашем сценарии.

Модули с несколькими контейнерами обычно используются в особых случаях, например, в контейнерах с коляской, чтобы помочь основному контейнеру с некоторыми конкретными задачами или прокси-серверами, мостами и адаптерами, например, для обеспечения возможности подключения к определенному месту назначения.

В вашем случае вы можете легко разделить их. В этом случае у вас есть развертывание с 1 Pod, в котором есть 3 контейнера, которые взаимодействуют друг с другом по локальному хосту, а не по DNS-именам, как уже упоминалось. После чего я рекомендую вам прочитать о DNS внутри Kubernetes и о том, как communication работает с сервисами, входящими в игру. В случае стручков вы можете прочитать больше здесь .

...