Назад | Перейти на главную страницу

Настройка служб TCP с входом nginx на minikube / k8s

Я новичок в k8s / minikube (и, в некоторой степени, в сетях Unix в целом), поэтому, если я спрошу что-то, что кажется бессмысленным, я буду счастлив уточнить!

Цель

Я хочу настроить входящий трафик TCP на основе порта, как кратко описано в документы nginx-ingress. В частности, я хочу использовать webpack-dev-server изнутри minikube.

ошибка

Когда он настроен в соответствии с моим лучшим пониманием, я все равно получаю Failed to load resource: net::ERR_CONNECTION_REFUSED при запросе local.web:3001/client.js. То есть при переходе в моем браузере к «local.web /» открывается страница, но без пакета, который webpack предназначен для производства. Запрос на это не выполняется.

Конфигурация

Переходя с хост-машины на модуль minikube, у меня есть

/ etc / hosts:

На своей машине разработчика я установил local.web на IP-адрес minikube

$ echo "$(minikube ip) local.web" | sudo tee -a /etc/hosts

Вход:

{
  "kind": "Ingress",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "dev-web-ingress",
    "namespace": "dev",
    "selfLink": "/apis/extensions/v1beta1/namespaces/dev/ingresses/dev-web-ingress",
    "uid": "64ebfc93-612e-11e9-8df7-0800270e7244",
    "resourceVersion": "280750",
    "generation": 3,
    "creationTimestamp": "2019-04-17T16:32:30Z",
    "labels": {
      "platform": "advocate",
      "tier": "frontend"
    },
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"extensions/v1beta1\",\"kind\":\"Ingress\",\"metadata\":{\"annotations\":{\"kubernetes.io/ingress.class\":\"nginx\"},\"labels\":{\"platform\":\"advocate\",\"tier\":\"frontend\"},\"name\":\"dev-web-ingress\",\"namespace\":\"dev\"},\"spec\":{\"rules\":[{\"host\":\"local.web\",\"http\":{\"paths\":[{\"backend\":{\"serviceName\":\"dev-adv-web-service\",\"servicePort\":\"http\"},\"path\":\"/\"}]}}]}}\n",
      "kubernetes.io/ingress.class": "nginx"
    }
  },
  "spec": {
    "rules": [
      {
        "host": "local.web",
        "http": {
          "paths": [
            {
              "path": "/",
              "backend": {
                "serviceName": "dev-adv-web-service",
                "servicePort": "http"
              }
            }
          ]
        }
      }
    ]
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {
          "ip": "10.0.2.15"
        }
      ]
    }
  }
}

Службы TCP

{
  "kind": "ConfigMap",
  "apiVersion": "v1",
  "metadata": {
    "name": "tcp-services",
    "namespace": "dev",
    "selfLink": "/api/v1/namespaces/dev/configmaps/tcp-services",
    "uid": "5e456f3e-622e-11e9-bcf8-0800270e7244",
    "resourceVersion": "295220",
    "creationTimestamp": "2019-04-18T23:04:50Z",
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"data\":{\"3001\":\"dev/dev-adv-web-service:3001\",\"9290\":\"dev/dev-echoserver:8080\"},\"kind\":\"ConfigMap\",\"metadata\":{\"annotations\":{},\"name\":\"tcp-services\",\"namespace\":\"dev\"}}\n"
    }
  },
  "data": {
    "3001": "dev/dev-adv-web-service:3001",
  }
}

Обслуживание:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "dev-adv-web-service",
    "namespace": "dev",
    "selfLink": "/api/v1/namespaces/dev/services/dev-adv-web-service",
    "uid": "64e3c65d-612e-11e9-8df7-0800270e7244",
    "resourceVersion": "280675",
    "creationTimestamp": "2019-04-17T16:32:30Z",
    "labels": {
      "app": "adv-web",
      "tier": "frontend"
    },
    "annotations": [... edited for clarity]
  },
  "spec": {
    "ports": [
      {
        "name": "http",
        "protocol": "TCP",
        "port": 80,
        "targetPort": 3000,
        "nodePort": 31246
      },
      {
        "name": "http2",
        "protocol": "TCP",
        "port": 3001,
        "targetPort": 3001,
        "nodePort": 31392
      }
    ],
    "selector": {
      "app": "frontend-container",
      "tier": "frontend"
    },
    "clusterIP": "10.108.24.80",
    "type": "LoadBalancer",
    "sessionAffinity": "None",
    "externalTrafficPolicy": "Cluster"
  },
  "status": {
    "loadBalancer": {}
  }
}

Стручок

