Kubernetes pod start up



我有两个pod在运行。它们是;

  1. 邮件服务吊舱
  2. redis吊舱

在创建邮件服务pod之前,我需要确保redis服务器(通过redis pod(已启动并运行,因为它依赖于redis pod。

我是kubernetes的新手,想知道实现此检查的最佳方法是什么。

干杯

我是kubernetes的新手,想知道实现这种检查的最佳方法是什么

Kubernetes是一个分布式环境,实例会发生变化,例如在新版本的应用程序上部署地址。

重要的是,您的应用程序是reclient,例如,由于网络问题,并且如果连接失败,应用程序应正确重试。

当您的应用程序正确处理了客户端连接时,应用程序的启动顺序不再是问题。

所以我认为最好的方法是通过initContainer

因此,让我举一个人为的例子。我想在redis启动之前启动任何名为some-app-that-uses-redis的应用程序,该应用程序在我的示例中使用alpine

我会使用一个带有initContainer的pod来做一点检查,看看redis是否已经启动并运行:

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: some-app-that-uses-redis
name: some-app-that-uses-redis
spec:
initContainers:
- name: wait-for-redis
image: goodsmileduck/redis-cli
imagePullPolicy: IfNotPresent
args: [ 'sh', '-c', 'until redis-cli  -h redis-service.default.svc.cluster.local -p 6379  get hello; do echo "Sleeping a bit"; sleep 1; done; echo "ready!"; ' ]
containers:
- args:
- sleep
- "1000"
image: alpine
name: some-app-that-uses-redis
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

检查的重点是下面的部分,它只是一个for循环,它对redis应该工作的服务执行redis查询。

initContainers:
- name: wait-for-redis
image: goodsmileduck/redis-cli
imagePullPolicy: IfNotPresent
args: [ 'sh', '-c', 'until redis-cli  -h redis-service.default.svc.cluster.local -p 6379  get hello; do echo "Sleeping a bit"; sleep 1; done; echo "ready!"; ' ]

然后我会确保redis是服务的一部分,这样这个测试就永远是真的:

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: redis
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: redis
spec:
containers:
- image: redis:5.0.9
name: redis
resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: redis
name: redis-service
spec:
ports:
- port: 6379
protocol: TCP
targetPort: 6379
selector:
app: redis
type: NodePort
status:
loadBalancer: {}

如果我理解正确的话,无论如何,pod应该只通过服务与其他pod通信。

最新更新