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