准备就绪探测器不允许在pod未准备就绪时访问内部kubernetes服务

准备就绪探测器不允许在pod未准备就绪时访问内部kubernetes服务,kubernetes,hazelcast,readinessprobe,Kubernetes,Hazelcast,Readinessprobe,就绪探测将应用程序保持在非就绪状态。处于此状态时,应用程序无法连接到任何kubernetes服务 我的kubernetes集群的主节点和节点都使用Ubuntu18。(当我在集群中只使用master时,问题仍然存在,所以我不认为这是一个master节点类型的问题) 我用一个Spring应用程序建立了kubernetes集群,它使用hazelcast来管理缓存。因此,在使用readiness probe时,应用程序无法访问我创建的kubernetes服务,以便使用插件通过hazelcast连接应用程

就绪探测将应用程序保持在非就绪状态。处于此状态时,应用程序无法连接到任何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:

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