有没有像Swarm';Kubernetes的任务槽?

有没有像Swarm';Kubernetes的任务槽?,kubernetes,docker-swarm,Kubernetes,Docker Swarm,我正致力于在Docker Swarm和Kubernetes上运行一个现有的应用程序,该应用程序由一堆无状态、可伸缩的微服务(当然还有一些有状态的服务作为后端)组成。更改应用程序的代码基本上是不可能的,因此我必须使我们现有的一些机制,例如服务发现,在Swarm和K8s环境中工作 Docker Swarm的“service create”命令()的模板功能对我在使用Docker Swarm时起到了很大的帮助,我可以在其中执行以下操作 -e my_env_var=foo{{.Task.Slot}}

我正致力于在Docker Swarm和Kubernetes上运行一个现有的应用程序,该应用程序由一堆无状态、可伸缩的微服务(当然还有一些有状态的服务作为后端)组成。更改应用程序的代码基本上是不可能的,因此我必须使我们现有的一些机制,例如服务发现,在Swarm和K8s环境中工作

Docker Swarm的“service create”命令()的模板功能对我在使用Docker Swarm时起到了很大的帮助,我可以在其中执行以下操作

-e my_env_var=foo{{.Task.Slot}}
在作为我的Swarm服务一部分的每个容器中,这将把env var my_env_var设置为fooX形式的值,其中“X”是容器的“槽号”。 要掌握时隙号是什么,考虑具有n个实例的服务(即,规模=n)。每个容器占用一个插槽,插槽编号从1到N

这样,我可以在我的容器中获得一个ID,该ID在我服务的所有当前活动容器中是唯一的,但同时,它不是完全随机的。如果我将服务从1扩展到5,则服务中的五个容器将获得插槽1、2、3、4和5。 如果我将其缩小到,例如,3,两个容器将停止(例如,2和4,留下1、3和5)。但如果我再将其放大到5,插槽数量(通常)将再次是1到5(即使是2-6,也比完全随机要好)

事实证明,这对于Swarm启用我的应用程序非常有用,我非常希望在K8s中找到类似的东西(特别是在K8s部署的环境中,我正在使用K8s部署我们的无状态微服务,因为它们似乎是最合适的K8s概念)。 我发现有可能将pod名称传递到容器中

    env:
    - name: metadata_name
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
唉,容器的名称是 a) 相当长 b) 随机(即,向下和向上缩放不会重用名称), e、 g.名为foo部署的部署的pod将命名为

-e my_env_var=foo{{.Task.Slot}}
foo-deployment-64db944b84-bwrxx

foo-deployment-64db944b84-5jf7c

等等。 据我所知,K8s保证最后五个字符在部署的所有活动吊舱中都是唯一的,但它们在上下扩展时不会被重用(很少发生冲突)

是否存在与Swarm的“槽”概念相对应的机制

问候
Palatinaj晚了11个月,但解决方案如下:

要在K8S中获得稳定的容器(pod)名称,必须使用
StatefulSet
StatefulSets
是为必须维护状态的应用程序而设计的,但是,如果您不使用K8S卷作为状态(使其保持短暂),则可以使用
StatefulSets
而不会出现问题。有一个简单的过程可以将
部署
转换为
状态集

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myStatefulSetName
  labels:
    app: SomeLabel1
    label2: SomeLabel2
spec:
  replicas: 100
  selector:
    matchLabels:
        app: SomeLabel1
        label2: SomeLabel2
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: SomeLabel1
        label2: SomeLabel2
    spec:
      containers:
      - name: myPodName
        image: myPod:latest
        imagePullPolicy: Always
        ports:
        - name: myPodPort
          containerPort: 8080
  • 将您的
    APIsversion:
    更改为
    apps/v1
  • 种类:
    更改为
    StatefulSet
  • spec:
    下添加
    选择器:
    标记。此标记将包含用于选择适当服务的所有内容此外您必须确保在
    spec:template:metadata:labels
    下的所有项目与
    spec:selector:matchLabels
    下的项目相匹配(在提供的示例中,这将更有意义)
  • 如果您有任何类型的更新策略,在
    部署
    中称为
    策略
    ,请将其更改为
    更新策略
    。作为将来的参考,如果您不更新此内容,您将在K8S试图满足
    策略
    和您的
    状态集
    要求时部署
    状态集
    复制集
    应用这些更改后,您将部署您的
    StatefulSet
    。我们如何从中获得任务槽?主机名

    由于K8S保持稳定的pod名称,因此您将拥有以下名称:

    pod/mypod-0                             1/1     Running   0          10m
    pod/mypod-1                             1/1     Running   0          9m
    
    运行
    kubetctl
    时。在那之后,只需从你的豆荚名称中解析数字

    以下是
    状态集的YAML

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: myStatefulSetName
      labels:
        app: SomeLabel1
        label2: SomeLabel2
    spec:
      replicas: 100
      selector:
        matchLabels:
            app: SomeLabel1
            label2: SomeLabel2
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: SomeLabel1
            label2: SomeLabel2
        spec:
          containers:
          - name: myPodName
            image: myPod:latest
            imagePullPolicy: Always
            ports:
            - name: myPodPort
              containerPort: 8080
    
    在同等的
    部署中,差异变得明显:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: myDeploymentName
      labels:
        app: SomeLabel1
        label2: SomeLabel2
    spec:
      replicas: 100
      strategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: SomeLabel1
            label2: SomeLabel2
        spec:
          containers:
          - name: myPodName
            image: myPod:latest
            imagePullPolicy: Always
            ports:
            - name: myPodPort
              containerPort: 8080