准备就绪探测器不允许在pod未准备就绪时访问内部kubernetes服务
就绪探测将应用程序保持在非就绪状态。处于此状态时,应用程序无法连接到任何kubernetes服务 我的kubernetes集群的主节点和节点都使用Ubuntu18。(当我在集群中只使用master时,问题仍然存在,所以我不认为这是一个master节点类型的问题) 我用一个Spring应用程序建立了kubernetes集群,它使用hazelcast来管理缓存。因此,在使用readiness probe时,应用程序无法访问我创建的kubernetes服务,以便使用插件通过hazelcast连接应用程序 当我取出就绪探测器时,应用程序会尽快连接到创建hazelcast集群的服务,并且一切正常 readiness probe将连接到rest api,其唯一响应是200代码。然而,当应用程序正在上升时,在进程的中间,它将启动HAZELCAST集群,因此,它将尝试连接KubNeNeS HAZELCAST服务,将应用程序的缓存与其他POD连接,而准备好的探针尚未被清除,并且POD由于探针而处于非就绪状态。此时,应用程序将无法连接到kubernetes服务,并且由于我添加的配置,它将失败或卡住 service.yaml:准备就绪探测器不允许在pod未准备就绪时访问内部kubernetes服务,kubernetes,hazelcast,readinessprobe,Kubernetes,Hazelcast,Readinessprobe,就绪探测将应用程序保持在非就绪状态。处于此状态时,应用程序无法连接到任何kubernetes服务 我的kubernetes集群的主节点和节点都使用Ubuntu18。(当我在集群中只使用master时,问题仍然存在,所以我不认为这是一个master节点类型的问题) 我用一个Spring应用程序建立了kubernetes集群,它使用hazelcast来管理缓存。因此,在使用readiness probe时,应用程序无法访问我创建的kubernetes服务,以便使用插件通过hazelcast连接应用程
apiVersion: v1
kind: Service
metadata:
name: my-app-cluster-hazelcast
spec:
selector:
app: my-app
ports:
- name: hazelcast
port: 5701
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app-deployment
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 2
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
terminationGracePeriodSeconds: 180
containers:
- name: my-app
image: my-repo:5000/my-app-container
imagePullPolicy: Always
ports:
- containerPort: 5701
- containerPort: 9080
readinessProbe:
httpGet:
path: /app/api/excluded/sample
port: 9080
initialDelaySeconds: 120
periodSeconds: 15
securityContext:
capabilities:
add:
- SYS_ADMIN
env:
- name: container
value: docker
hazelcast.xml:
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.11.xsd"
xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<properties>
<property name="hazelcast.jmx">false</property>
<property name="hazelcast.logging.type">slf4j</property>
</properties>
<network>
<port auto-increment="false">5701</port>
<outbound-ports>
<ports>49000,49001,49002,49003</ports>
</outbound-ports>
<join>
<multicast enabled="false"/>
<kubernetes enabled="true">
<namespace>default</namespace>
<service-name>my-app-cluster-hazelcast</service-name>
</kubernetes>
</join>
</network>
</hazelcast>
$kubectl获得部署
NAME READY UP-TO-DATE AVAILABLE AGE
my-app-deployment 2/2 2 2 2m27s
NAME READY UP-TO-DATE AVAILABLE AGE
my-app-deployment 0/2 2 0 45m
实际结果:
该服务未获取任何终结点
$kubectl描述服务我的应用程序群集hazelcast
Name: my-app-cluster-hazelcast
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"my-app-cluster-hazelcast","namespace":"default"},"spec":{"ports...
Selector: app=my-app
Type: ClusterIP
IP: 10.244.28.132
Port: hazelcast 5701/TCP
TargetPort: 5701/TCP
Endpoints: 10.244.4.10:5701,10.244.4.9:5701
Session Affinity: None
Events: <none>
Name: my-app-cluster-hazelcast
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"my-app-cluster-hazelcast","namespace":"default"},"spec":{"ports...
Selector: app=my-app
Type: ClusterIP
IP: 10.244.28.132
Port: hazelcast 5701/TCP
TargetPort: 5701/TCP
Endpoints:
Session Affinity: None
Events: <none>
$kubectl获得部署
NAME READY UP-TO-DATE AVAILABLE AGE
my-app-deployment 2/2 2 2 2m27s
NAME READY UP-TO-DATE AVAILABLE AGE
my-app-deployment 0/2 2 0 45m
在你的服务中,你有
spec:
selector:
app: my-app
但在部署yaml中,标签值是不同的
metadata:
name: my-app-deployment
labels:
app: my-app-deployment
有什么原因吗?我只是想澄清一下:
如所述,参考:
kubelet使用就绪探测来了解容器何时准备好开始接受流量。当一个吊舱的所有容器都准备好时,它就被认为准备好了。此信号的一个用途是控制哪些POD用作服务的后端当Pod未准备就绪时,它将从服务负载平衡器中移除
服务将使用选择器知道它应该连接到哪个pod。部署必须使用元数据名称,标签将用于其他目的。服务不是指向部署,而是指向kubernetes hazelcast文档中所示的吊舱。如果您的探测器不工作,请尝试找出原因。如果响应时间超过1秒或任何其他原因,则可能是超时。@请按预期执行,因为应用程序尚未启动。为了让应用程序运行,hazelcast必须工作,但由于就绪探测器知道应用程序没有启动,因此应用程序似乎没有连接到内部hazelcast kubernetes群集,并且由于hazelcast不工作,应用程序永远不会启动,最终陷入死锁。我想问题是,为什么我不能在就绪探测尚未清除时连接到kubernetes服务?如果就绪探测不正常,服务将连接到哪里?(因为集群中没有运行您的应用程序的实例?我在文档中读到就绪探测阻止了对pod的所有访问,因此即使pod尝试连接到服务,服务也不会连接到任何东西,因为就绪探测正常工作。基本上,这就是结论,这是我的误用和误解ding的Ready probe解决了这个问题。现在事情已经非常清楚了;但是,我必须找到一种方法来解决我的问题,我的应用程序试图确保hazelcast和应用程序本身正常运行。这可能会很有帮助@CristianCordova。你有没有找到一种方法来克服客户需要的问题o连接到成员,即使创建hazelcast集群的吊舱还没有准备好?干杯,伙计。@JoãoDiasAmaro我设法解决了我的问题。通过创建一个没有准备就绪探测器的部署。然后,添加准备就绪探测器并再次部署。这样,kubernetes将等待新吊舱准备就绪,然后杀死旧吊舱。除非您有不同的用例,否则您可能希望开始一个新问题,并将其链接到评论中,以便我们可以帮助您。
metadata:
name: my-app-deployment
labels:
app: my-app-deployment