如何在 statefulset 中设置 kubernetes pod 的主机名

2023-12-27

我正在使用 Statefulset,并且启动了多个 Pod,但它们不是彼此的复制品。我想设置 pod 的主机名,并将这些主机名作为环境变量传递给所有 pod,以便它们可以相互通信。

我尝试在 pod 规范下使用主机名,但主机名永远不会设置为指定的主机名。但是,它的主机名设置为 podname-0。

# Source: testrep/templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet 
metadata:
  name: orbiting-butterfly-testrep
  labels:
    app.kubernetes.io/name: testrep
    helm.sh/chart: testrep-0.1.0
    app.kubernetes.io/instance: orbiting-butterfly
    app.kubernetes.io/managed-by: Tiller
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: testrep
      app.kubernetes.io/instance: orbiting-butterfly
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app.kubernetes.io/name: testrep
        app.kubernetes.io/instance: orbiting-butterfly
    spec:
      nodeSelector:
          testol: ad3
       hostname: test1
       containers:
        - name: testrep
          image: "test/database:v1"
          imagePullPolicy: IfNotPresent
          env:
           - name: DB_HOSTS
             value: test1,test2,test3

  1. 根据文档:

StatefulSet 是用于管理有状态应用程序的工作负载 API 对象。

管理一组 Pod 的部署和扩展,并提供有关这些 Pod 的顺序和唯一性的保证。

StatefulSet 对于需要以下一项或多项的应用程序非常有价值:

  • 稳定、唯一的网络标识符.
  • 稳定、持久的存储。
  • 有序、优雅的部署和扩展。
  • 有序、自动滚动更新。
  1. 有状态集局限性 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#limitations:

StatefulSet 目前需要 Headless Service 来负责 Pod 的网络身份。您负责创建此服务。

  1. Pod 身份 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-identity

StatefulSet Pod 具有唯一的身份,由序数、稳定的网络身份和稳定的存储组成。无论 Pod 被(重新)调度到哪个节点,身份都会保留在 Pod 上。对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 都将被分配一个从 0 到 N-1 的整数序数,该序数在 Set 中是唯一的.

  1. 稳定的网络ID https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id

StatefulSet 中的每个 Pod 都从 StatefulSet 的名称和 Pod 的序号中派生出其主机名。构造的主机名的模式是 $(statefulset name)-$(ordinal). 上面的示例将创建三个名为 web-0、web-1、web-2 的 Pod。 StatefulSet 可以使用 Headless Service 来控制其 Pod 的域。此服务管理的域采用以下形式:$(服务名称).$(命名空间).svc.cluster.local,其中“cluster.local”是集群域。创建每个 Pod 时,它都会获得一个匹配的 DNS 子域,格式为:$(podname).$(governing service domain),其中管理服务由 StatefulSet 上的 serviceName 字段定义。

Note:

您负责创建负责 Pod 网络身份的 Headless Service。

正如所描述的vjdhama https://stackoverflow.com/a/58669371/11207414请使用 Headless Service 创建您的 Statefulset。

您可以在文档中找到此示例:

apiVersion: v1
kind: Service
metadata:
 name: nginx
 labels:
   app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx" # has to match headless Service metadata.name
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80

在这种情况下,Pod DNS 和 Pod 主机名应分别为:

    Pod DNS
    web-{0..N-1}.nginx.default.svc.cluster.local
    
    Pod Hostname
    web-{0..N-1}


    NAME                                   READY   STATUS    RESTARTS   AGE     IP               
    pod/web-0                              1/1     Running   0          5m      192.168.148.78   
    pod/web-1                              1/1     Running   0          4m53s   192.168.148.79   
    pod/web-2                              1/1     Running   0          4m51s   192.168.148.80  
    

从 Pod 角度来看:

   root@web-2:# nslookup nginx
   Server:      10.96.0.10
   Address: 10.96.0.10#53

   Name:    nginx.default.svc.cluster.local 
   Address: 192.168.148.80
   Name:    nginx.default.svc.cluster.local
   Address: 192.168.148.78
   Name:    nginx.default.svc.cluster.local
   Address: 192.168.148.79

因此,您可以使用 Pod DNS 调用每个相应的 Pod,例如:

