2

我正在 GKE 中进行部署,这是我的第一个部署,所以我对这些概念还很陌生,但我知道他们将如何使用这些工具,只需要经验来自信。

首先,我有一个包含大约五个服务的集群,其中两个我想通过外部负载均衡器公开。我已经为 Gcloud 定义了一个注释来在负载平衡下设置这些,这似乎是有效的,我还设置了一个注释来为服务设置一个网络端点组。这是在部署和服务清单中的配置方式。

---
#api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert -f ./docker-compose.yml
    kompose.version: 1.21.0 ()
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: api
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert -f ./docker-compose.yml
        kompose.version: 1.21.0 ()
      creationTimestamp: null
      labels:
        io.kompose.service: api
    spec:
      containers:
      - args:
        - bash
        - -c
        - node src/server.js
        env:
        - name: NODE_ENV
          value: production
        - name: TZ
          value: America/New_York
        image: gcr.io/<PROJECT_ID>/api
        imagePullPolicy: Always
        name: api
        ports:
        - containerPort: 8087
        resources: {}
      restartPolicy: Always
      serviceAccountName: ""
status: {}

---
#api-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
    cloud.google.com/neg: '{"ingress": true}'
  creationTimestamp: null
  labels:
    io.kompose.service: api
  name: api
spec:
  type: LoadBalancer
  ports:
  - name: "8087"
    port: 8087
    targetPort: 8087
status:
  loadBalancer: {}


我想我可能在这里缺少某种配置,但我不确定。

我还看到我可以通过添加在 yaml 中定义 Liveness 检查的位置

livenessProbe:
      httpGet:
        path: /healthz
        port: 8080

我的入口也配置如下:

---
# master-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: master-application-ingress
  annotations:
    ingress.kubernetes.io/secure-backends: "true"
spec:
  rules:
  - http:
      paths:
      - path: /api
        backend:
          serviceName: api
          servicePort: 8087
  - http:
      paths:
      - path: /ui
        backend:
          serviceName: ui
          servicePort: 80

我已经看到它只需要端口,用于 TCP 检查,但我已经在我的应用程序和负载均衡器中定义了这些。我想我想知道我应该在哪里定义这些检查。

另外,我有一个由注释创建的 NEG 为空的问题,或者这对于清单创建的 NEG 是否正常?

4

2 回答 2

1

运行状况检查是根据您的readinessProbe创建的,而不是 livenessProbe。在创建入口资源之前,请确保在您的 pod 规范中配置了 readinessProbe。

对于空 NEG,这可能是由于 Health Check 不匹配造成的。NEG 将依赖就绪门功能(在此处解释),因为您只定义了 livenessProbe,因此完全有可能健康检查配置错误并因此失败。

您还应该为您创建的内部 LB 提供一个内部 IP,您可以这样访问 Pod 吗?如果两者都失败,则健康检查可能是问题,因为 NEG 没有将 pod 添加到它认为未准备好的组中

于 2020-06-23T22:22:11.810 回答
0

现在您还可以创建BackendConfig一个单独的 Kubernetes 声明。我的例子:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: cms-backend-config
  namespace: prod
spec:
  healthCheck:
    checkIntervalSec: 60
    port: 80
    type: HTTP #case-sensitive
    requestPath: /your-healthcheck-path
  connectionDraining:
    drainingTimeoutSec: 60 

我根本没有明确定义任何就绪/活跃度探针,一切正常。我还注意到有时 GKE 和 GCP 的其余部分之间仍然存在故障。我记得在玩了很长一段时间后,我需要从头开始重新创建我的部署和入口。
我也做了什么,这可能是我开始在自动注册的 NEG 中看到端点的主要原因,添加了一个默认后端到入口,以便没有向负载均衡器注册单独的默认值:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: prod-ingress
  namespace: prod
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: load-balancer-ip
    networking.gke.io/managed-certificates: my-certificate
spec:
  backend:
    serviceName: my-service
    servicePort: 80
  rules:
    - host: "example.com"
      http:
        paths:
          - path: /
            backend:
              serviceName: my-service
              servicePort: 80
于 2020-12-06T20:56:27.607 回答