【问题标题】:Cannot access a LoadBalancer service at Kubernetes无法在 Kubernetes 访问 LoadBalancer 服务
【发布时间】:2020-02-13 00:59:38
【问题描述】:

我设法在 kubernetes 集群上部署了一个 python 应用程序。 python 应用程序映像部署在 AWS ECR(弹性容器注册表)。
我的部署是:

(NAME)charting-rest-server
(READY)1/1
(UP-TO-DATE )1
(可用)1
(AGE)33m
(CONTAINERS)charting-rest-server
(图像) *****.dkr.ecr.eu-west-2.amazonaws.com/charting-rest-server:latest
(SELECTOR )app=图表休息服务器

我的服务是:

(NAME)charting-rest-server-service
(TYPE)LoadBalancer
(CLUSTER-IP)10.100 .4.207
(EXTERNAL-IP)*********.eu-west-2.elb.amazonaws.com
(端口 >)8765:32735/TCP
(AGE)124m
(SELECTOR)app=charting-rest-server

根据这个 AWS guide ,当我执行 curl *****.us-west-2.elb.amazonaws.com:80 时,我应该能够从外部访问负载均衡器,它会将我路由到我的 pod 的 ip。
但我得到的只是

(6) 无法解析主机:*******.eu-west-2.elb.amazonaws.com



如果我想访问我的 pod 并发送一些请求,我应该有一个像 111.111.111.111 这样的外部 IP(obv 示例)。


编辑


部署的 yaml 是:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: charting-rest-server
spec:
  selector:
    matchLabels:
      app: charting-rest-server
  replicas: 1
  template:
    metadata:
      labels:
        app: charting-rest-server
    spec:
      containers:
      - name: charting-rest-server
        image: *****.eu-west-2.amazonaws.com/charting-rest-server:latest
        ports: 
          - containerPort: 5000


服务的 yaml:

apiVersion: v1
kind: Service
metadata:
  name:  charting-rest-server-service
spec:
  type: LoadBalancer
  selector:
    app: charting-rest-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000

我已经尝试了 cmets 的建议,使用入口实例,但我最终只花费了大量时间试图了解它们是如何工作的,“我做错了什么吗?/等等。

我将把我使用的 yaml 文件放在这里,但由于我的 ADDRESS 字段为空 - 没有可用的 ip,它没有改变。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: charting-rest-server-ingress
spec:
  rules:
  - host: charting-rest-server-service
    http:
      paths:
      - path:/
        backend:
          serviceName: charting-rest-server-service
          servicePort: 80

我被这个问题困扰了很长时间,所以我希望能得到一些帮助。

【问题讨论】:

  • 您是否有一个入口对象来为您的应用程序设置 http 路径路由? kubectl get ingress
  • 请为您的 pod、服务和部署发布 yaml 文件。如果你也这样做的话。
  • 更新问题

标签: kubernetes kubectl kubernetes-service amazon-ecr


【解决方案1】:

您已经创建了 Service 类型为 LoadBalancer,但您似乎配置了错误的端口。

您的Deployment 是用containerPort: 5000 创建的,而您的Service 指向targetPort: 9376。这些需要匹配Deployment 才能被公开。

如果您在为 Service 编写 yaml 时遇到困难,您可以使用以下 kubectl 命令公开 Deployment

kubectl expose --namespace=tick deployment charting-rest-server --type=LoadBalancer --port=8765 --target-port=5000 --name=charting-rest-server-service

一旦你修复了这些端口,你就可以使用它的主机名从外部访问该服务:

status:
  loadBalancer:
    ingress:
    - hostname: aba02b223436111ea85ea06a051f04d8-1294697222.eu-west-2.elb.amazonaws.com

我也推荐这个指南Tutorial: Expose Services on your AWS Quick Start Kubernetes cluster

如果您需要更多地控制 http 规则,请考虑使用ingress,您可以阅读更多关于ALB Ingress Controller on Amazon EKSUsing a Network Load Balancer with the NGINX Ingress Controller on Amazon EKS 的信息。

【讨论】:

  • 我刚刚更新了问题。据我了解,不复杂的应用程序不需要入口,但即使使用一个我也无法访问服务吊舱
  • @FloraBilesiou,您最好发布一个包含所有需要信息的新问题,而不是完全更改现有问题。
猜你喜欢
  • 2021-03-16
  • 2019-06-19
  • 2022-07-12
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多