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
晚了 11 个月,但解决方案如下:
要在 K8S 中获得稳定的容器 (pod) 名称,您必须使用StatefulSet. StatefulSets专为必须维护状态的应用程序而设计,但是,如果您不使用 K8S 卷来存储状态(保持它们是短暂的),则可以StatefulSets毫无问题地使用。Deployment将您的转换为 a的过程很简单StatefulSet:
apiVersion:为apps/v1kind:为StatefulSetspec:添加selector:标签。该标签将包含您用于选择适当服务的所有内容。此外,您必须确保您拥有的任何项目与spec:template:metadata:labels下面的项目相匹配spec:selector:matchLabels(这在提供的示例中更有意义)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)
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |