2

我试图了解如何在 Kubernetes 上部署应用程序,这需要相同部署的每个 Pod 具有与启动命令一起使用的不同参数。

我有这个在 Kubernetes 上运行 spark 的应用程序,需要在启动时生成执行器 Pod。问题是应用程序的每个 Pod 都需要使用自己的端口和 spark 应用程序名称生成自己的执行程序。

我已经阅读了有状态集并搜索了文档,但我没有找到解决问题的方法。由于每个 Pod 都需要使用不同的端口,如果我理解正确,我需要在服务中声明该端口,并且还直接作为参数传递给 args 中的 pod 命令。

有没有办法在不使用多个部署的情况下获得这个,一个用于我需要创建的每个 pod?因为这是我能想到的唯一解决方案,但部署后无法扩展。我正在使用 Helm 来部署应用程序,因此我可以根据需要轻松创建尽可能多的部署和/或服务,但如果可能的话,我想找到一个可以在运行时扩展的解决方案。

4

3 回答 3

1

我不认为你可以有一个从不同规格创建 POD 的部署。你不能在 Kubernetes 中拥有它,Helm 在这里也无济于事(因为 Helm 只是 Kubernetes 配置的模板管理器)。

你可以做的是将每个 Pod 指定为单独的配置(如果是单个 Pod,则不一定需要 Deployment)并让 Helm 管理它。

于 2019-08-26T07:30:03.167 回答
1

发布我使用的解决方案,因为它可能对周围搜索的其他人有用。

最后我找到了一个很好的配置来解决我的问题。我使用 StatefulSet 来声明 Spark 应用程序的部署。与 StatefulSet 相关联,这是一个无头服务,它将每个 pod 暴露在特定端口上。

StatefulSet 可以声明一个属性,该属性spec.serviceName可以与无头服务具有相同的名称,从而为每个 Pod 创建一个唯一的网络名称。就像是<pod_name>.<service_name>

此外,每个 Pod 都有一个唯一且不变的名称,该名称是使用应用程序名称和每个副本 Pod 从 0 开始的序号创建的。

使用 docker 映像中的启动脚本并在每个 Pod 的环境中插入元数据中的 pod 名称,我能够为每个 pod 使用不同的配置,因为即使使用相同的部署,每个 pod 都有自己唯一的元数据名称和我可以使用 StatefulSet 服务来获取我需要的东西。

这样,StatefulSet 在运行时是可扩展的,并且可以按预期工作。

于 2019-08-29T15:04:23.637 回答
0

嘿,我不确定这是否完全符合您的情况,但我认为这是您可以尝试的。使用 sidecar 容器运行副本实例,sidecar 是与主容器一起运行的容器,并且共享相同的命名空间,并且可以在每个容器之间共享卷。

现在要将不同的参数传递给每个容器或 sidecar,您必须调整 dockerfile 或者调整容器启动的方式。

创建一个 start.sh 脚本文件,它接受参数并使用这些参数启动容器,这里的技巧是从环境变量中接受参数,从而允许您稍后从 configmaps 或 pod env 配置这些。

所以这是一个运行相同代码并以不同参数开头的 php/laravel 应用程序的示例。start.sh文件看起来像这样。

#!/bin/sh


if [ "${CONTAINER_ROLE}" = "queue" ];
then
    echo "Running the queue..."
    php artisan queue:work --queue=${QUEUENAME}
    echo "Queue Started"
else
   echo "Running Iceberg."
   exec apache2-foreground
fi

所以一个示例 dockerfile 看起来像这样

FROM php:7.1.24-apache


COPY . /srv/myapp
...
...
RUN chown -R www-data:www-data /srv/app \
    && a2enmod remoteip && a2enmod rewrite

WORKDIR /srv/app
RUN chmod +x .docker/start.sh
CMD [ "sh",".docker/start.sh"] 

让我知道事情的后续。

于 2019-08-28T12:06:01.470 回答