Kubernetes吊舱启动

Kubernetes吊舱启动,kubernetes,Kubernetes,我有两个吊舱在运行。他们是 邮件服务吊舱 redis吊舱 我需要确保redis服务器(通过redispod)在创建邮件服务pod之前已经启动并运行,因为它依赖于redispod 我是kubernetes的新手,想知道实施此检查的最佳方法是什么 干杯 我是kubernetes的新手,想知道实施此检查的最佳方法是什么 Kubernetes是一个分布式环境,实例将发生变化,例如在新版本应用程序上部署时的地址 重要的是,您的应用程序可接收,例如网络问题,并且如果连接失败,您的应用程序应正确重试 当应用程

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

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

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

    干杯

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

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

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

    当应用程序正确处理Reclient连接时,应用程序的启动顺序不再是问题

    我是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因素应用程序那样添加重试逻辑。但从最初的问题来看,我并不清楚。至于节点故障,这不是可以通过有状态集之类的方法来补救的吗?