【问题标题】:Kubernetes - minikube service connection timeoutKubernetes - minikube 服务连接超时
【发布时间】:2021-04-07 11:55:40
【问题描述】:

我有一个包含 3 个容器的 Docker 环境:nginx、带有 Laravel 的 PHP 和一个 MySQL 数据库。效果很好,我现在正在尝试学习 Kubernetes。

我希望为 nginx 容器创建一个部署和服务,以使其易于上手:

这是deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: toolkit-app-deployment
spec:
    replicas: 1
    selector:
        matchLabels:
            container: toolkit-server
    template:
        metadata:
            labels:
                container: toolkit-server
        spec:
            containers:
                - name: toolkit-server
                  image: my/toolkit-server:test
                  ports:
                      - containerPort: 8000
            imagePullSecrets:
                - name: my-cred

这里是 service.yaml:

apiVersion: v1
kind: Service
metadata:
    name: backend
spec:
    selector:
        container: toolkit-server
    ports:
        - protocol: "TCP"
          port: 80
          targetPort: 8000
    type: LoadBalancer

如果需要,这里是 docker-compose.yaml 的 nginx 部分:

version: "3.8"

services:
    server:
        build:
            context: .
            dockerfile: dockerfiles/nginx.dockerfile
        ports:
            - "8000:80"
        volumes:
            - ./src:/var/www/html
            - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
        container_name: toolkit-server

部署创建成功,我可以看到有 1/1 的 Pod 正在运行。

但是,当我运行 minikube service backend 时,我得到的 URL 只是超时。

我期待看到某种 nginx 页面,可能是 nginx 错误 - 但由于超时,我不确定下一步是什么。

我是 Kubernetes 的新手,很有可能我把端口弄乱了或者一些基本的东西。任何帮助表示赞赏。

编辑:

根据@david-maze 的建议,我在 deployment.yaml 中更改了以下内容:

ports:
  - containerPort: 80

以及 service.yaml 中的以下内容:

targetPort: 80

当我在浏览器中查看时,这给了我一个 nginx 错误页面,正如预期的那样,但关键是不再超时。

【问题讨论】:

  • 您是否对 Nginx 配置进行了任何更改,使其监听端口 8000,或者容器内的进程是否监听默认的 HTTP 端口 80?我可能会将 pod 和服务规范中提到的端口 8000 的两个提及更改为端口 80。
  • 嗨,我原来的 Docker 环境是通过 localhost:8000 访问的——我已将部署和服务 yamls 都更改为端口 80,现在我收到 502 bad gateway nginx 错误——这是进步!感谢您的帮助
  • 嗨@Lee。你能用上面提到的信息编辑你的问题吗?这将使分析更容易。
  • 没问题 - 我已经编辑了问题
  • 谢谢@Lee。那么现在的实际问题是什么?当前的行为(在大卫提出的更改之后)是您想要实现的行为吗?

标签: docker kubernetes dockerfile


【解决方案1】:

这是为提高可见性而发布的社区 wiki 答案。随意扩展它。

正如 cmets 中所讨论的,问题是由于端口配置错误造成的。

TargetPort 是服务将向其发送请求的端口,您的 pod 将在该端口上进行侦听。您在容器中的应用程序也需要侦听此端口。

ContainerPort 定义了可以在容器内访问应用的端口。

因此,在您的用例中,部署应该具有:

ports:
  - containerPort: 80

和服务:

targetPort: 80

这将使连接不再超时。

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 2019-02-08
    • 1970-01-01
    • 2020-06-19
    • 2020-08-26
    • 1970-01-01
    • 2016-11-14
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多