问题描述
在使用Helm Chart部署容器时,定义了容器的readinessProbe
,并在部署后通过浏览器访问了就绪探针的URL,得到了Healthy
的响应。但是,当用户使用kubectl describe pod
命令查看容器的详细信息时,发现容器的就绪探针URL与部署时设置的不同。此外,当用户在集群内部的容器IP地址上运行curl
命令时,没有返回任何文本。用户想知道这两者之间的区别是什么。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
容器的就绪探针是用于检查容器是否已准备好接收流量的一种机制。在Kubernetes中,就绪探针可以在容器级别或部署级别进行定义。下面将解释部署和容器级别就绪探针之间的关系以及它们的区别。
部署级别的就绪探针
部署级别的就绪探针是在Kubernetes部署对象中定义的。它是用于检查整个部署中所有容器是否已准备好接收流量的机制。部署级别的就绪探针可以通过以下方式定义:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
template:
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
httpGet:
path: /health/readiness
port: http
在上面的示例中,readinessProbe
被定义在部署对象的容器规范中。它使用httpGet
方法发送HTTP GET请求到指定的路径和端口,以检查容器是否已准备好接收流量。
容器级别的就绪探针
容器级别的就绪探针是在容器规范中定义的。它是用于检查单个容器是否已准备好接收流量的机制。容器级别的就绪探针可以通过以下方式定义:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
readinessProbe:
httpGet:
path: /app-health/my-service-name-is-shown-here/readyz
在上面的示例中,readinessProbe
被定义在Pod对象的容器规范中。它使用httpGet
方法发送HTTP GET请求到指定的路径,以检查容器是否已准备好接收流量。
部署级别和容器级别就绪探针的区别
部署级别的就绪探针是在部署对象中定义的,用于检查整个部署中所有容器的就绪状态。容器级别的就绪探针是在容器规范中定义的,用于检查单个容器的就绪状态。
在你的情况下,部署级别的就绪探针被正确地定义为发送HTTP GET请求到/health/readiness
路径,并返回Healthy
作为响应。但是,容器级别的就绪探针被错误地定义为发送HTTP GET请求到/app-health/my-service-name-is-shown-here/readyz
路径,并返回HTTP状态码作为响应。
因此,部署级别的就绪探针是你设置的就绪探针,而容器级别的就绪探针是由Kubernetes自动生成的默认就绪探针。
为了解决这个问题,你可以在部署对象中删除容器级别的就绪探针定义,只保留部署级别的就绪探针定义。这样,只有部署级别的就绪探针会生效,并且你将能够通过浏览器访问到正确的就绪探针URL并得到Healthy
的响应。
希望这个解释能帮助你理解部署级别和容器级别就绪探针之间的区别。如果你还有其他问题,请随时提问。