我对Azure,Kubernetes,甚至是Docker本身都很陌生,并且正在使用该系统来学习和评估以后可能的部署。到目前为止,我已经将我的服务停靠并成功部署它们,并使用类型为LoadBalancer的服务公开显示Web前端。
现在我想添加TLS终端并且已经了解到,为此我应该配置一个入口控制器,其中最常提到的是nginx-ingress-controller。
严格修改示例,然后尝试阅读文档,我已经到达了一个看似有趣但不起作用的设置。也许某种灵魂可以指出我的错误和/或指出如何调试这个以及在哪里阅读更多关于它的信息。
我有kubectl申请' d以下文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: default-http-backend-deployment
namespace: kube-system
spec:
template:
metadata:
labels:
app: default-http-backend
spec:
terminationGracePeriodSeconds: 60
containers:
- name: default-http-backend
image: gcr.io/google_containers/defaultbackend:1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: default-http-backend-service
namespace: kube-system
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: default-http-backend
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-controller-conf
namespace: kube-system
data:
# enable-vts-status: 'true'
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller-deployment
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
app: nginx-ingress-controller
spec:
terminationGracePeriodSeconds: 60
containers:
- image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.13
name: nginx-ingress-controller
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf
---
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller-service
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: 443
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-ingress-controller
sessionAffinity: None
type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
namespace: kube-system
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: default-http-backend-service
servicePort: 80
这给了我两个豆荚:
c:\Projects\Release-Management\Azure>kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
<some lines removed>
kube-system default-http-backend-deployment-3108185104-68xnk 1/1 Running 0 39m
<some lines removed>
kube-system nginx-ingress-controller-deployment-4106313651-v7p03 1/1 Running 0 24s
还有两项新服务。请注意,我还使用类型:LoadBalancer配置了default-http-backend-service,这仅用于调试。我已经包含了我的网络前端,名为webcms:
c:\Projects\Release-Management\Azure>kubectl get services --all-namespaces
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
<some lines removed>
default webcms 10.0.105.59 13.94.250.173 80:31400/TCP 23h
<some lines removed>
kube-system default-http-backend-service 10.0.106.233 13.80.68.38 80:31639/TCP 41m
kube-system nginx-ingress-controller-service 10.0.33.80 13.95.30.39 443:31444/TCP,80:31452/TCP 37m
最后是一个入口:
c:\Projects\Release-Management\Azure>kubectl get ingress --all-namespaces
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
kube-system nginx-ingress * 10.240.0.5 80 39m
没有我能立即发现的错误。然后我去了Azure Dashboard并查看了负载均衡器及其规则,这对我(严重未经训练的)眼睛看起来很好。我没有触及这些,负载均衡器和规则是由系统创建的。这里有一个截图:
https://qvwx.de/tmp/azure-loadbalancer.png
但遗憾的是它不起作用。我可以卷曲我的网络摄像头服务:
c:\Projects\Release-Management\Azure>curl -v http://13.94.250.173
* Rebuilt URL to: http://13.94.250.173/
* Trying 13.94.250.173...
* TCP_NODELAY set
* Connected to 13.94.250.173 (13.94.250.173) port 80 (#0)
<more lines removed, success>
但是default-http-backend和ingress都没有工作:
c:\Projects\Release-Management\Azure>curl -v http://13.80.68.38
* Rebuilt URL to: http://13.80.68.38/
* Trying 13.80.68.38...
* TCP_NODELAY set
* connect to 13.80.68.38 port 80 failed: Timed out
* Failed to connect to 13.80.68.38 port 80: Timed out
* Closing connection 0
curl: (7) Failed to connect to 13.80.68.38 port 80: Timed out
(ingress使用不同的IP提供相同的内容)
如果你读到这里:感谢你的时间,我将不胜感激。
玛丽安
答案 0 :(得分:3)
有点琐碎的事情,但它会为你节省一些时间:default-http-backend
并非设计为面向外面,因此不应该type: LoadBalancer
- 它是{{ 3}}因此,Ingress控制器可以为无Pod服务提供普遍的/dev/null
流量。
略微提升平凡的阶梯,并且极其清晰:我不认为你拥有的是错误,但我确实想要为你提供一些决定你是否愿意改变的东西。通常,Pod的容器的合同是为端口(“http”,“https”,“prometheus”等)提供理想的自然语言名称,这些名称映射到底层图像的端口。然后,将服务中的targetPort:
设置为名称,而不是数字,它使容器能够移动端口号而不会破坏服务到 - 合同。 merely designed to 404同意我的意见。
现在,让我们进入可能导致您的系统无法按照您的意愿行事的部分。
我现在无法证明这一点,但The nginx-ingress Deployment's container:ports:的存在在没有containers:hostPort:的情况下是可疑的。我真的很惊讶kubectl
并没有抱怨,因为那些配置组合有点奇怪。
我想故障排除步骤是启用Node
(即群集中不是Pod的东西 - 您可以使用与{{在同一子网内的单独VM)来执行此操作1}},如果你愿意,然后卷曲到Node
Pod正在运行的Node
的端口31452。
nginx-ingress-controller
会列出所有可用的kubectl get nodes
和
Node
应生成特定VM的IP地址。呃,我刚从你的提示中意识到你可能没有kubectl get -o json pod nginx-ingress-controller-deployment-4106313651-v7p03 | jq -r '.items[0].status.hostIP'
- 但我不太了解PowerShell,知道它的JSON查询语法。
然后,从任何jq
:Node
,看看实现了什么。它可能是某种东西,或者它可能是相同的“wha?!” LoadBalancer给你的。
至于Ingress资源,再次默认-http-backend不应该有Ingress资源 - 我不知道它是否有任何伤害,因为我从未尝试过,但我也打赌$ 1它也不是帮助你的情况。
由于您已经知道curl -v http://${that_host_IP_value}:31452
已知Service
default:webcms
,我建议在default
命名空间中创建一个Ingress资源,几乎与您当前的Ingress资源完全相同,但是指出在webcms
而不是default-http-backend
。这样你的Ingress控制器实际上会有一些目标,而不是默认的后端。
如果您还没有看到它,hostNetwork: true将导致Pod发出其nginx配置更改的实际差异,这可能令人难以置信地有助于跟踪配置误解< / p>
我很抱歉,您必须与Azure,Ingress控制器以及与Kubernetes首次接触的粗略文档进行战斗。当你正确设置所有东西时真的很神奇,但肯定是一个相当复杂的机器。