gpt4 book ai didi

nginx - Kubernetes nginx 入口 Controller 服务(版本 0.9.0)拒绝连接

转载 作者:行者123 更新时间:2023-12-02 11:45:21 25 4
gpt4 key购买 nike

我已尝试关注 this使用 nginx 入口 Controller 的教程。当我试图让它工作时,一些细节发生了变化——只有一个后端服务而不是两个,一些端口号和一切都在默认命名空间中运行。我在 CentOS Linux 版本 7.4.1708 虚拟机上有一个 kubernetes 主服务器和 3 个仆从。

后端和默认后端都可以通过各自的服务端点在集群内访问。
nginx 状态页面在外部可用(MasterHostIP:32000/nginx_status)。
问题是通过外部路径或从集群内部到 nginx-ingress-controller-service 端点的后端应用程序的 http 请求被拒绝。
希望那里的人可以看到我缺少的明显的东西,或者遇到过类似的问题并且知道如何克服这个问题。

[root@master1 ~]# kubectl get endpoints
NAME ENDPOINTS AGE
appsvc1 10.244.1.2:80,10.244.3.4:80 3h
default-backend 10.244.1.3:8080,10.244.2.3:8080,10.244.3.5:8080 14d
kubernetes 10.134.45.136:6443 15d
nginx-ingress 10.244.2.5:18080,10.244.2.5:9999 2h
[root@master1 ~]# wget 10.244.2.5:9999
--2018-01-05 12:10:56-- http://10.244.2.5:9999/
Connecting to 10.244.2.5:9999... failed: Connection refused.
[root@master1 ~]# wget 10.244.2.5:18080
--2018-01-05 12:12:52-- http://10.244.2.5:18080/
Connecting to 10.244.2.5:18080... connected.
HTTP request sent, awaiting response... 404 Not Found
2018-01-05 12:12:52 ERROR 404: Not Found.

对 appsvc1 端点的请求按预期运行,返回带有“Hello app1!”的静态 html。

后端应用部署:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app1
spec:
replicas: 2
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: dockersamples/static-site
env:
- name: AUTHOR
value: app1
ports:
- containerPort: 80

后台服务
apiVersion: v1
kind: Service
metadata:
name: appsvc1
spec:
ports:
- port: 9999
protocol: TCP
targetPort: 80
selector:
app: app1

应用入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
name: app-ingress
spec:
rules:
- host: test.com
http:
paths:
- backend:
serviceName: appsvc1
servicePort: 9999
path: /app1

nginx入口 Controller 部署
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
replicas: 1
revisionHistoryLimit: 3
template:
metadata:
labels:
app: nginx-ingress-lb
spec:
terminationGracePeriodSeconds: 60
serviceAccount: nginx
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0
imagePullPolicy: Always
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 5
args:
- /nginx-ingress-controller
- '--default-backend-service=$(POD_NAMESPACE)/default-backend'
- '--configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf'
- --v=6
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 80
- containerPort: 9999
- containerPort: 18080

nginx 入口 Controller 服务
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress
spec:
type: NodePort
ports:
- port: 9999
nodePort: 30000
name: http
- port: 18080
nodePort: 32000
name: http-mgmt
selector:
app: nginx-ingress-lb

nginx 入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: test.com
http:
paths:
- backend:
serviceName: nginx-ingress
servicePort: 18080

更新
看起来 9999 端口在入口 Controller pod 中未打开。谁能建议为什么端口 18080 被打开而不是 9999? :
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
app1-54cf69ff86-l7kp4 1/1 Running 0 17d
app1-54cf69ff86-qkksw 1/1 Running 0 17d
app2-7bc7498cbf-459vd 1/1 Running 0 2d
app2-7bc7498cbf-8x9st 1/1 Running 0 2d
default-backend-78484f94cf-fv6v4 1/1 Running 0 17d
default-backend-78484f94cf-vzp8l 1/1 Running 0 17d
default-backend-78484f94cf-wmjqh 1/1 Running 0 17d
nginx-ingress-controller-cfb567f76-wbck5 1/1 Running 0 15h
[root@master1 ~]# kubectl exec nginx-ingress-controller-cfb567f76-wbck5 -it bash
root@nginx-ingress-controller-cfb567f76-wbck5:/# netstat -tlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 14/nginx: master pr
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 14/nginx: master pr
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN 14/nginx: master pr
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN 14/nginx: master pr
tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 14/nginx: master pr
tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:http [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:http [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:https [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:https [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:18080 [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:18080 [::]:* LISTEN 14/nginx: master pr
tcp6 0 0 [::]:10254 [::]:* LISTEN 5/nginx-ingress-con

最佳答案

10.x 地址是内部的。所以404是预期的。入口 Controller 不会突然使您的内部服务外部化。入口服务应该通过单个地址代理对已部署服务的请求。由于我看到您通过节点端口部署了 Controller ,因此请尝试使用 Host header test.com 向节点的 IP 端口 30000 发出请求,您应该会获得您的应用程序。您外部化的每个服务都将通过入口 IP 可用,主机 header 由 HTTP 客户端设置,入口 Controller 将根据该请求(以及路径和您想要的任何其他内容)扇出请求。所以真的只有当你为域名付费时它才有效,因为我假设你没有 test.com 并且要求用户伪造请求 header 不是一个合理的接口(interface)

此外,由于您有 minion 节点(复数),您应该真正将 Controller 服务类型从 NodePort 更改为 LoadBalancer。教程中使用节点端口以便更便宜 - LoadBalancer 将启动一个您必须付费的云负载均衡器。当您就位时,节点端口是可以的,但肯定不是您以后可以做的事情。我真的希望人们不要在没有任何解释的情况下将它放在教程中

关于nginx - Kubernetes nginx 入口 Controller 服务(版本 0.9.0)拒绝连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48113602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com