【问题标题】:Issues when using AKS to manage containers使用 AKS 管理容器时的问题
【发布时间】:2019-01-12 10:54:11
【问题描述】:

我正在使用 docker + AKS 来管理我的容器。当我在本地/或使用 docker-compose 在 VM 上运行容器时,我的服务(容器化)可以与容器中的数据库通信。这些容器之间的桥梁是使用网络创建的。在我将所有应用程序的 docker-compose 文件转换为相应的 yaml 对应文件并将我的容器部署到 AKS(单节点)后,我的容器化服务无法访问数据库。

我所有的容器都有 3 个 yaml 文件

  1. 聚氯乙烯
  2. 部署(用于 pod)
  3. 服务。

我已经完成了许多 AKS 示例的入门,但由于某种原因无法弄清楚。所有应用程序服务都使用负载均衡器公开。我的问题更像是我如何定义应用程序服务应该连接到哪个数据库,因为网络的概念不再存在。

在为 KS 提供的示例中,所有前端服务所做的就是创建一个环境并指定后端服务的名称。我也尝试过,但我的应用程序仍然无法正常工作。我提到的验证我的设置的示例是https://docs.microsoft.com/en-gb/azure/aks/kubernetes-walkthrough#run-the-application

任何帮助都会很棒。

【问题讨论】:

    标签: kubernetes azure-aks


    【解决方案1】:

    如果您仅在内部需要这些服务,则不应使用负载均衡器公开它。

    Kubernetes 有两种服务发现的可能性。 DNS 和环境变量。虽然 DNS 是一个可选组件,但我没有看到没有它的任何集群。我还假设 AKS 使用它。

    因此,例如,您有一个 Postgres 数据库并想在其他地方使用它:

    apiVersion: extensions/v1beta1
    kind: Deployment
    
    metadata:
      name: postgres
      labels:
        app: postgres
    
    spec:
      replicas: 1
    
      template:
        metadata:
          labels:
            app: postgres
    
        spec:
          containers:
          - name: db
            image: postgres:11
    
            ports:
            - name: postgres
              containerPort: 5432
    

    这会创建一个暴露端口 5432 的部署。标签 app: postgres 在这里也很重要,因为我们稍后需要它来识别创建的 Pod。

    现在我们需要为它创建一个服务:

    apiVersion: v1
    kind: Service
    
    metadata:
      name: postgres
      labels:
        app: postgres
    
    spec:
      type: ClusterIP # default value
    
      selector:
        app: postgres
    
      ports:
      - port: 5432
    

    这将创建一个虚拟 IP 地址并将所有准备好的 pod 与标签 app: postgres 注册到它。由于服务的名称是 postgres 并且它是默认命名空间,因此现在可以通过 postgres.default.svc.cluster.local:5432 访问 postgres。您可以在您的其他应用程序(例如 Python)中将此地址和端口连接到数据库。

    【讨论】:

    • 非常感谢您提供的信息。它用我提供的信息为我指明了正确的方向。干杯
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多