Kubernetes部署中的DNS未按预期工作

Kubernetes部署中的DNS未按预期工作,kubernetes,minikube,skaffold,Kubernetes,Minikube,Skaffold,我精通Docker,但K8肯定出了什么问题。我正在用minikube运行skaffold,并试图让容器之间的DNS工作。以下是我的部署: kind: Deployment apiVersion: apps/v1 metadata: name: my-api labels: app: my-api spec: replicas: 1 selector: matchLabels: app: my-api template: metadata:

我精通Docker,但K8肯定出了什么问题。我正在用
minikube
运行
skaffold
,并试图让容器之间的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

但是,在此场景中,
myapi节点
无法通过DNS主机名
myapi postgres
联系
myapi postgres
。知道我做错了什么吗?

您已经将所有3个容器定义为同一个吊舱的一部分。POD有一个通用的网络名称空间,因此在当前设置中(这是不正确的,稍后将详细介绍),您可以使用
localhost:
与其他容器通信

做到这一点的“正确”方法是为每个应用程序创建一个新的部署,并使用

您的示例将大致变成(未经测试):


DNS记录为服务注册,因此您将连接到这些服务,并被转发到其后面的POD(简化)。如果您需要从外部世界访问节点应用程序,这是一个完整的附加交易,您应该查看类型服务,或者。

您已经将所有3个容器定义为同一pod的一部分。POD有一个通用的网络名称空间,因此在当前设置中(这是不正确的,稍后将详细介绍),您可以使用
localhost:
与其他容器通信

做到这一点的“正确”方法是为每个应用程序创建一个新的部署,并使用

您的示例将大致变成(未经测试):


DNS记录为服务注册,因此您将连接到这些服务,并被转发到其后面的POD(简化)。如果您需要从外部世界访问您的节点应用程序,这是一个完整的附加交易,您应该查看类型服务,或者。

作为johnharris85 DNS的补充,当您将分离应用程序时,您应该在您的场景中这样做

多容器吊舱通常用于特定的用例中,例如侧车容器,以帮助主容器完成某些特定任务或代理、网桥和适配器,例如提供到某些特定目的地的连接

在您的情况下,您可以轻松地将它们分开。在本例中,您有一个带有1个Pod的部署,其中有3个容器通过localhost而不是前面提到的DNS名称彼此通信。 在此之后,我建议您阅读Kubernetes内部的DNS,以及如何与逐步进入游戏的服务一起工作。
如果是豆荚,你可以阅读更多

作为johnharris85 DNS的补充,当您将分离应用程序时,您应该在您的场景中这样做

多容器吊舱通常用于特定的用例中,例如侧车容器,以帮助主容器完成某些特定任务或代理、网桥和适配器,例如提供到某些特定目的地的连接

在您的情况下,您可以轻松地将它们分开。在本例中,您有一个带有1个Pod的部署,其中有3个容器通过localhost而不是前面提到的DNS名称彼此通信。 在此之后,我建议您阅读Kubernetes内部的DNS,以及如何与逐步进入游戏的服务一起工作。 如果是豆荚,你可以阅读更多

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