何が起きたか
GKEのingressを設定してアクセスしたところ以下のエラーが出た。
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>502 Server Error</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Server Error</h1>
<h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2>
<h2></h2>
</body></html>
ingressはいろいろなエラーが発生する割にトラブルシュートの資料がGoogleCloudになく、毎回原因の究明に苦労するので、今回のケースについて原因を残しておく
原因
serviceのバックエンドになるpodのlabelが間違っており、serviceがリクエストを受け付けることができてなかった。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: default-client
name: default-client
spec:
replicas: 1
selector:
matchLabels:
app: default-client
template:
metadata:
labels:
app: default-client # serviceのselectorと一致してない
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
別のpodからserviceに、直接リクエストした際にリクエストが拒否されたので判明した。
修正後は以下のとおり。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: nginx
port:
number: 80