web-0.nginx.default.svc.cluster.local

Update:

从 StatefulSet 公开单个 pod。

Pod 名称标签

StatefulSet控制器创建Pod时,会添加一个标签,statefulset.kubernetes.io/pod-name,设置为 Pod 的名称。该标签允许您将 Service 附加到 StatefulSet 中的特定 Pod。

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-name-label https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-name-label

你可以找到here https://itnext.io/exposing-statefulsets-in-kubernetes-698730fb92a1棘手的方式。 使用上述 Statefulset 的优点:

构造的主机名的模式是 $(statefulset name)-$(ordinal)。上面的示例将创建三个名为 web-0、web-1、web-2 的 Pod。

举个例子:

apiVersion: v1
kind: Service
metadata:
  name: app-0
spec:
  type: LoadBalancer
  selector:
    statefulset.kubernetes.io/pod-name: web-0
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

将为您做这件事。

希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 statefulset 中设置 kubernetes pod 的主机名 的相关文章

  • gofabric8> 无法解压缩 /Users/apple/.fabric8/bin/oc.zip zip:不是有效的 zip

    我正在尝试为微服务设置环境 我正在使用 Fabric8 来做到这一点 我在用着mvn fabric8 cluster start Dfabric8 cluster kind openshift命令 执行时出现以下错误 INFO gofabr
  • 一个持久卷是否可以被多个持久卷声明消耗?

    假设一个 PV 可以被多个 PVC 消耗并且每个 pod 实例需要一个 PVC 绑定 这样的假设是否正确 我这么问是因为我创建了一个 PV 然后创建了一个具有不同尺寸要求的 PVC 例如 kind PersistentVolume apiV
  • 如何在 microk8s 中使用本地 docker 镜像?

    我一直在使用 minikube 在本地测试 Kubernetes 在 minikube 中 我们可以使用本地 docker 镜像eval minikube docker env 命令 我开始探索microk8s 在我运行 Ubuntu 18
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • prometheus 节点实例列表

    是否可以使用 prometheus 获取节点实例列表 我有一个节点导出器 但我没有看到这样的指标 我们应该添加一个新的运算符吗 您可以使用kube 状态指标 https github com kubernetes kube state me
  • 运行 istio-proxy 后启动容器/pod

    我正在尝试使用 Istio 和 Envoy 通过 Kubernetes 实现服务网格 我能够设置服务和 istio proxy 但无法控制容器和 istio proxy 的启动顺序 我的容器是第一个启动的 并尝试通过 TCP 访问外部资源
  • 使大型静态数据文件可供 kubernetes pod 使用

    我有一些相当大的 UTF 8 数据文件 pod 需要在启动时加载到内存中 从几百 KB 到大约 50 MB 该项目 包括 helm 图表 是开源的 但其中一些文件不是开源的 否则我可能只会将它们包含在图像中 我最初的想法是创建配置映射 但我
  • 从 celery 工作人员到普罗米修斯的自定义指标

    我有一些 celery 工作人员在 kubernetes 下的容器中运行 它们不会由 celery 自动缩放 并且每个都在单个进程中运行 即没有多处理 我想从他们那里获取一堆不同的指标到普罗米修斯中 我研究过 celery promethe
  • Kubernetes Pod 动态环境变量

    我需要能够将自定义环境变量分配给 Pod 的每个副本 一个变量应该是一些随机的 uuid 另一个唯一的数字 怎么可能实现呢 我更愿意继续使用带有副本的 部署 如果这不是开箱即用的 如何通过自定义复制控制器 控制器管理器来实现 有没有可用的钩
  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel
  • Kubernetes - 服务之间的通信

    我目前正在开发 kubernetes 集群 集群工作正常 我需要在不使用代理的情况下建立服务之间的通信 例如我有以下服务 worker app1 app2 app3 Worker 需要直接通过 SSH 登录应用程序容器并执行一些命令 在 d
  • kubernetes/openshift 中的请求与限制 cpu

    我在为 Openshift 中的 pod 选择正确的请求和限制设置时遇到一些困境 一些数据 在启动期间 应用程序需要至少 600 毫核才能在 150 秒内完成就绪检查 启动后 200 毫核应该足以让应用程序保持空闲状态 所以我从文档中的理解
  • Spark 执行器 STDOUT 到 Kubernetes STDOUT

    我在 Spark Worker 中运行的 Spark 应用程序将执行程序日志输出到特定文件路径 worker home directory app xxxxxxxx 0 stdout I used log4j properties将日志从
  • 如何根据 Kubernetes / Docker 事件发送警报?

    是否可以根据 Kubernetes 集群内发生的事件以某种方式发送警报 到电子邮件 slack 特别是 如果 Pod 意外重新启动或 Pod 无法启动 那么获取警报将非常有用 同样 了解 Pod 的 CPU 使用率是否超过特定阈值并获取警报
  • 允许 Kubernetes 用户列表/获取命名空间

    我有以下用户清单 我希望允许 myapp user 获取集群内所有命名空间的列表 根据我的查找 我应该创建一个 ClusterRole 但我无法真正找到足够的详细信息 是否有所有 apiGroup 以及相应资源和动词的列表 apiVersi
  • Kubernetes WatchConnectionManager:执行失败:HTTP 403

    我遇到错误Expected HTTP 101 response but was 403 Forbidden 在我使用以下命令设置新的 Kubernetes 集群之后Kubeadm当我提交下面遇到的 pyspark 示例应用程序时 只有一个主
  • Kubernetes 的艰难之路 - 如何设置节点不可调度

    我正在从头开始配置 Kubernetes 集群 原因 它是虚拟机内的本地设置 一切都很好 除了master节点被创建为可调度的 我尝试过分配master通过将所需参数传递给 kubelet 二进制文件来对节点进行标签和适当的污点 不能解决问
  • k8s书签解决什么问题?

    我正在尝试做什么 我正在尝试进行部署并监视 k8s 事件 直到部署准备好使用k8s节点API 手表 https github com kubernetes client javascript blob master examples typ
  • 如何在 Kubernetes 中按特定顺序配置 Pod 初始化?

    我想知道如何按特定顺序开始部署 我知道initContainers但这对我不起作用 我有一个巨大的平台 有大约 20 个部署和 5 个有状态集 每个都有自己的服务 环境变量 卷 水平自动缩放器等 所以不可能 或者我不知道如何 在另一个中定义
  • 使用 Docker Desktop 调试本地部署到 Kubernetes 的应用程序的最佳方法是什么?

    我有使用 Docker 开发相对复杂的应用程序的经验 使用 Visual Studio 2019 调试应用程序非常容易 我只是将 docker compose yaml 设置为启动应用程序并开始调试 是否可以使用 Docker Deskto

