Kubernetes Pod启动

时间:2020-10-01 14:47:21

标签: kubernetes

我有2个吊舱正在运行。他们是

  1. mail-services-pod
  2. redis-pod

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

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

欢呼

2 个答案:

答案 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对话。