我正在努力获得一个现有的应用程序,该应用程序由一系列无状态、可伸缩的微服务(当然还有一些用作后端的有状态服务)组成,运行在Docker和Kubernetes上。更改应用程序的代码基本上是不可能的,因此我必须创建一些现有的机制,例如,服务发现、在群集和K8s上下文中工作。
在启动和运行Docker方面,有一件事对我很有帮助,那就是Swarm的“服务创建”命令(create/#create-services-using-templates)的模板特性,我可以这样做
-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概念,因此我正在为我们的无状态微服务使用这种部署)。我找到了将荚名传递到容器中的可能性。
env:
- name: metadata_name
valueFrom:
fieldRef:
fieldPath: metadata.name唉,容器的名称是( a)相当长的b)随机(也就是说,缩小和向上将不会重用名称),例如,名为foo-部署的部署的吊舱将命名为类似的
foo-部署-64db944b84-bwrxx
foo-部署-64db944b84-5jf7c
据我所知,最后五个字符由K8s保证在部署的所有活动荚中是唯一的,但它们在向上和向下扩展时不会被重用(罕见的冲突无法承受)。
是否有任何机制与斯温的“插槽”概念相对应?
看待PalatinateJ
发布于 2018-12-12 20:54:38
晚了11个月,但解决办法如下:
要在K8S中获得稳定的容器(pod)名称,必须使用StatefulSet。StatefulSets是为必须保持状态的应用程序设计的,但是,如果您不使用K8S卷作为状态(保持它们是短暂的),则可以使用StatefulSets而不存在任何问题。有一个将Deployment转换为StatefulSet的简单过程。
apiVersion:更改为apps/v1kind:更改为StatefulSetspec:下添加selector:标记。此标记将包含用于选择适当服务的所有内容。另外,,,您必须确保spec:template:metadata:labels下的任何项与spec:selector:matchLabels下的条目匹配(在提供的示例中,这将更有意义)strategy中称为Deployment ),则将其更改为updateStrategy。作为将来的参考,如果您不更新它,您最终将得到一个StatefulSet和一个ReplicaSet,因为K8S正在试图满足strategy和StatefulSet需求。应用这些更改之后,您将部署StatefulSet。我们如何从这里获得任务插槽?主机名。
由于K8S正在维护稳定的荚名,所以您将有以下名称:
pod/mypod-0 1/1 Running 0 10m
pod/mypod-1 1/1 Running 0 9m当运行kubetctl时。在那之后,这是一个简单的问题,解析出你的豆荚名称的数字。
下面是StatefulSet的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这种差异在等效的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: 8080https://stackoverflow.com/questions/47919898
复制相似问题