【问题标题】:Connection issue between services in kubernetesKubernetes中服务之间的连接问题
【发布时间】:2019-03-27 20:05:46
【问题描述】:

我有三个与我的应用程序相关的不同图像,它们在 docker-compose 中运行良好,并且在 GCP 中的 kubernetes 集群上运行时出现问题。

下面是部署文件。

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql-database
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306      
  selector:
    app: mysql-database
    tier: database
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql-database
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql-database
        tier: database
    spec:
      hostname: mysql
      containers:
        - image: mysql/mysql-server:5.7
          name: mysql
          env:
            - name: "MYSQL_USER"
              value: "root"
            - name: "MYSQL_HOST"
              value: "mysql"
            - name: "MYSQL_DATABASE"
              value: "xxxx"
            - name: "MYSQL_PORT"
              value: "3306"
            - name: "MYSQL_PASSWORD"
              value: "password"
            - name: "MYSQL_ROOT_PASSWORD"
              value: "password"
            - name: "RAILS_ENV"
              value: "production"
          ports:
            - containerPort: 5432
              name: db
---
apiVersion: v1
kind: Service
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    name: dgservice
    tier: dgservice
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: dgservice
        tier: dgservice
    spec:
      hostname: dgservice
      containers:
        - image: gcr.io/sample/sample-image:check_1
          name: dgservice
          ports:
            - containerPort: 8080
              name: dgservice
---
apiVersion: v1
kind: Service
metadata:
  name: dg-ui
  labels:
    name: dg-ui
spec:
  type: NodePort
  ports:
    - nodePort: 30156 
      port: 8000
      protocol: TCP
      targetPort: 8000
  selector:
    app: dg-ui
    tier: dg
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dg-ui
  labels:
    app: dg-ui
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: dg-ui
        tier: dg
    spec:
      hostname: dg-ui
      containers:
        - image: gcr.io/sample/sample:latest
          name: dg-ui
          env:
            - name: "MYSQL_USER"
              value: "root"
            - name: "MYSQL_HOST"
              value: "mysql"
            - name: "MYSQL_DATABASE"
              value: "xxxx"
            - name: "MYSQL_PORT"
              value: "3306"
            - name: "MYSQL_PASSWORD"
              value: "password"
            - name: "MYSQL_ROOT_PASSWORD"
              value: "password"
            - name: "RAILS_ENV"
              value: "production"
            - name: "DG_SERVICE_HOST"
              value: "dgservice"
          ports:
            - containerPort: 8000
              name: dg-ui

图像也从 GCR 中成功提取。

mysql 和 ui 服务之间的连接也可以正常工作,我的数据正在迁移,没有任何问题。但是服务和ui之间没有建立连接。

为什么 ui 无法访问我的应用程序中的服务?

【问题讨论】:

  • 嗨,如果服务之间的通信是内部的,那么值应该是type: ClusterIP而不是type: NodePort
  • 你有什么错误?你能卷曲到服务吗?
  • @SureshVishnoi curl 无法正常工作。 kubectl exec -it dg-ui-586c69fdb8-8wvdn bash root@dg-ui:/home/app/webapp# curl http://dgservice:8080/fieldTypes/metadata curl: (7) Failed to connect to dgservice port 8080: Connection timed out root@dg-ui:/home/app/webapp# command terminated with exit code 137。但是当我从 dgservice 节点运行时,同样的 curl 工作正常
  • @SureshVishnoi 我也尝试过使用 ClusterIP。还是不行
  • 嗨,你能运行kubectl describe service dgservicekubectl get endpoints dgservice

标签: docker kubernetes google-kubernetes-engine


【解决方案1】:

由于您的部署具有以下标签,因此服务需要具有相同的标签才能创建端点对象

端点是服务背后的 API 对象。端点是连接到服务的 ClusterIP 时服务将连接路由到的地方

以下是部署的标签

      labels:
        app: dgservice
        tier: dgservice

带有正确标签

的新服务定义
apiVersion: v1
kind: Service
metadata:
  name: dgservice
  labels:
    app: dgservice
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: dgservice
    tier: dgservice

【讨论】:

    【解决方案2】:

    我假设“服务”是指您的“dgservice”。有了上面介绍的yaml,相信你还需要指定DG_SERVICE_PORT(8080端口)才能正确访问“dgservice”。

    正如 Suresh 在 cmets 中提到的,您应该使用 ClusterIP 类型公开内部服务。 NodePort 是 ClusterIP 的超集,它将在内部将服务公开给您的集群service-name:port,并在外部公开node-ip:nodeport,以targetport 定位您的部署/pod。

    【讨论】:

      猜你喜欢
      • 2023-01-29
      • 1970-01-01
      • 2019-09-29
      • 2020-07-10
      • 2021-11-06
      • 2021-09-21
      • 1970-01-01
      • 2021-06-27
      • 2021-06-28
      相关资源
      最近更新 更多