无法访问 Kubenetes 负载均衡器

时间:2021-03-09 21:14:06

标签: kubernetes kubernetes-ingress amazon-eks aws-load-balancer

我正在尝试在 AWS EKS 集群中托管以下(部署 前端)Kubernetes 部署,在部署部署并创建服务和入口后,一切都已成功部署和创建,但是当我尝试访问时来自外部的负载均衡器 DNS,则此负载均衡器不可访问。 有人能指出原因吗?

**下面的代码 (deployment-2048) 正在运行并且负载均衡器可以访问,但在(部署前端)** 的情况下则不能。

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-03-09T14:08:45Z"
  generation: 2
  name: frontend
  namespace: default
  resourceVersion: "2864"
  uid: a7682f3b-dffa-498f-be47-b231cce0720a
spec:
  minReadySeconds: 20
  progressDeadlineSeconds: 600
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      name: webapp
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        name: webapp
    spec:
      containers:
      - image: kodekloud/webapp-color:v2
        imagePullPolicy: IfNotPresent
        name: simple-webapp
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 4
  observedGeneration: 2
  readyReplicas: 4
  replicas: 4
  updatedReplicas: 4

---
apiVersion: v1
kind: Service
metadata:
  namespace: default
  name: service-1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    name: webapp
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: ingress-1
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-1
              servicePort: 80

enter image description here

enter image description here

enter image description here

---
apiVersion: v1
kind: Namespace
metadata:
  name: game-2048
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 5
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
      - image: alexwhen/docker-2048
        imagePullPolicy: Always
        name: app-2048
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: app-2048
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-2048
              servicePort: 80

2 个答案:

答案 0 :(得分:2)

在您的原始问题中(没有编辑和附加信息),在 frontend 部署中,您有 port 值配置错误。

  • Port 在集群内的指定端口上公开 Kubernetes 服务。集群中的其他 pod 可以在指定端口上与此服务器通信。
  • TargetPort 是服务将向其发送请求的端口,您的 pod 将监听该端口。您在容器中的应用程序也需要监听此端口。
  • ContainerPort 定义可以在容器内访问应用的端口。

简而言之,部署中的 containerPort 必须与 targetPort 中的 Service 具有相同的值。

用户@herbertgoto 有个好主意,但不幸的是没有具体说明应该做什么。当您将 containerPort8080 更改为 80 时,它应该可以工作,但我想在所有资源中重新填充此更改(重新创建入口资源、重新部署 pod)会出现问题。

故障排除的首要步骤之一应该是检查您的容器是否正在侦听正确的端口。这就是我请求 $ netstat 输出的原因。

有用的检查命令是使用 $ kubectl get ep 检查服务端点。

注意

如果您将跳过服务中的 targetPort 并且只有 port,Kubernetes 会根据 targetPort 自动分配 port 值。

<块引用>

当我只将 containerPort 和 TargetPort 保持为 8080 时,其他保持为 80。为什么它会这样工作。

服务的默认端口是 80。因此,当您使用端口 80 创建 service 时,您无需指定任何其他内容。当您将 port 中的 service 设置为 8080 时,您还需要指定它。

我已经创建了端口为 8080 的服务,没有我的 GKE 集群。

$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes   ClusterIP      10.104.0.1      <none>          443/TCP          153m
my-nginx     LoadBalancer   10.104.14.137   34.91.230.207   8080:31311/TCP   9m39s
$ curl 34.91.230.207
curl: (7) Failed to connect to 34.91.230.207 port 80: Connection timed out
$ curl 34.91.230.207:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
...

来自浏览器的响应:

仅外部IP enter image description here 外部IP:8080 enter image description here 如您所见,当我没有使用默认的 8080 端口时,我需要在浏览器和 curl 命令中指定端口 80

结论:

部署 containerPort 和服务 targetPort 必须具有相同的值。当您使用 port80 不同的服务时,您需要通过添加 :<portNubmer> 来指定它。这就是为什么在互联网上的几乎所有指南中,您都可以看到值为 port 的服务 80

答案 1 :(得分:0)

containerPort 设置为 8080,service targetPort 设置为 80