Kubernetes 在 Service/Deployment 级别检查 readinessProbe

Kubernetes check readinessProbe at Service/Deployment level

有没有办法通过使用链接到部署的服务名称来请求 readinessProbe 的状态?例如在 initContainer 中 ?

假设我们有一个部署 X,使用 readinessProbe,一个链接到它的服务,这样我们就可以请求 http://service-X:8080。 现在我们创建一个部署 Y,在 initContainer 中我们想知道部署 X 是否准备就绪。有没有办法问 deployment-X.readyservice-X.ready 之类的问题?

我知道处理依赖关系的正确方法是让 kubernetes 为我们做这件事,但我有一个不会崩溃的容器,我也没有动手...

您可以在部署 Y 上添加 nginx 代理边车。 将 deploymentY.initContainer.readynessProbe 设置为 nginx 上的一个端口,该端口被代理到 deploymentY.readynessProbe

您可以只使用 InitContainer.

而不是 readinessProbe

您创建一个 pod/deployment X,创建服务 X,并创建一个正在搜索服务 X 的 initContainer。

If he find it -> he will make the pod.

If he won't find it -> he will keep looking until service X will be created.

举个简单的例子,我们用kubectl apply -f nginx.yaml创建nginx deployment

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

然后我们创建initContainer

initContainer.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup my-nginx; do echo waiting for myapp-pod2; sleep 2; done;']

initContainer 将寻找服务 my-nginx,直到您创建它,它将处于 Init:0/1 状态。

NAME                        READY   STATUS     RESTARTS   AGE
myapp-pod                   0/1     Init:0/1   0          15m

你添加服务后,例如使用kubectl expose deployment/my-nginx,initContainer会找到my-nginx服务,他会被创建。

NAME                        READY   STATUS     RESTARTS   AGE
myapp-pod                   1/1     Running    0          35m

结果:

Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/myapp-pod to kubeadm2
  Normal  Pulled     20s        kubelet, kubeadm2  Container image "busybox:1.28" already present on machine
  Normal  Created    20s        kubelet, kubeadm2  Created container init-myservice
  Normal  Started    20s        kubelet, kubeadm2  Started container init-myservice
  Normal  Pulled     20s        kubelet, kubeadm2  Container image "busybox:1.28" already present on machine
  Normal  Created    20s        kubelet, kubeadm2  Created container myapp-container
  Normal  Started    20s        kubelet, kubeadm2  Started container myapp-container

如果这回答了您的问题,请告诉我。

我最终通过以下 link 找到了解决方案: https://blog.giantswarm.io/wait-for-it-using-readiness-probes-for-service-dependencies-in-kubernetes/

我们首先需要在 Kubernetes 中创建一个 ServiceAccount,以允许从 initContainer 中列出端点。在此之后,我们询问可用的端点,如果至少有一个,则依赖项已准备就绪(在我的例子中)。