Kubernetes 中有类似 Swarm 的 Task-Slot 的东西吗?

Pal*_*teJ 5 kubernetes docker-swarm

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

对我使用 Docker Swarm 进行启动和运行有很大帮助的一件事是 Swarm 的“服务创建”命令的模板功能(https://docs.docker.com/engine/reference/commandline/service_create/#create-services -using-templates),我可以在其中做类似的事情

-e my_env_var=foo{{.Task.Slot}}
Run Code Online (Sandbox Code Playgroud)

在属于我的 Swarm 服务的每个容器内,这会将环境变量 my_env_var 设置为 fooX 形式的值,其中“X”是容器的“槽号”。要了解槽号是什么,请考虑具有 N 个实例的服务(即,scale=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)概念)。我发现可以将 pod 名称传递到容器中

    env:
    - name: metadata_name
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
Run Code Online (Sandbox Code Playgroud)

唉,容器的名称是 a) 相当长 b) 随机的(即,缩小和扩大不会重用名称),例如,名为 foo-deployment 的部署的 pod 将被命名为类似的名称

foo-部署-64db944b84-bwrxx

foo-部署-64db944b84-5jf7c

据我了解,K8s 保证最后五个字符在部署的所有活动 Pod 中是唯一的,但在向上和向下扩展时它们不会被重用(尽管很少发生冲突)。

有没有对应Swarm“槽”概念的机制?

问候普法尔茨J

Tan*_*bey 1

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

要在 K8S 中获得稳定的容器 (pod) 名称,您必须使用StatefulSet. StatefulSets专为必须维护状态的应用程序而设计,但是,如果您不使用 K8S 卷来存储状态(保持它们是短暂的),则可以StatefulSets毫无问题地使用。Deployment将您的转换为 a的过程很简单StatefulSet

  1. 将您的更改apiVersion:apps/v1
  2. 更改kind:StatefulSet
  3. 在下面spec:添加selector:标签。该标签将包含您用于选择适当服务的所有内容。此外,您必须确保您拥有的任何项目与spec:template:metadata:labels下面的项目相匹配spec:selector:matchLabels(这在提供的示例中更有意义)
  4. 如果您有任何类型的更新策略(strategy在 a 中调用) Deployment,请将其更改为updateStrategy。为了将来的参考,如果您不更新此内容,您最终将同时部署 aStatefulSet和 a ,ReplicaSet因为 K8S 正在尝试满足 astrategy和您的StatefulSet要求。

应用这些更改后,您将得到StatefulSet部署。我们如何从中获取任务槽?主机名。

由于 K8S 维护稳定的 pod 名称,因此您将拥有如下名称:

pod/mypod-0                             1/1     Running   0          10m
pod/mypod-1                             1/1     Running   0          9m
Run Code Online (Sandbox Code Playgroud)

跑步时kubetctl。之后,只需从 pod 名称中解析出数字即可。

以下是 a 的 YAML StatefulSet

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
Run Code Online (Sandbox Code Playgroud)

差异在等价物上变得明显Deployment

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
Run Code Online (Sandbox Code Playgroud)