我试图在GCE中的Kubernetes(服务器1.6.4)中部署grafana实例。我使用以下清单:
部署(full version):
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 1
template:
metadata:
labels:
name: grafana
spec:
initContainers:
…
containers:
- name: grafana
image: grafana/grafana
readinessProbe:
httpGet:
path: /login
port: 3000
…
服务:
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
selector:
name: grafana
ports:
- protocol: TCP
port: 3000
type: NodePort
入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grafana
spec:
tls:
- secretName: grafana.example.com
backend:
serviceName: grafana
servicePort: 3000
事实证明,grafana在/
上提供了302,但默认的GCE入口健康检查预计在/
(source)上有200。如您所见,Deployment(第22行)中有一个自定义 readinessProbe 。
一旦我将这些资源发布到kube-apiserver,一切都会毫无错误地创建。具体来说, Ingress 获取公共IP4地址,但使用默认/
路径设置healtcheck,而不是readinessProbe
。因此,如果我curl
Ingress的公共ip4地址,我会得到502。
通过在GCE控制台中手动将探测路径更改为/login
,可以解决此问题。
答案 0 :(得分:9)
引自here:
GLBC要求您在Pod规范中定义端口(在您的情况下为3000)。
除了添加自定义ports
之外,解决方案是在readinessProbe
中声明用于运行状况检查的端口:
containers:
- name: grafana
readinessProbe:
httpGet:
path: /login
port: 3000
ports:
- name: grafana
containerPort: 3000
…
答案 1 :(得分:5)
您的问题并不十分清楚,但如果您使用的是GCE Load-Balancer Controller (GLBC) Cluster Addon
,则可以customize the health check path。
目前,所有服务后端都必须满足以下任一条件 要求传递从GCE发送给它的HTTP(S)运行状况检查 负载均衡器:
- 在
200
上回复'/'
。内容无关紧要。- 在支持服务的pod上公开任意URL作为准备探测。
Ingress控制器首先寻找兼容的就绪探测器, 如果找到一个,则将其作为GCE负载均衡器的HTTP(S)运行状况 校验。如果没有准备就绪探针,或准备探针需要 特殊的HTTP标头,Ingress控制器指向GCE loadbalancer在'/'处的HTTP运行状况检查。 This is an example Ingress采用来自端点的准备探测作为其 健康检查。
GLBC插件页面在 Limitations section 中提到了这一点:
所有Kubernetes服务必须在
200
上提供'/'
页面,或其他任何内容 您通过GLBC--health-check-path
指定的自定义价值 参数。
如果您没有使用该插件,目前Kubernetes确实要求您200
GET
/
个HTTP
200
路径请求,以便成功进行健康检查,否则后端将无法获得任何流量
在bug中有一些关于此问题的背景知识。
如果您使用的是Google容器引擎(GKE),则健康检查的默认Kubernetes要求为apply there too。
通过Ingress公开的服务必须为
GET
路径上的/
请求提供HTTP 200
状态的响应。这用于健康 检查。如果您的应用程序未在/
上投放/
,那么 后端将被标记为不健康,不会获得流量。
如上所述,正如您(@mmoya)在您的回答中指出的那样,将用于准备探测的相同端口添加为pod中的一个端口可以解决您的案例问题,因为端口本身是否则不要暴露在吊舱外面。这导致Kubernetes依赖于p
的健康检查。
答案 2 :(得分:0)
对 Ingress 创建进行推断健康检查的条件是
<块引用>一个 Ingress backend.servicePort 引用一个 Service 端口,匹配一个 Pods spec.containers[].readinessProbe.httpGet.port,Service 的 targetPort 引用服务 Pod 的容器[].spec.ports.containerPort。
在 2020 年年中,GKE 引入了注释和自定义资源定义 BackendConfig
以明确配置运行状况检查,请参阅 concepts/ingress#health_checks。
警告:如果您再次更改 readinessProbe,则在推断的运行状况检查中 GKE 不会保持就绪探测和运行状况检查同步。它只会在 Ingress(重新)创建时再次推断。
要直接编辑外部负载均衡器运行状况检查(对于自定义 http 路径),请使用
gcloud compute backend-services list
gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
gcloud compute health-checks describe
gcloud compute health-checks update http BACKEND_SERVICE_NAME --request-path=/api/health