我有2个吊舱正在运行。他们是
在创建mail-services-pod之前,我需要确保redis服务器(通过redis-pod)已启动并正在运行,因为它依赖于redis-pod。
我是kubernetes的新手,想知道实现此检查的最佳方法是什么。
欢呼
答案 0 :(得分:2)
我是kubernetes的新手,想知道实现此检查的最佳方法是什么
Kubernetes是一个分布式环境,实例将发生变化,例如解决您的新版本应用上的部署问题。
重要的是,您的应用应保持适应性,例如网络问题,如果连接失败,您的应用程序会正确重试。
当您的应用正确处理了简化连接后,应用的启动顺序将不再是问题。
答案 1 :(得分:0)
所以我认为可以做到的最好方法是通过initContainer
所以让我用一个人为的例子。我想启动任何名为some-app-that-uses-redis
的应用,在我的示例中使用alpine
,然后再开始Redis。
我将使用带有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对话。