Stu*_*haw 5 nginx kubernetes kubernetes-ingress nginx-ingress
我已经设置了 Kubernetes 集群,并且作为设置的一部分,设置了入口规则以将流量转发到 Web 服务器。
\n\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: alpha-ingress\n annotations:\n kubernetes.io/ingress.class: nginx\n certmanager.k8s.io/cluster-issuer: letsencrypt-prod\nspec:\n tls:\n - hosts:\n - alpha.example.com\n secretName: letsencrypt-prod\n rules:\n - host: alpha.example.com\n http:\n paths:\n - backend:\n serviceName: web\n servicePort: 80\nRun Code Online (Sandbox Code Playgroud)\n\n最终浏览器超时并出现 504 错误,在 Ingress 日志中我看到
\n\n\n\n\n2019/01/27 23:45:38 [错误] 41#41: *4943 上游超时 (110:\n 连接超时) 从上游读取响应标头,\n 客户端:10.131.24.163,服务器:alpha。 example.com,请求:“GET /\n HTTP/2.0”,上游:“ http://10.244.93.12:80/ ”,主机:\n“alpha.example.com”
\n
我在该 IP 地址上没有任何服务...
\n\n\xe2\x95\xb0\xe2\x94\x80$ kgs --all-namespaces 130 \xe2\x86\xb5\nNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\ndefault database ClusterIP 10.245.181.187 <none> 5432/TCP 4d8h\ndefault kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 9d\ndefault user-api ClusterIP 10.245.41.8 <none> 9000/TCP 4d8h\ndefault web ClusterIP 10.245.145.213 <none> 80/TCP,443/TCP 34h\ningress-nginx ingress-nginx LoadBalancer 10.245.25.107 <external-ip> 80:31680/TCP,443:32324/TCP 50m\nkube-system grafana ClusterIP 10.245.81.91 <none> 80/TCP 6d1h\nkube-system kube-dns ClusterIP 10.245.0.10 <none> 53/UDP,53/TCP,9153/TCP 9d\nkube-system prometheus-alertmanager ClusterIP 10.245.228.165 <none> 80/TCP 6d2h\nkube-system prometheus-kube-state-metrics ClusterIP None <none> 80/TCP 6d2h\nkube-system prometheus-node-exporter ClusterIP None <none> 9100/TCP 6d2h\nkube-system prometheus-pushgateway ClusterIP 10.245.147.195 <none> 9091/TCP 6d2h\nkube-system prometheus-server ClusterIP 10.245.202.186 <none> 80/TCP 6d2h\nkube-system tiller-deploy ClusterIP 10.245.11.85 <none> 44134/TCP 9d\nRun Code Online (Sandbox Code Playgroud)\n\n如果我查看 ingress pod 上的 resolv.conf 文件,它会返回它应该返回的内容...
\n\n\xe2\x95\xb0\xe2\x94\x80$ keti -n ingress-nginx nginx-ingress-controller-c595c6896-klw25 -- cat /etc/resolv.conf 130 \xe2\x86\xb5\nnameserver 10.245.0.10\nsearch ingress-nginx.svc.cluster.local svc.cluster.local cluster.local\noptions ndots:5\nRun Code Online (Sandbox Code Playgroud)\n\ndig/nslookup/host 在该容器上不可用,但如果我创建一个简单的 busybox 实例,它会使用相同的配置获得正确的 IP:
\n\n\xe2\x95\xb0\xe2\x94\x80$ keti busybox -- nslookup web\nServer: 10.245.0.10\nAddress 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local\n\nName: web\nAddress 1: 10.245.145.213 web.default.svc.cluster.local\nRun Code Online (Sandbox Code Playgroud)\n\n谁能给我任何想法下一步要尝试什么?
\n\n更新#1
\n\nweb这是评论中要求的配置。我还在调查为什么我不能直接使用集群内的 busybox 进行wget任何操作。web
apiVersion: v1\nkind: Service\nmetadata:\n labels:\n io.kompose.service: web\n app: web\n name: web\nspec:\n ports:\n - name: "80"\n port: 80\n targetPort: 80\n - name: "443"\n port: 443\n targetPort: 443\n selector:\n io.kompose.service: web\nstatus:\n loadBalancer: {}\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n labels:\n app: web\n name: web\nspec:\n replicas: 1\n strategy:\n type: RollingUpdate\n selector:\n matchLabels:\n app: web\n template:\n metadata:\n labels:\n io.kompose.service: web\n app: web\n spec:\n containers:\n - image: <private docker repo>\n imagePullPolicy: IfNotPresent\n name: web\n resources: {}\n imagePullSecrets:\n - name: gcr\nstatus: {}\nRun Code Online (Sandbox Code Playgroud)\n\n更新2
\n\n根据下面 Michael 的评论,它已解析的 IP 地址web是它的端点之一:
\xe2\x95\xb0\xe2\x94\x80$ k get endpoints web 130 \xe2\x86\xb5\nNAME ENDPOINTS AGE\nweb 10.244.93.12:443,10.244.93.12:80 2d\nRun Code Online (Sandbox Code Playgroud)\n
所以,这一切都归结为 php-fpm 服务没有任何端点,因为我错误配置了服务选择器!
\n\n一些眼尖的读者可能已经发现,我的配置是从 docker-compose 配置文件(我的开发环境)转换而来的,我是从那里开始构建的。
\n\n问题的出现是因为我更改了部署的标签和选择器,但没有更改服务本身。
\n\napiVersion: v1\nkind: Service\nmetadata:\n name: user-api\n labels:\n io.kompose.service: user-api\n app: user-api\nspec:\n ports:\n - name: "9000"\n port: 9000\n targetPort: 9000\n selector:\n io.kompose.service: user-api\nstatus:\n loadBalancer: {}\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n labels:\n app: user-api\n name: user-api\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: user-api\n template:\n metadata:\n labels:\n app: user-api\n spec:\n... etc\nRun Code Online (Sandbox Code Playgroud)\n\n您可以看到我仍在使用 kompose 为我创建的旧选择器,io.kompose.service: user-api而不是较新的选择器app: user-api
我遵循了 @coderanger 的建议,虽然 nginx 服务有响应,但 php-fpm 没有响应。
\n\n快速浏览一下连接应用程序与服务的文档说:
\n\n\n\n\n如前所述,服务由一组 Pod 支持。这些 Pod 通过端点公开。Service\xe2\x80\x99s 选择器将被持续评估,结果将被 POST 到一个也名为 my-nginx 的 Endpoints 对象。
\n
当我检查服务和部署模板的选择器时,我发现它们是不同的,现在它们匹配并且一切都按预期工作。
\n| 归档时间: |
|
| 查看次数: |
10959 次 |
| 最近记录: |