问题标签 [kubernetes-deployment]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kubernetes - 如何在 Kubernetes 中为服务选择特定的 Pod
我有一个由 3 个主机组成的 kubernetes 集群,其中每个主机都有一个唯一的 id 标签。在这个集群上,有一个软件有 3 个实例(副本)。
每个副本都需要与所有其他副本进行通信。此外,还有一个包含所有 pod 的服务,以便该应用程序永久可用。
所以我有:
和
这种方法有效,但我无法扩展或使用滚动更新功能。
我想定义一个具有 3 个副本的部署,其中每个副本都有一个唯一的通用标签(例如 1/3、2/3 等副本 ID)。
在服务中,我可以使用选择器来获取即使在更新后仍存在的标签。
另一种解决方案可能是选择 pod/deployment,具体取决于运行它的主机。我可以使用 DaemonSet 或仅使用具有亲和力的 pod/deployment 来确保每个主机都具有我的部署的确切副本。
但我不知道如何根据运行所在的主机标签来选择 pod。
使用主机名不是一个选项,因为主机名会在不同的环境中改变。
我搜索了文档,但没有找到与此用例匹配的任何内容。希望这里有人知道如何解决这个问题。
jenkins - Jenkins 中的 Kubernetes 部署状态
我正在编写一个 Jenkins Global 管道库,我有一个阶段可以将我的 docker 映像部署到 K8s 集群。因此,在 CI 过程中构建我的 docker 映像后,我将映像提升(部署)到多个环境(依次从低到高)。所以,要在运行后得到正确的部署状态
我在 shell 步骤中使用了以下命令。
如果我的部署没有错误,一切顺利,但如果我的部署有一些错误(可能是一些代码错误,应用程序无法启动),那么这个命令kubectl rollout status deployment <deployment name>
将无限运行(因为 k8s 一次又一次地重试重新部署)并且我的 Jenkins 工作无限运行(直到作业超时)。
因此,为了找到一个 hack,我尝试了一个逻辑来将超时设置在这个命令上,并且计算是这样的:
timeout = (pod 数量 * liveness probe time + pod 数量 * 10) 秒
不确定这个计算是否正确。
我的代码片段看起来像这样
这最初效果很好,但后来我发现 k8s “kubectl rollout status deployment” 命令在所有 pod 都被安排好并且旧的完全终止之前不会给出退出代码 0,这有时需要一些时间。
我基本上想要的是一个最小的计算超时值。
我的 K8s 文件有这样的参数:
我在 K8s 文档中没有找到与此相关的任何具体内容。有人面临同样的挑战吗?
kubernetes - Kubernetes 初始化容器每小时运行一次
我最近通过https://github.com/tarosky/k8s-redis-ha设置了 redis设置了 redis ,这个 repo 包含一个 init 容器,并且我包含了一个额外的 init 容器以获取密码等设置。
我看到一些奇怪的(而且似乎没有记录)行为,即 init 容器在 redis 容器启动之前按预期运行,但是随后它们每小时运行一次,接近一个小时。我已经在部署和 statefulset 上使用busybox init 容器(什么都不做)测试了这种行为,并体验了相同的行为,因此它不是特定于这个redis pod。
我已经用 k8s 1.6 和 1.8 在裸机上对此进行了测试,结果相同,但是当将 init 容器应用于 GKE(k8s 1.7)时,不会发生这种行为。我看不到 GKE 的任何标志kubelet
来指示这种行为。
请参阅下文,以kubectl describe pod
显示在主 pod 尚未退出/崩溃时运行 init 容器。
请注意 pod 中的 Containers 开始于Mon, 12 Mar 2018 06:21:02 +0000
(0 次重启)和 Init Containers 开始于Tue, 13 Mar 2018 03:01:12 +0000
. 这些似乎每隔一小时几乎每小时重新运行一次。
我们的裸机必须在某个地方为 init 容器配置错误?任何人都可以阐明这种奇怪的行为吗?
git - Kubernetes gitrepo 卷 - 自动重新部署?
我在我的 K8S 集群中创建了一个包含两个副本的部署,其中包含用于克隆 git 存储库的卷部分。克隆 repo,创建 pod,创建部署。我可以登录到 pod 并运行 git commits 看起来还不错。
我的假设:如果我对由 gitRepo 卷挂载管理的存储库执行 git push 操作,pod 或 K8S 部署将自动重新部署,但这不会发生吗?我的假设是错误的吗?一旦像 CD 管道一样完成推送,我是否应该做更多的事情来进行自动重新部署?如果后者是真的,我现在正试图了解 gitRepo 卷挂载的目的。
感谢您的投入。
阿卜杜勒。
kubernetes - 具有共享环境变量的 K8S 部署
我们有一组部署(一组 pod)都使用相同的 docker 映像。例子:
- 网页接口
- 网络管理员
- Web 任务工作节点
- 数据任务工作节点
- ...
它们都需要一组通用的环境变量,例如数据库主机的位置、外部服务的密钥等。它们还具有一组不通用的环境变量。
无论如何,有没有人可以:
- 重用定义了环境变量的模板
- 从文件加载环境变量并将它们设置在 pod 上
最佳解决方案将是命名空间感知的解决方案,因为我们使用 kubernetes 命名空间将测试、阶段和生产环境分开。
类似于 dockers env_file 的东西会很好。但我找不到与此相关的任何示例或参考。我唯一能找到的是通过秘密设置环境,但这并不干净,冗长,因为我仍然需要为每个部署编写所有环境变量。
spring-boot - Kubernetes Secret TLS 证书 P12 和 Spring Boot 部署不起作用
我目前陷入困境,不知道如何继续。
这是我的 Spring Boot application.properties
我的 Spring Boot 应用程序部署 yaml:
这就是我在 Kubernetes 中创建秘密的方式:
当它部署时,我得到
当我从部署 yaml 中删除 Secrets 时,它工作正常,但我不明白它是这个问题的根本原因。我正在使用谷歌云平台容器引擎。
dns - 描述 kubernetes 命名空间时的随机字符
我正在尝试通过 DNS 将我的 Kubernetes 部署连接在一起。
我有一个 Java (Spring Boot) 部署和一个 javascript (node.js) 部署,两者都通过默认的 ClusterIP 服务公开。我需要两个服务之间的 websocket 和 REST 通信。
我已经读过我应该使用 DNS,以便这两个服务可以相互通信,但是我在尝试确定这些 DNS 是什么时遇到了麻烦。
例如,
kubectl get pods --all-namespaces
给了我这个:
NAMESPACE NAME
default javascript-deployment-65869b7db4-mxfrb
default java-deployment-54bfc87fd6-z8wml
- 我需要在我的服务配置中指定什么来停止应用这些随机后缀?
- 然后,我如何确定我的 DNS 名称需要与 my-svc.my-namespace.svc.cluster.local 类似的形式?
kubernetes - 如何创建将基于架构部署的 k8s 部署文件
我编写了如下部署文件,这给了我错误unknown field "platform"
。关于指定什么以便它基于体系结构部署的任何想法?
kubernetes - 获取 Kubernetes 部署的 pod 的推荐方法是什么?
特别是考虑到创建和更新部署所涉及的所有异步过程,我发现很难可靠地找到与给定部署的当前版本关联的当前 pod。
目前,我这样做:
- 向部署模板添加唯一标签。
- 获取部署的修订号。
- 获取所有带有标签的副本集。
- 进一步过滤它们以找到具有正确修订号的那个。
- 从副本集中提取 pod 模板哈希。
- 获取带有标签的所有 pod 以及 pod 模板哈希。
这是尴尬和复杂的。此外,我不确定(4)和(6)是否保证只产生想要的对象。但我不能按 ownerReferences 过滤,可以吗?
有没有更健壮更简单的方法?