Kubernetes 在 Service/Deployment 级别检查 readinessProbe
Kubernetes check readinessProbe at Service/Deployment level
有没有办法通过使用链接到部署的服务名称来请求 readinessProbe 的状态?例如在 initContainer 中 ?
假设我们有一个部署 X,使用 readinessProbe,一个链接到它的服务,这样我们就可以请求 http://service-X:8080
。
现在我们创建一个部署 Y,在 initContainer 中我们想知道部署 X 是否准备就绪。有没有办法问 deployment-X.ready
或 service-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 中列出端点。在此之后,我们询问可用的端点,如果至少有一个,则依赖项已准备就绪(在我的例子中)。
有没有办法通过使用链接到部署的服务名称来请求 readinessProbe 的状态?例如在 initContainer 中 ?
假设我们有一个部署 X,使用 readinessProbe,一个链接到它的服务,这样我们就可以请求 http://service-X:8080
。
现在我们创建一个部署 Y,在 initContainer 中我们想知道部署 X 是否准备就绪。有没有办法问 deployment-X.ready
或 service-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 中列出端点。在此之后,我们询问可用的端点,如果至少有一个,则依赖项已准备就绪(在我的例子中)。