我已经设置了Kubernetes集群,作为其中的一部分,设置了一个入口规则,将流量转发到web服务器。
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: alpha-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- alpha.example.com
secretName: letsencrypt-prod
rules:
- host: alpha.example.com
http:
paths:
- backend:
serviceName: web
servicePort: 80最后,浏览器会出现504错误,我在in日志中看到
2019/01/27 23:45:38错误41#41:*4943上游超时(110:连接超时)从上游读取响应头,客户机: 10.131.24.163,服务器: alpha.example.com,请求:"GET / HTTP/2.0",上游:"http://10.244.93.12:80/",主机:"alpha.example.com“
我没有那个IP地址的任何服务..。
╰─$ kgs --all-namespaces 130 ↵
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default database ClusterIP 10.245.181.187 <none> 5432/TCP 4d8h
default kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 9d
default user-api ClusterIP 10.245.41.8 <none> 9000/TCP 4d8h
default web ClusterIP 10.245.145.213 <none> 80/TCP,443/TCP 34h
ingress-nginx ingress-nginx LoadBalancer 10.245.25.107 <external-ip> 80:31680/TCP,443:32324/TCP 50m
kube-system grafana ClusterIP 10.245.81.91 <none> 80/TCP 6d1h
kube-system kube-dns ClusterIP 10.245.0.10 <none> 53/UDP,53/TCP,9153/TCP 9d
kube-system prometheus-alertmanager ClusterIP 10.245.228.165 <none> 80/TCP 6d2h
kube-system prometheus-kube-state-metrics ClusterIP None <none> 80/TCP 6d2h
kube-system prometheus-node-exporter ClusterIP None <none> 9100/TCP 6d2h
kube-system prometheus-pushgateway ClusterIP 10.245.147.195 <none> 9091/TCP 6d2h
kube-system prometheus-server ClusterIP 10.245.202.186 <none> 80/TCP 6d2h
kube-system tiller-deploy ClusterIP 10.245.11.85 <none> 44134/TCP 9d如果我看到入口舱上的resolv.conf文件,它会返回它应该.
╰─$ keti -n ingress-nginx nginx-ingress-controller-c595c6896-klw25 -- cat /etc/resolv.conf 130 ↵
nameserver 10.245.0.10
search ingress-nginx.svc.cluster.local svc.cluster.local cluster.local
options ndots:5dig/nslookup/host在该容器上不可用,但是如果我创建一个简单的busybox实例,它就可以使用相同的配置获得正确的IP:
╰─$ keti busybox -- nslookup web
Server: 10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name: web
Address 1: 10.245.145.213 web.default.svc.cluster.local有人能告诉我下一步该做什么吗?
更新#1
以下是web的配置,正如注释中所要求的那样。我还在研究为什么不能直接使用集群内的wget从web中获取任何东西。
apiVersion: v1
kind: Service
metadata:
labels:
io.kompose.service: web
app: web
name: web
spec:
ports:
- name: "80"
port: 80
targetPort: 80
- name: "443"
port: 443
targetPort: 443
selector:
io.kompose.service: web
status:
loadBalancer: {}
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app: web
template:
metadata:
labels:
io.kompose.service: web
app: web
spec:
containers:
- image: <private docker repo>
imagePullPolicy: IfNotPresent
name: web
resources: {}
imagePullSecrets:
- name: gcr
status: {}更新2
根据迈克尔下面的评论,它为web解析的IP地址是它的端点之一:
╰─$ k get endpoints web 130 ↵
NAME ENDPOINTS AGE
web 10.244.93.12:443,10.244.93.12:80 2d发布于 2019-01-28 21:30:07
因此,这一切归结为php服务没有任何端点,因为我错误地配置了服务选择器!
一些目光敏锐的读者可能已经注意到,我的配置是作为一个从docker-复合配置文件(我的dev环境)的转换开始的,我已经从那里构建了它。
问题的出现是因为我更改了部署的标签和选择器,而不是服务本身。
apiVersion: v1
kind: Service
metadata:
name: user-api
labels:
io.kompose.service: user-api
app: user-api
spec:
ports:
- name: "9000"
port: 9000
targetPort: 9000
selector:
io.kompose.service: user-api
status:
loadBalancer: {}
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: user-api
name: user-api
spec:
replicas: 1
selector:
matchLabels:
app: user-api
template:
metadata:
labels:
app: user-api
spec:
... etc您可以看到,我仍然使用为我创建的旧选择器,io.kompose.service: user-api而不是较新的app: user-api。
我听从了@coderanger的建议,而nginx服务正在响应,php却没有响应。
快速查看一下将应用程序与服务连接的文档就会发现:
如前所述,服务由一组Pods支持。这些口袋妖怪通过端点暴露。将持续评估服务的选择器,结果将是指向Endpoint对象(也称为my-nginx )的POSTed。
当我检查服务和部署模板的选择器时,我发现它们是不同的,现在它们匹配了,一切都如预期的那样工作。
https://stackoverflow.com/questions/54394181
复制相似问题