【问题标题】:Exposing Docker container port in Kubernetes config在 Kubernetes 配置中公开 Docker 容器端口
【发布时间】:2022-01-13 23:55:42
【问题描述】:

我正在尝试将 Flask python API 部署到 Kubernetes (EKS)。我已经设置了 Dockerfile,但是发生了一些奇怪的事情。

Dockerfile:

FROM python:3.8
 
WORKDIR /app
COPY . /app
 
RUN pip3 install -r requirements.txt
 
EXPOSE 43594

ENTRYPOINT ["python3"]
CMD ["app.py"]

我构建运行 docker build -t store-api . 的映像。

当我尝试运行容器并到达端点时,我得到socker hung up。但是,如果我运行图像做

docker run -d -p 43594:43594 store-api

我可以通过响应成功到达端点。

我的直觉是端口映射。

现在说了这么多,在 Kubernetes pod 中运行映像,我无法从端点取回任何东西并获得 socket hung up

我的问题是,如何将端口映射显式添加到我的 Kubernetes 部署/服务?

部分Deployment.yaml

    spec:
      containers:
        - image: store-api
          name: store-api
          ports:
            - containerPort: 43594
          resources: {}
          volumeMounts:
            - mountPath: /usr/local/bin/wait-for-it.sh
              name: store-api-claim0
          imagePullPolicy: Always

Service.yaml:

spec:
  type: LoadBalancer
  ports:
    - port: 43594
      protocol: TCP
      targetPort: 43594
  selector:
    app: store-api
status:
  loadBalancer: {}

如果我使用kubectl port-forward deployment/store-api 43594:43594 进行端口转发并将请求发布到localhost:43594/,它可以正常工作。

【问题讨论】:

  • 在 Kubernetes 案例中您尝试连接的 URL 是什么? Pod 是否真的启动了(kubectl logs 是否显示 Flask 应用程序的输出)? Service 是否正确绑定到 Pod(kubectl describe service ...Endpoints: 显示什么)?
  • @DavidMaze 感谢您的回复。是的,pod 像往常一样启动,日志显示它正在侦听我分配的端口。描述服务时,我得到一个LoadBalancer ingress URL,但对于端点我有<none>
  • 如果我使用kubectl port-forward deployment/store-api 43594:43594 进行端口转发并将请求发布到localhost:43594/ 它工作正常。
  • socket挂了是nodejs错误! kuber 入口控制器和其他 kuber 组件都是用 go 编写的,你的代码是 python!怎么来的?!
  • 如果服务描述为Endpoints: <none>,则服务的selector: 与部署的template: { metadata: { labels: } } 不匹配。仔细检查。

标签: docker kubernetes


【解决方案1】:

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

问题

kubectl describe service <name_of_the_service> 命令的输出包含Endpoints: <none>

一些理论

来自 Kubernetes 词汇表:

Service

一种将运行在一组 Pod 上的应用程序公开为 网络服务。 Service 所针对的 Pod 集是 (通常)由选择器确定。如果添加或删除更多 Pod, 匹配选择器的 Pod 集将会改变。该服务使 确保可以将网络流量定向到当前的 Pod 集 工作量。

Endpoints

端点使用匹配的选择器跟踪 Pod 的 IP 地址。

Selector:

允许用户根据标签过滤资源列表。查询资源列表时应用选择器以按标签过滤它们。

解决方案

部署的spec.template.metadata.labels 中的标签应与服务中的spec.selector 中的标签相同。

与此类问题相关的其他信息可以在Kubernetes site找到:

如果 ENDPOINTS 列是 ,您应该检查 您的 Service 的 spec.selector 字段实际上选择了 您的 Pod 上的 metadata.labels 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多