我跟随this guide在GKE中安装了Nginx入口控制器。
然后,我跟随this guide为我的服务创建入口资源。
我已经成功设置了测试应用程序和服务。通过将端口转发到容器进行了测试。
设置入口似乎很好,但我无法访问它。打开外部ip 时,将显示以下502错误:
错误:服务器错误
服务器遇到临时错误,可能 无法完成您的请求。
请在30秒内重试。
请参阅入口的describe
│Name: teamcity │
│Namespace: default │
│Labels: <none> │
│Annotations: ingress.kubernetes.io/backends: {"k8s-be-31984--b5c10175cf4f125b":"UNHEALTHY"} │
│ ingress.kubernetes.io/forwarding-rule: k8s-fw-default-teamcity--b5c10175cf4f125b │
│ ingress.kubernetes.io/target-proxy: k8s-tp-default-teamcity--b5c10175cf4f125b │
│ ingress.kubernetes.io/url-map: k8s-um-default-teamcity--b5c10175cf4f125b │
│ kubectl.kubernetes.io/last-applied-configuration: │
│ {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"teamcity","namespace":"default"},"spec":│
│{"backend... │
│API Version: extensions/v1beta1 │
│Kind: Ingress │
│Metadata: │
│ Creation Timestamp: 2019-11-02T12:49:21Z │
│ Generation: 1 │
│ Resource Version: 553521 │
│ Self Link: /apis/extensions/v1beta1/namespaces/default/ingresses/teamcity │
│ UID: 312aa230-fd6f-11e9-ad91-42010a84009d │
│Spec: │
│ Backend: │
│ Service Name: teamcity │
│ Service Port: 8111 │
│Status: │
│ Load Balancer: │
│ Ingress: │
│ Ip: 35.190.86.15 │
│Events: │
│ Type Reason Age From Message │
│ ---- ------ ---- ---- ------- │
│ Normal ADD 18m loadbalancer-controller default/teamcity │
│ Normal CREATE 17m loadbalancer-controller ip: 35.190.86.15
此外,这是我用于整个混搭的yaml文件:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: teamcity
labels:
app: teamcity
spec:
replicas: 1
selector:
matchLabels:
app: teamcity
template:
metadata:
labels:
app: teamcity
spec:
containers:
- name: teamcity-server
image: jetbrains/teamcity-server:latest
ports:
- containerPort: 8111
---
apiVersion: v1
kind: Service
metadata:
name: teamcity
labels:
app: teamcity
spec:
type: NodePort
ports:
- port: 8111
targetPort: 8111
protocol: TCP
selector:
app: teamcity
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: teamcity
spec:
backend:
serviceName: teamcity
servicePort: 8111
我想知道我在这里做错了。
答案 0 :(得分:1)
您正在将GKE入口控制器与该入口资源(而非Nginx)一起使用。事实证明,它正在创建所有资源来创建HTTP负载平衡器;转发规则,目标代理,URL映射,后端服务。
您需要将注释kubernetes.io/ingress.class: "nginx"
传递到Ingress资源,以使其使用Nginx Ingress Controller知道。
现在,由于GCP负载平衡器无法立即开始工作,您获得503的机会。大约3-4分钟后,您可能会得到200。
答案 1 :(得分:0)
使用入口时,nginx服务将暴露给LoadBalancer,而其他服务只能保留在clusterIP上。
您可以在此处将服务更改为ClusterIP类型而不是Nodeport,然后尝试以这种方式构建入口规则-
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: rule-name
namespace: default
spec:
rules:
- host: hostname
http:
paths:
- backend:
serviceName: teamcity
servicePort: 8111
在当前情况下,您尚未将任何主机名映射到您的入口规则,如果没有专门的主机名,则可以仅使用映射到您的nginx的publicIP / ExternalIP的DNS名称。