You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中使用Kubernetes基于Lease的新选主机制?

在Python中使用Kubernetes Lease实现选主

一、替换ConfigMapLock为LeaseLock

Python的kubernetes-client库已支持基于Lease资源的选主锁,你只需替换锁类型并调整初始化参数即可完成迁移。

1. 核心依赖导入

替换原有的ConfigMapLock导入:

from kubernetes.leaderelection.resourcelock.leaselock import LeaseLock

2. 完整选主实现示例

以下是适配集群内运行的Lease选主代码,包含选举配置、回调逻辑和身份标识处理:

from kubernetes import client, config
from kubernetes.leaderelection import LeaderElector, LeaderElectionConfig
from kubernetes.leaderelection.resourcelock.leaselock import LeaseLock
import os
import time

def main():
    # 加载K8s配置(集群内自动用incluster配置,外部用本地kubeconfig)
    try:
        config.load_incluster_config()
    except config.ConfigException:
        config.load_kube_config()

    # 获取当前Pod的唯一标识(集群内从环境变量读取)
    pod_name = os.environ.get("POD_NAME")
    namespace = os.environ.get("POD_NAMESPACE", "default")
    # 对应Go中Controller-Runtime的LeaderElectionID
    lease_name = "my-python-controller-leader"

    # 初始化LeaseLock
    lock = LeaseLock(
        namespace=namespace,
        name=lease_name,
        identity=pod_name  # 用Pod名称作为唯一身份,确保每个副本身份不重复
    )

    # 配置选举参数
    election_config = LeaderElectionConfig(
        lock=lock,
        lease_duration=15,  # 租约有效期(秒)
        renew_deadline=10,  # 续约截止时间(必须小于lease_duration)
        retry_period=2,     # 选举重试间隔
        on_started_leading=on_started_leading,
        on_stopped_leading=on_stopped_leading,
        on_new_leader=on_new_leader
    )

    # 启动选举循环
    elector = LeaderElector(election_config)
    elector.run()

def on_started_leading(context):
    """当选主节点后执行核心业务逻辑"""
    print(f"Pod {context.identity} 成为主节点,启动控制器业务")
    while True:
        # 模拟控制器持续运行的任务
        time.sleep(5)
        print("主节点正在处理任务...")

def on_stopped_leading(context):
    """失去主节点身份后的清理逻辑"""
    print(f"Pod {context.identity} 失去主节点身份,停止业务逻辑")

def on_new_leader(identity):
    """新主节点当选时的通知逻辑"""
    current_pod = os.environ.get("POD_NAME")
    if identity != current_pod:
        print(f"新主节点 {identity} 已当选,当前Pod转为备用")

if __name__ == "__main__":
    main()

二、Deployment多副本配置适配

和Go的Controller-Runtime逻辑一致,Python控制器需要部署多副本,同时配置环境变量和RBAC权限:

1. Deployment示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-python-controller
spec:
  replicas: 3  # 多副本配置,和Go的Deployment设置一致
  selector:
    matchLabels:
      app: my-python-controller
  template:
    metadata:
      labels:
        app: my-python-controller
    spec:
      serviceAccountName: controller-sa  # 绑定Lease操作权限的ServiceAccount
      containers:
      - name: main
        image: your-python-controller-image:latest
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace

2. RBAC权限配置

需要给ServiceAccount配置Lease资源的操作权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: leader-election-role
rules:
- apiGroups: ["coordination.k8s.io"]
  resources: ["leases"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: leader-election-binding
subjects:
- kind: ServiceAccount
  name: controller-sa
  namespace: default  # 替换为你的Deployment所在命名空间
roleRef:
  kind: ClusterRole
  name: leader-election-role
  apiGroup: rbac.authorization.k8s.io

三、和Go Controller-Runtime的对比

Go的Controller-Runtime将选主逻辑高度封装,只需在Manager配置中设置LeaderElection: true和LeaderElectionID即可自动完成Lease锁管理、选举循环和回调;而Python的kubernetes-client库需要手动完成锁初始化、选举配置和循环启动,但核心原理完全一致——都是基于Kubernetes的coordination.k8s.io/v1/Lease资源实现分布式选主,保证同一时刻只有一个副本作为主节点运行核心逻辑。

内容的提问来源于stack exchange,提问作者guettli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:18:17