コンテナーの 3 つのポッド/レプリカを実行しようとしています。そのうちの 1 つをリーダーとして実行したいのですが、その特定のポッドが停止または失敗した場合、すぐに他の非リーダー実行ポッドがリーダーシップを取り、実行を継続する必要があります。これはリーダー ポッドから必要です。明確にするために、他のポッドは実行されますが、リーダー ポッドはリーダーシップを獲得すると、他のポッドが実行しない追加のコードを実行します。これは、私がフォローしたドキュメントへのリンクです。
これは、コンテナが実行するはずの実際のコードの実行に問題がある、私が実行したテスト例です。
package main
import (
"fmt"
"github.com/operator-framework/operator-lib/leader"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
"context"
"time"
"os"
)
func main() {
fmt.Println("Program has started successfully")
cfg, err := config.GetConfig()
if err != nil {
os.Exit(1)
}
opts := manager.Options{
LeaderElection: true,
LeaderElectionID: "memcached-operator-lock",
}
fmt.Println("Creating a manager")
mgr, err := manager.New(cfg, opts)
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
fmt.Println(err, "Manager exited non-zero")
os.Exit(1)
}
fmt.Println("Competing to become the leader")
err = leader.Become(context.TODO(), "memcached-operator-lock")
if err != nil {
fmt.Println("Failed to retry for leader lock because : %v ", err)
}
fmt.Println("I am the leader, i will pause for 4 minutes")
time.Sleep(4 * time.Minute)
}
リーダー ポッドのログは次のとおりです。
[diamanti@appserv41 leader_test]$ kubectl logs test-rs-qbm7k
Program has started successfully
Creating a manager
I1007 00:14:10.785904 1 leaderelection.go:242] attempting to acquire leader lease default/memcached-operator-lock...
I1007 00:14:28.184916 1 leaderelection.go:252] successfully acquired lease default/memcached-operator-lock
「私はリーダーです」という印刷ステートメントまでポッドを実行し、リーダーポッドに実行させたいタスクを実行できるようにしたいと考えています。リーダーシップを獲得したら実行できるようにする関数をどこかに渡すことができたとしても、私には問題ありません。現在、私はどこかでミスを犯しており、3 つのポッドのうちの 1 つが主導権を握った後、何もできません。