我试图在GCE中的Kubernetes(服务器1.6.4)中部署一个grafana实例。我正在使用以下清单:
部署(完整版本):
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安检为200(来源)。如您所见,部署中有一个自定义readinessProbe(第22行)。
一旦我将这些资源发布到kube apiserver,就会创建出所有内容,不会出错。具体来说,入口获得公共ip4地址,但healtcheck使用默认路径设置,而不是在readinessProbe中配置的自定义路径。因此,如果入口的公共ip4地址为curl,则得到502。
通过在GCE控制台中手动将探测路径更改为登录,可以解决此问题。
创建入口时进行推断健康检查的条件如下
入口backend.service端口引用服务端口,匹配Podsspec.containers[]. readinessProbe.httpGet.port,服务的目标端口引用服务Pod的容器[]。spec.ports.container端口。
2020年年中,GKE引入了注释和自定义资源定义BackendConfig
来显式配置健康检查,请参阅概念/入口#health_checks。
警告:如果您再次更改readinessProbe,那么在推断的healthchecks上,GKE不会保持readiness probe和health check同步。只有在入口(重新)创建时才会再次推断。
要直接编辑外部Loadbalancers healthchecks(针对自定义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
您的问题不太清楚,但如果您使用的是GCE Load Balancer Controller(GLBC)群集插件,则可以自定义运行状况检查路径。
当前,所有服务后端必须满足以下任一要求,才能通过GCE loadbalancer发送给它的HTTP(S)健康检查:
入口控制器首先寻找兼容的就绪探测,如果找到一个,它会将其用作GCE负载均衡器的HTTP(S)健康检查。如果没有就绪探测,或者就绪探测需要特殊的HTTP标头,则入口控制器会将GCE负载均衡器的HTTP健康检查指向“/”。这是一个采用来自endpoint的就绪探测作为健康检查的入口示例。
GLBC加载项页面在限制部分提到了这一点:
所有Kubernetes服务都必须服务于'/'上的
200页,或通过GLBC的
--运行状况检查路径
参数指定的任何自定义值。
如果您没有使用加载项,目前Kubernetes确实要求您在路径上为获取请求提供200个服务,以成功进行健康检查,否则后端将不会获得任何流量。
在这个错误中有一些关于这个的背景。
如果您使用的是Google容器引擎(GKE),那么同样的默认Kubernetes健康检查要求也适用于此。
通过入口公开的服务必须以HTTP 200状态响应路径上的GET请求。这用于健康检查。如果您的应用程序未在上提供HTTP 200,则后端将被标记为不健康,并且不会获得流量。
说到这里,正如您(@mmoya)在回答中指出的那样,添加用于就绪探测的同一端口作为pod中的一个端口可以解决您的问题,因为该端口本身不会暴露在pod之外。这导致Kubernetes转而依赖于来自的健康检查。
此处引用:
GLBC要求您在Pod规范中定义端口(在您的情况下为3000)。
解决方案是除了添加自定义readinessProbe
之外,还要在port
中声明用于健康检查的端口:
containers:
- name: grafana
readinessProbe:
httpGet:
path: /login
port: 3000
ports:
- name: grafana
containerPort: 3000
…
试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv
是否可以在没有负载均衡器的情况下在库伯内特斯中使用入口控制器功能(在数字海洋中)。 是否有其他机制允许域名映射到Kubernetes服务;例如,如果我在Kubernetes集群上托管两个WordPress站点: == 域名如何在不显式输入端口号的情况下映射到容器端口8080。 感谢任何帮助。
我正在寻找一种在创建类型为loadbalancer的k8s服务后设置服务/状态/负载平衡/入口ip的方法(如下一个链接的“类型loadbalancer”部分所示https://kubernetes.io/docs/concepts/services-networking/service/ ). 我的问题与以下链接中描述的问题类似(是否可以在监视服务时更新kubernetes服务的“外部IP”)但找
我有一个build.gradle文件,比如: 当我使用STS Gradle插件将项目导入Eclipse时,只有compile conf依赖项显示在“Gradle dependencies”类路径容器下。 是否也有可能让提供的conf被STS插件拉入?
我有关于kubernetes入口的问题。 我想将入口与我的亚马逊帐户和/或私有云一起使用,并想分配外部IP。 可以为“服务:服务文档-外部ip”章节分配外部ip,但找不到为入口:入口文档分配外部ip的方法。 我的问题是直接针对库伯内特斯团队的。Simon在这个主题中也提出了类似的问题:如何在GKE 2上强制库伯内特斯入口使用SSL,但当我对私有云AWS感兴趣时,他问了GKE。 提前谢谢你。 [更新
我正在DigitalOcean上使用CoreOs和库伯内特斯构建一个容器集群,我已经看到,为了向世界公开Pod,您必须使用Type: LoadBalancer创建一个服务。我认为这是最佳解决方案,因此您不需要在nginx或haagent等kubernetes之外添加外部负载均衡器。我想知道是否可以使用DO的浮动IP创建它。