首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有像斯温在库伯内特斯的任务槽吗?

有像斯温在库伯内特斯的任务槽吗?
EN

Stack Overflow用户
提问于 2017-12-21 07:24:23
回答 1查看 1.2K关注 0票数 4

我正在努力获得一个现有的应用程序,该应用程序由一系列无状态、可伸缩的微服务(当然还有一些用作后端的有状态服务)组成,运行在Docker和Kubernetes上。更改应用程序的代码基本上是不可能的,因此我必须创建一些现有的机制,例如,服务发现、在群集和K8s上下文中工作。

在启动和运行Docker方面,有一件事对我很有帮助,那就是Swarm的“服务创建”命令(create/#create-services-using-templates)的模板特性,我可以这样做

代码语言:javascript
复制
-e my_env_var=foo{{.Task.Slot}}

在属于我的群集服务的每个容器中,这将将env 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,这仍然比完全随机的要好)。

事实证明,这对于支持我的应用程序来说是非常有用的,我正在K8s中拼命地寻找类似的东西(特别是在K8s部署的上下文中,因为它们似乎是最合适的K8s概念,因此我正在为我们的无状态微服务使用这种部署)。我找到了将荚名传递到容器中的可能性。

代码语言:javascript
复制
    env:
    - name: metadata_name
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

唉,容器的名称是( a)相当长的b)随机(也就是说,缩小和向上将不会重用名称),例如,名为foo-部署的部署的吊舱将命名为类似的

foo-部署-64db944b84-bwrxx

foo-部署-64db944b84-5jf7c

据我所知,最后五个字符由K8s保证在部署的所有活动荚中是唯一的,但它们在向上和向下扩展时不会被重用(罕见的冲突无法承受)。

是否有任何机制与斯温的“插槽”概念相对应?

看待PalatinateJ

EN

回答 1

Stack Overflow用户

发布于 2018-12-12 20:54:38

晚了11个月,但解决办法如下:

要在K8S中获得稳定的容器(pod)名称,必须使用StatefulSetStatefulSets是为必须保持状态的应用程序设计的,但是,如果您不使用K8S卷作为状态(保持它们是短暂的),则可以使用StatefulSets而不存在任何问题。有一个将Deployment转换为StatefulSet的简单过程。

  1. apiVersion:更改为apps/v1
  2. kind:更改为StatefulSet
  3. spec:下添加selector:标记。此标记将包含用于选择适当服务的所有内容。另外,,您必须确保spec:template:metadata:labels下的任何项与spec:selector:matchLabels下的条目匹配(在提供的示例中,这将更有意义)
  4. 如果您有任何类型的更新策略(在strategy中称为Deployment ),则将其更改为updateStrategy。作为将来的参考,如果您不更新它,您最终将得到一个StatefulSet和一个ReplicaSet,因为K8S正在试图满足strategyStatefulSet需求。

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

由于K8S正在维护稳定的荚名,所以您将有以下名称:

代码语言:javascript
复制
pod/mypod-0                             1/1     Running   0          10m
pod/mypod-1                             1/1     Running   0          9m

当运行kubetctl时。在那之后,这是一个简单的问题,解析出你的豆荚名称的数字。

下面是StatefulSet的YAML

代码语言:javascript
复制
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

这种差异在等效的Deployment上变得明显起来。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47919898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档