我正在尝试在 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
---
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
答案 0 :(得分:2)
在您的原始问题中(没有编辑和附加信息),在 frontend
部署中,您有 port
值配置错误。
简而言之,部署中的 containerPort
必须与 targetPort
中的 Service
具有相同的值。
用户@herbertgoto 有个好主意,但不幸的是没有具体说明应该做什么。当您将 containerPort
从 8080
更改为 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
外部IP:8080
如您所见,当我没有使用默认的
8080
端口时,我需要在浏览器和 curl 命令中指定端口 80
。
部署 containerPort
和服务 targetPort
必须具有相同的值。当您使用 port
与 80
不同的服务时,您需要通过添加 :<portNubmer>
来指定它。这就是为什么在互联网上的几乎所有指南中,您都可以看到值为 port
的服务 80
。
答案 1 :(得分:0)
containerPort 设置为 8080,service targetPort 设置为 80