{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "dev-adv-web-768767454f-wxvnh",
    "generateName": "dev-adv-web-768767454f-",
    "namespace": "dev",
    "selfLink": "/api/v1/namespaces/dev/pods/dev-adv-web-768767454f-wxvnh",
    "uid": "65de844e-622c-11e9-bcf8-0800270e7244",
    "resourceVersion": "294073",
    "creationTimestamp": "2019-04-18T22:50:43Z",
    "labels": {
      "app": "frontend-container",
      "pod-template-hash": "768767454f",
      "tier": "frontend"
    },
    "ownerReferences": [
      {
        "apiVersion": "apps/v1",
        "kind": "ReplicaSet",
        "name": "dev-adv-web-768767454f",
        "uid": "4babd3e7-613d-11e9-8df7-0800270e7244",
        "controller": true,
        "blockOwnerDeletion": true
      }
    ]
  },
  "spec": {
    "volumes": [
      {
        "name": "frontend-repo",
        "hostPath": {
          "path": "/Users/me/Projects/code/frontend",
          "type": ""
        }
      },
      {
        "name": "default-token-7rfht",
        "secret": {
          "secretName": "default-token-7rfht",
          "defaultMode": 420
        }
      }
    ],
    "containers": [
      {
        "name": "adv-web-container",
        "image": "localhost:5000/react:dev",
        "command": [
          "npm",
          "run",
          "dev"
        ],
        "ports": [
          {
            "name": "http",
            "containerPort": 3000,
            "protocol": "TCP"
          },
          {
            "name": "http2",
            "containerPort": 3001,
            "protocol": "TCP"
          }
        ],
        "env": [
          {
            "name": "HOSTNAME_PUBLISHED",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "HOSTNAME_PUBLISHED"
              }
            }
          },
          {
            "name": "LOCAL_DOMAIN",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "LOCAL_DOMAIN"
              }
            }
          },
          {
            "name": "HOST",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "HOST"
              }
            }
          },
          {
            "name": "WEBPACK_PUBLISHED_PORT",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "WEBPACK_PUBLISHED_PORT"
              }
            }
          },
          {
            "name": "WEBPACK_LISTEN_PORT",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "WEBPACK_LISTEN_PORT"
              }
            }
          },
          {
            "name": "API_URL",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "API_URL"
              }
            }
          },
          {
            "name": "LOGIN_CALLBACK_URL",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "LOGIN_CALLBACK_URL"
              }
            }
          },
          {
            "name": "NPM_CONFIG_LOGLEVEL",
            "valueFrom": {
              "configMapKeyRef": {
                "name": "dev-frontend-configmap",
                "key": "NPM_CONFIG_LOGLEVEL"
              }
            }
          }
        ],
        "resources": {},
        "volumeMounts": [
          {
            "name": "frontend-repo",
            "mountPath": "/code"
          },
          {
            "name": "default-token-7rfht",
            "readOnly": true,
            "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
          }
        ],
        "terminationMessagePath": "/dev/termination-log",
        "terminationMessagePolicy": "File",
        "imagePullPolicy": "Always"
      }
    ],
    "restartPolicy": "Always",
    "terminationGracePeriodSeconds": 30,
    "dnsPolicy": "ClusterFirst",
    "serviceAccountName": "default",
    "serviceAccount": "default",
    "nodeName": "minikube",
    "securityContext": {},
    "schedulerName": "default-scheduler",
    "tolerations": [
      {
        "key": "node.kubernetes.io/not-ready",
        "operator": "Exists",
        "effect": "NoExecute",
        "tolerationSeconds": 300
      },
      {
        "key": "node.kubernetes.io/unreachable",
        "operator": "Exists",
        "effect": "NoExecute",
        "tolerationSeconds": 300
      }
    ],
    "priority": 0,
    "enableServiceLinks": true
  },
  "status": {
    "phase": "Running",
    "conditions": [
      {
        "type": "Initialized",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2019-04-18T22:50:43Z"
      },
      {
        "type": "Ready",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2019-04-18T22:50:45Z"
      },
      {
        "type": "ContainersReady",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2019-04-18T22:50:45Z"
      },
      {
        "type": "PodScheduled",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2019-04-18T22:50:43Z"
      }
    ],
    "hostIP": "10.0.2.15",
    "podIP": "172.17.0.13",
    "startTime": "2019-04-18T22:50:43Z",
    "containerStatuses": [
      {
        "name": "adv-web-container",
        "state": {
          "running": {
            "startedAt": "2019-04-18T22:50:44Z"
          }
        },
        "lastState": {},
        "ready": true,
        "restartCount": 0,
        "image": "localhost:5000/react:dev",
        "imageID": "docker-pullable://localhost:5000/react@sha256:2bfe61ed134044bff4b23f5c057af2f9c480c3c1a1927a485f09f3410528903d",
        "containerID": "docker://57b9b6dafaf2aba8a21d5dd7db3543f4742c00331b49b48dc1561e3b5bd05315"
      }
    ],
    "qosClass": "BestEffort"
  }
}

Гипотезы

Одна мысль заключалась в том, что пространство имен служб TCP ConfigMap был неправ. Мне не ясно из документации, где он должен жить. Я пробовал это в пространстве имен dev, где находятся модули входа, службы и развертывания / модули. Я также попытался добавить data вход, как указано выше, в tcp-services ConfigMap в kube-system.

Журналы модуля webpack не показывают ошибок, поэтому я не верить проблема на уровне приложения.

Поскольку GET local.web/ возвращает данные из модуля, я убежден, что служба по крайней мере частично верна.

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