GCP GKE 入口健康检查
GCP GKE Ingress Health Checks
我在 GKE 中使用 Deployment Manager 部署和服务 运行。关于我的服务的一切工作正常,除了我正在创建的入口报告服务处于永久不健康状态。
需要说明的是,除运行状况检查(以及因此的入口)外,有关部署的所有内容均有效。这在以前是有效的(大约在 2019 年末),显然大约一年前 GKE 为入口目标服务的健康检查添加了一些额外的要求,但我一直无法理解它们。
我已经对服务进行了明确的健康检查,它报告健康,但入口无法识别它。该服务使用 NodePort,但在部署时也打开了 containerPort 80,并且它确实以 HTTP 200 响应本地 :80 上的请求,但显然这对部署的服务没有帮助。
集群本身是 Deployment Manager example
的几乎完全相同的副本
部署如下:
- name: {{ DEPLOYMENT }}
type: {{ CLUSTER_TYPE }}:{{ DEPLOYMENT_COLLECTION }}
metadata:
dependsOn:
- {{ properties['clusterType'] }}
properties:
apiVersion: apps/v1
kind: Deployment
namespace: {{ properties['namespace'] | default('default') }}
metadata:
name: {{ DEPLOYMENT }}
labels:
app: {{ APP }}
tier: resters
spec:
replicas: 1
selector:
matchLabels:
app: {{ APP }}
tier: resters
template:
metadata:
labels:
app: {{ APP }}
tier: resters
spec:
containers:
- name: rester
image: {{ IMAGE }}
resources:
requests:
cpu: 100m
memory: 250Mi
ports:
- containerPort: 80
env:
- name: GCP_PROJECT
value: {{ PROJECT }}
- name: SERVICE_NAME
value: {{ APP }}
- name: MODE
value: rest
- name: REDIS_ADDR
value: {{ properties['memorystoreAddr'] }}
...服务:
- name: {{ SERVICE }}
type: {{ CLUSTER_TYPE }}:{{ SERVICE_COLLECTION }}
metadata:
dependsOn:
- {{ properties['clusterType'] }}
- {{ APP }}-cluster-nodeport-firewall-rule
- {{ DEPLOYMENT }}
properties:
apiVersion: v1
kind: Service
namespace: {{ properties['namespace'] | default('default') }}
metadata:
name: {{ SERVICE }}
labels:
app: {{ APP }}
tier: resters
spec:
type: NodePort
ports:
- nodePort: {{ NODE_PORT }}
port: {{ CONTAINER_PORT }}
targetPort: {{ CONTAINER_PORT }}
protocol: TCP
selector:
app: {{ APP }}
tier: resters
...显式健康检查:
- name: {{ SERVICE }}-healthcheck
type: compute.v1.healthCheck
metadata:
dependsOn:
- {{ SERVICE }}
properties:
name: {{ SERVICE }}-healthcheck
type: HTTP
httpHealthCheck:
port: {{ NODE_PORT }}
requestPath: /healthz
proxyHeader: NONE
checkIntervalSec: 10
healthyThreshold: 2
unhealthyThreshold: 3
timeoutSec: 5
...防火墙规则:
- name: {{ CLUSTER_NAME }}-nodeport-firewall-rule
type: compute.v1.firewall
properties:
name: {{ CLUSTER_NAME }}-nodeport-firewall-rule
network: projects/{{ PROJECT }}/global/networks/default
sourceRanges:
- 130.211.0.0/22
- 35.191.0.0/16
targetTags:
- {{ CLUSTER_NAME }}-node
allowed:
- IPProtocol: TCP
ports:
- 30000-32767
- 80
您可以尝试在 Deployment 中的容器上定义 readinessProbe
。
这也是入口用于创建健康检查的指标(请注意,这些健康检查探测来自 GKE 外部)
根据我的经验,这些就绪性探测可以很好地让入口运行状况检查正常工作,
为此,您创建这样的东西,这是一个 TCP 探测器,我发现 TCP 探测器的性能更好。
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 10
所以这个探测将检查端口:80,这是我看到的这个服务中的 pod 使用的端口,这也有助于配置入口健康检查以获得更好的结果。
这里有一些helpful documentation关于如何创建入口运行状况检查所基于的 TCP 就绪探测。
我在 GKE 中使用 Deployment Manager 部署和服务 运行。关于我的服务的一切工作正常,除了我正在创建的入口报告服务处于永久不健康状态。
需要说明的是,除运行状况检查(以及因此的入口)外,有关部署的所有内容均有效。这在以前是有效的(大约在 2019 年末),显然大约一年前 GKE 为入口目标服务的健康检查添加了一些额外的要求,但我一直无法理解它们。
我已经对服务进行了明确的健康检查,它报告健康,但入口无法识别它。该服务使用 NodePort,但在部署时也打开了 containerPort 80,并且它确实以 HTTP 200 响应本地 :80 上的请求,但显然这对部署的服务没有帮助。
集群本身是 Deployment Manager example
的几乎完全相同的副本部署如下:
- name: {{ DEPLOYMENT }}
type: {{ CLUSTER_TYPE }}:{{ DEPLOYMENT_COLLECTION }}
metadata:
dependsOn:
- {{ properties['clusterType'] }}
properties:
apiVersion: apps/v1
kind: Deployment
namespace: {{ properties['namespace'] | default('default') }}
metadata:
name: {{ DEPLOYMENT }}
labels:
app: {{ APP }}
tier: resters
spec:
replicas: 1
selector:
matchLabels:
app: {{ APP }}
tier: resters
template:
metadata:
labels:
app: {{ APP }}
tier: resters
spec:
containers:
- name: rester
image: {{ IMAGE }}
resources:
requests:
cpu: 100m
memory: 250Mi
ports:
- containerPort: 80
env:
- name: GCP_PROJECT
value: {{ PROJECT }}
- name: SERVICE_NAME
value: {{ APP }}
- name: MODE
value: rest
- name: REDIS_ADDR
value: {{ properties['memorystoreAddr'] }}
...服务:
- name: {{ SERVICE }}
type: {{ CLUSTER_TYPE }}:{{ SERVICE_COLLECTION }}
metadata:
dependsOn:
- {{ properties['clusterType'] }}
- {{ APP }}-cluster-nodeport-firewall-rule
- {{ DEPLOYMENT }}
properties:
apiVersion: v1
kind: Service
namespace: {{ properties['namespace'] | default('default') }}
metadata:
name: {{ SERVICE }}
labels:
app: {{ APP }}
tier: resters
spec:
type: NodePort
ports:
- nodePort: {{ NODE_PORT }}
port: {{ CONTAINER_PORT }}
targetPort: {{ CONTAINER_PORT }}
protocol: TCP
selector:
app: {{ APP }}
tier: resters
...显式健康检查:
- name: {{ SERVICE }}-healthcheck
type: compute.v1.healthCheck
metadata:
dependsOn:
- {{ SERVICE }}
properties:
name: {{ SERVICE }}-healthcheck
type: HTTP
httpHealthCheck:
port: {{ NODE_PORT }}
requestPath: /healthz
proxyHeader: NONE
checkIntervalSec: 10
healthyThreshold: 2
unhealthyThreshold: 3
timeoutSec: 5
...防火墙规则:
- name: {{ CLUSTER_NAME }}-nodeport-firewall-rule
type: compute.v1.firewall
properties:
name: {{ CLUSTER_NAME }}-nodeport-firewall-rule
network: projects/{{ PROJECT }}/global/networks/default
sourceRanges:
- 130.211.0.0/22
- 35.191.0.0/16
targetTags:
- {{ CLUSTER_NAME }}-node
allowed:
- IPProtocol: TCP
ports:
- 30000-32767
- 80
您可以尝试在 Deployment 中的容器上定义 readinessProbe
。
这也是入口用于创建健康检查的指标(请注意,这些健康检查探测来自 GKE 外部)
根据我的经验,这些就绪性探测可以很好地让入口运行状况检查正常工作,
为此,您创建这样的东西,这是一个 TCP 探测器,我发现 TCP 探测器的性能更好。
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 10
所以这个探测将检查端口:80,这是我看到的这个服务中的 pod 使用的端口,这也有助于配置入口健康检查以获得更好的结果。
这里有一些helpful documentation关于如何创建入口运行状况检查所基于的 TCP 就绪探测。