【问题标题】:GKE backend service is UnhealthyGKE 后端服务不健康
【发布时间】:2023-01-24 23:50:26
【问题描述】:

我正在尝试创建一个简单的应用程序,该应用程序可以在 GKE 上使用 NextJS 和 Express 相互通信。

Ingress 控制器使用 GCE 默认控制器,并希望通过 Ingress 将流量路由到前端和后端服务。

当我第一次连接 external-ip 时,前端页面工作正常。 但是用external-ip/api连接时,出现502错误。

我用Nginx Controller的时候没有问题,但是GCE controller就出问题了。

以下是我使用的文件的内容。

index.js(快递)

const express = require('express')
const app = express()
const port = 8080

app.get('/api', (req, res) => {
  res.status(200).send({hello:'world'});
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

文件

From node:alpine
 
WORKDIR /usr/app
COPY ./ /usr/app

RUN apk update && apk add bash
RUN npm install
 
CMD ["node", "index.js"]

部署.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: backend-pv
spec:
  storageClassName: ""
  capacity:
    storage: 50G
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: backend-disk
---
apiVersion: v1
kind : PersistentVolumeClaim
metadata:
  name: backend-pvc
spec:
  storageClassName: ""
  volumeName: backend-pv
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50G
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend-app
        image: gcr.io/.../backend:test-30
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: backend-uploads
            mountPath: /var/www/uploads
      volumes:
      - name: backend-uploads
        persistentVolumeClaim:
          claimName: backend-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: backend-svc
spec:
  selector:
    app: backend
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080

入口.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: gce
    kubernetes.io/ingress.global-static-ip-name: test-service-ip
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: frontend-svc
            port:
              number: 80
      - path: /api
        pathType: ImplementationSpecific
        backend:
          service:
            name: backend-svc
            port:
              number: 80
$ kubectl get pods -o wide

NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE                                         NOMINATED NODE   READINESS GATES
backend-74fcf6bf96-lx2tr    1/1     Running   0          8h    10.224.1.10   gke-toy-cluster-default-pool-8430caa5-3jsq   <none>           <none>
frontend-579584b867-tctt7   1/1     Running   0          8h    10.224.1.9    gke-toy-cluster-default-pool-8430caa5-3jsq   <none>           <none>
$ kubectl get service -o wide

NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
backend-svc    NodePort    10.228.7.211   <none>        80:31355/TCP   8h    app=backend
frontend-svc   NodePort    10.228.14.26   <none>        80:31084/TCP   8h    app=frontend
kubernetes     ClusterIP   10.228.0.1     <none>        443/TCP        4d    <none>
$ kubectl describe ing test-ingress

Name:             test-ingress
Labels:           <none>
Namespace:        default
Address:          xxx.xxx.xxx.xxx
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host        Path  Backends
  ----        ----  --------
  *
              /      frontend-svc:80 (10.224.1.9:3000)
              /api   backend-svc:80 (10.224.1.10:8080)
Annotations:  ingress.kubernetes.io/backends:
                {"k8s1-31bc72d9-default-backend-svc-80-ff957d67":"UNHEALTHY","k8s1-31bc72d9-default-frontend-svc-80-c428ffdb":"HEALTHY","k8s1-31bc72d9-kub...
              ingress.kubernetes.io/forwarding-rule: k8s2-fr-s40ti3ho-default-test-ingerss-gceyflsd
              ingress.kubernetes.io/rewrite-target: /api
              ingress.kubernetes.io/target-proxy: k8s2-tp-s40ti3ho-default-test-ingerss-gceyflsd
              ingress.kubernetes.io/url-map: k8s2-um-s40ti3ho-default-test-ingerss-gceyflsd
              kubernetes.io/ingress.class: gce
              kubernetes.io/ingress.global-static-ip-name: test-service-ip
Events:
  Type    Reason  Age                   From                     Message
  ----    ------  ----                  ----                     -------
  Normal  Sync    44s (x62 over 7h52m)  loadbalancer-controller  Scheduled for sync

我尝试将后端服务和Ingress的端口更改为8080。我也尝试创建BackendConfig,但没有用。

有什么我想念的吗?

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    我学会了通过readinessProbe和livenessProbe来查看状态。当我如下更改 Deployment 时,它起作用了。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: backend
    spec:
      selector:
        # Deployment 오브젝트가 파드를 관리할 때 사용하는 매핑 정보
        matchLabels:
          app: backend
      template:
        metadata:
          # 생설될 파드의 라벨 정보
          labels:
            app: backend
        spec:
          containers:
          - name: backend-app
            image: gcr.io/.../backend:test-30
            ports:
            - containerPort: 8080
            readinessProbe:
              httpGet:
                path: /api
                port: 8080
              initialDelaySeconds: 5
            livenessProbe:
              httpGet:
                path: /api
                port: 8080
              initialDelaySeconds: 5
            volumeMounts:
              - name: backend-uploads
                mountPath: /var/www/uploads
          volumes:
          - name: backend-uploads
            persistentVolumeClaim:
              claimName: backend-pvc
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2019-10-10
      相关资源
      最近更新 更多