Kubernetes吊舱启动
我有两个吊舱在运行。他们是Kubernetes吊舱启动,kubernetes,Kubernetes,我有两个吊舱在运行。他们是 邮件服务吊舱 redis吊舱 我需要确保redis服务器(通过redispod)在创建邮件服务pod之前已经启动并运行,因为它依赖于redispod 我是kubernetes的新手,想知道实施此检查的最佳方法是什么 干杯 我是kubernetes的新手,想知道实施此检查的最佳方法是什么 Kubernetes是一个分布式环境,实例将发生变化,例如在新版本应用程序上部署时的地址 重要的是,您的应用程序可接收,例如网络问题,并且如果连接失败,您的应用程序应正确重试 当应用程
当应用程序正确处理Reclient连接时,应用程序的启动顺序不再是问题。因此,我认为最好的方法是通过 让我举一个人为的例子。我想在redis启动之前启动任何名为
的应用程序,该应用程序使用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对话。所以我认为最好的方法是通过 让我举一个人为的例子。我想在redis启动之前启动任何名为
的应用程序,该应用程序使用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对话。如果redis不可用,邮件服务pod应该表现得优雅。设计kubernetes服务需要一种期待失败的心态。如果redis不可用,邮件服务盒应该表现得优雅。设计kubernetes服务需要一种预期失败的心态。如果Redis pod(或其节点)在容器启动后失败,会发生什么?如果他们自己制作了应用程序,那么我同意他们应该像一个好的12因素应用程序那样添加重试逻辑。但从最初的问题来看,我并不清楚。至于节点故障,这不是可以通过有状态集之类的东西来补救的吗?如果Redis pod(或其节点)在容器启动后出现故障会发生什么?如果他们自己制作了应用程序,那么我同意他们应该像一个好的12因素应用程序那样添加重试逻辑。但从最初的问题来看,我并不清楚。至于节点故障,这不是可以通过有状态集之类的方法来补救的吗?