随机推荐

  • Python Pandas 如何将 groupby 操作结果分配回父数据帧中的列?

    我在 IPython 中有以下数据框 其中每一行都是一只股票 In 261 bdata Out 261
  • jQuery:按类和输入类型选择

    我想使用 jQuery 选择一组既具有特定输入类型 例如复选框 又具有特定类的元素 但是 当我尝试以下操作时 input checkbox myClass 我没有收到任何退回的物品 我怎样才能在 jQuery 中完成这个任务 您的选择器正在
  • 在聚合框架 C# 中使用 Facet

    我想对我的数据创建一个聚合 以获取 Net 应用程序中书籍集合的特定标签的总计数 我有以下书籍课程 public class Book public string Id get set public string Name get set
  • 带向量极限的四边形

    我想使用quad作为限制列表没有 for 循环 作为一个基本示例 T 1 2 3 f x x 2 quad 0 T 1 f 计算我需要的内容 但我想将quad 0 T 1 f quad 0 T 2 f quad 0 T 3 f 保存为向量
  • 在本机反应中更新/更改状态对象的最佳方法?

    更新 State 对象深处的嵌套属性的最佳方法是什么 constructor this state someprop quadrangle rectangle width 我想更新矩形对象的宽度 this state quadrangle
  • Xcode 没有嵌入框架部分

    我有问题 我正在尝试在我的 ios xcode 项目中实现 Amazon 框架 并且我还需要将它们添加到 构建阶段 gt 嵌入框架 部分中 但我的 xcode 窗口中没有选项 这是截图 这怎么可能 即使我创建新项目 问题仍然存在 您好 在您
  • 与内联块未对齐(其他元素被推下)

    我正在尝试将小盒子排成一行 这些盒子每个里面有大约 2 个元素 在某些情况下 第一个元素的文本太多 以至于它分成两行 如果发生这种情况 该特殊行中的所有其他块如下所示 长话短说 这是一个例子 http jsfiddle net PMRQ5
  • 如何在 JOptionPane 的 ok 按钮上添加监听器? [复制]

    这个问题在这里已经有答案了 如何在单击 确定 按钮时添加侦听器JOptionPane INFORMATION MESSAGE 我的 JOptionPane 是 JOptionPane showMessageDialog null Your
  • Xbox One 控制器输入到 UWP 应用程序

    我一直在尝试使 Xbox One 控制器与 UWP 应用程序交互 并研究了 Gamepad 类 基于评论中提到的建议 Windows UWP 中对 Xbox One 的控制器支持 https stackoverflow com questi
  • ExecutorService,避免任务队列太满的标准方法

    我在用ExecutorService为了方便并发多线程程序 采取以下代码 while xxx ExecutorService exService Executors newFixedThreadPool NUMBER THREADS Fut
  • EF 7 - 新的 ExecuteDelete 和 ExecuteUpdate 方法不适用于内存数据库

    我正在使用新的 EF 7ExecuteDelete and ExecuteUpdate功能而且它们都很棒 但是当我尝试为使用它们的函数编写单元测试时 这些测试崩溃了 我在 NET Core 7 上使用 EF 7 0 1 Microsoft
  • auto* 的类型推导规则是什么?

    类型推导规则是什么auto 考虑以下 int x 64 int px x auto v1 x auto gt ok v1 is int auto v2 px auto gt is v2 int auto v3 px auto gt is v
  • PHP 中的 Twitter 机器人有问题吗?

    我已经用 php 构建了一个 Twitter 机器人 它能够接收消息并响应消息 但出现了这个问题 当我向机器人发送消息时 我必须刷新机器人脚本才能让机器人回复 我希望机器人能够不断检查任何新传入的消息并做出相应的响应 我该如何修复这个错误
  • 复制/移动省略与显式删除的复制/移动构造函数

    我想知道复制 移动省略何时适用 或允许适用 显式deleted 复制 移动构造函数和非deleted 复制 移动构造函数 具体如下 可以明确地deleted 复制 ctor 或移动 ctor 被删除 是否尝试从另一个相同类型的对象或临时对象
  • 沙盒应用程序和 NSOpenPanel 导致崩溃

    我正在我的 Cocoa 应用程序中做一个简单的文件打开面板 我启用权利和应用程序沙箱 但在 OS X 10 9 上 当应用程序应使用以下命令打开对话框时NSOpenPanel 它崩溃了 应用具体信息 由于未捕获的异常 NSObjectNot
  • 如何在 XSLT 1.0 中查找当前日期

    我在检索 XSLT 代码中的当前日期时遇到麻烦 我正在使用 1 0 版和 MSXSL exe 应用程序来触发我的 xslt 代码 我尝试使用以下代码行来实现此功能 但它不起作用 貌似1 0版本不支持当前日期功能 您能否提供适用于 xslt
  • 在 JavaScript 中检查文本框值是字符串还是数字

    基本上我有以下代码
  • ld:重复符号

    我正在做一个学校项目 我从 Xcode 中收到一些奇怪的错误 我正在使用 TextMate 的 Command R 功能来编译该项目 编译似乎工作正常 但链接失败并出现我不明白的错误消息 ld输出 ld path final build f
  • 在 Kivy 中创建动态绘制的线条

    这是我的帖子的延续 在 Kivy 中使用和移动小部件 按钮 https stackoverflow com questions 25273046 using and moving widgets buttons in kivy 我想在 Ki
  • 如何在 statefulset 中设置 kubernetes pod 的主机名

    我正在使用 Statefulset 并且启动了多个 Pod 但它们不是彼此的复制品 我想设置 pod 的主机名 并将这些主机名作为环境变量传递给所有 pod 以便它们可以相互通信 我尝试在 pod 规范下使用主机名 但主机名永远不会设置为指