如何在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
相关产品推荐
相关产品推荐

