ํด๋น ๊ธ์ ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค. ๋ง์๊ป ์ง์ ํด์ฃผ์ธ์!
์ฟ ๋ฒ๋คํฐ์ค ์์ ์๋ ๋ชจ๋ ํ๋์ ๋ ธ๋๋ ephermeral ํ๊ฒ ๋์์ธ ๋์์ต๋๋ค.
๊ทธ์ ๋ฐ๋ผ ํ๋์ ๋ ธ๋๋ ์ธ์ ๊ฐ์๊ธฐ ๊ธ์ฌ? ํ ์ง ๋ชจ๋ฆ ๋๋ค. ํ์ง๋ง ๊ธ์ฌ ํ๋ค๊ณ ํด์ ์๋น์ค์ ์ํฅ์ด ๊ฐ์ ์๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ตฌ์ฑํ ๋ ๊ณ ๊ฐ์ฉ์ฑ(HA) ์ ๋ฐ๋์ ๋๋ฐ๋์ด์ผ ํฉ๋๋ค.
๊ณ ๊ฐ์ฉ์ฑ์ ์ ์งํ์ง ์ํด์๋ ์ฌ๋ฌ ์ ์ฐจ๊ฐ ๋๋ฐ๋์ด์ผ ํ๋๋ฐ, ์ด๋ฒ ๊ธ์์๋ ๊ทธ ์ค Stateful ํ ์๋น์ค์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ์งํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ '๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ(Leader Election Mechanism)' ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ทธ ์ ์ Stateless ํ ์๋น์ค์ ๊ณ ๊ฐ์ฉ์ฑ๋ถํฐ ์์๋ด ์๋ค.
Stateless ํ ํ๋๊ฐ ์ฌ๋ฌ ๊ฐ ์๊ณ , Service ๋ฅผ ํตํด ํธ๋ํฝ์ด ๋ผ์ฐํ ๋ฉ๋๋ค.
Stateless ํน์ฑ์ ์๋ฌด ํ๋๋ ํธ๋ํฝ์ ๋ฐ์๋ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ค ํน์ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํด์ง๋๋ผ๋ HPA ๋ฅผ ํตํด์ ์ค์ผ์ผ ์์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒํด์ฃผ์ด๋ ๊ฝค๋ ๊ด์ฐฎ์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
Stateless ์ ํฌ๊ฒ ์ ๊ฒฝ์ธ ๊ฒ์ด ์์ต๋๋ค.
ํ์ง๋ง ์๋น์ค๊ฐ Stateful ํ๊ฒ ๋๋ฉด ์๊ธฐ๊ฐ ์ด์ง ๋ฌ๋ผ์ง๋๋ค.
์๋ฅผ ๋ค์ด ํธ๋ํฝ์ ๋ฐ๋ ์๋น์ค๊ฐ ์๋, Karpenter ์ ๊ฐ์ด Control Loop ์ ์งํํ๋ Stateful ์๋น์ค๋ก ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
Karpenter ๊ฐ์ ๊ฒฝ์ฐ Ec2NodeClass ์ ๊ฐ์ CRD ๋ฅผ Control Loop ์ ํตํด ์ง์ผ๋ณด๋ค๊ฐ ํน์ด ์ฌํญ์ด ์๊ธฐ๋ฉด AWS EC2 ๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, Karpenter ํ๋๊ฐ 3๊ฐ๋ผ๊ณ ํ๋ฉด ๋๊ฐ์ AWS EC2 ๊ฐ 3๊ฐ๊ฐ ๋ ๊ฒ์ ๋๋ค. 3๊ฐ์ ํ๋ ๋ชจ๋ ๊ฐ์์ ์ผ์ ํ ํ ๋๊น์.
Karpenter ์ฝ๋๋ ๊น๋ณด์ง ์์์ง๋ง, ์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ๋ ์ฝ๋๊ฐ ์์ ์๋ ์์ต๋๋ค. (๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ ์ธํ)
๋จ์ํ ์์ ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
์ด๋ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ค๋ฉด, ๋ฆฌ๋ ํ๋๋ง ์์ ์ ํ๊ฒ ๋์ด AWS EC2 ๊ฐ ๋์์ 3๊ฐ๋ฅผ ์์ฑํ๋ ์ค๋ณต์ ๋ง์ ์ ์์ต๋๋ค.
(๋ ๋์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด์๋ผ๋ฉด VPA ์ ๊ฐ์ ์ค์ผ์ผ ์ ์ด ํ์ํ ์ ์์ต๋๋ค)
์ถ๊ฐ์ ์ผ๋ก Karpenter ๋ฅผ Deployment ๊ฐ ์๋ StatefulSet ๋ก ์์ฑํด๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
StatefulSet ๋ ๋คํธ์ํฌ, ์คํ ๋ฆฌ์ง ๊ฐ์ ์๋ณ์๋ฅผ ๋์ด, ํธ๋ํฝ์ ๋ํ Stateful ์ ์ ์งํ ์ ์๊ฒ ์ง๋ง, ๊ฒฐ๊ตญ StatefulSet ์ ํ๋๊ฐ 3๊ฐ๋ผ๋ฉด Deployment ์ฒ๋ผ ์ค๋ณต๋ ์์ ์ ์ํํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ํ๋ก์ธ์ค ์์ฒด๋ฅผ ์ ์ดํ ์ ์์ผ๋๊น์.
๊ทธ๋ผ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ด ๋ญ๊ณ , ์ ํ์ํ์ง ๊ฐ๋ตํ๊ฒ ์์๋ดค์ผ๋, ์ฝ๋๋ก ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋ ์ง ๋ฐ๋ก ์์๋ณด๋๋ก ํ์ฃ !
๋ ์ธ ๋๋์ฝ๋~
Code - Go Client
์๋ต๊ฐ์ผ๋ก ํ์ฌ์ ํ๋ ์ด๋ฆ๊ณผ IP ๋ฅผ ๋ฆฌํดํด์ฃผ๋ gin ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์๊ณ , ์ฌ๊ธฐ์ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ ์ฉํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ๋ PC ๋ก ์ด์ํ๋ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌํฉ๋๋ค.
๋ฏธ๋ PC ๋ก ์ด์ํ๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ ํด๋ฆญ!
๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์์๋ณด๋ฉด์ ๊ฐ์ฅ ๊ถ๊ธํ๋ ๊ฒ์ด, "๋๊ฐ ๋ฆฌ๋์ธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ป๊ฒ ์์ง?" ์์ต๋๋ค.
์๋ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์คํ ๋ฆฌ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
์ต์ํ ๋๊ฐ ๋ฆฌ๋์ธ์ง๋ ์์์ผ ๋ฆฌ๋๋ฅผ ๋ฝ์ ํ ๋ ๋ง์ด์ฃ .
๋คํํ ์ฟ ๋ฒ๋คํฐ์ค๋ ์ด๋ฅผ Lease ๋ผ๋ ๋ฆฌ์์ค๋ฅผ ์ด์ฉํด์ ํด๊ฒฐํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Lease ๋ ETCD ๋ก ๊ด๋ฆฌ๋๊ฒ ์ฃ .
์ด ๋ง์ ์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ๋ฒ๋คํฐ์ค API ์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค๋ ๋ง์ด๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํด์ฃผ์์ต๋๋ค.
config, err := buildConfig(kubeconfig)
if err != nil {
klog.Fatal(err)
}
client := clientset.NewForConfigOrDie(config)
buildConfig ํจ์๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ก์ปฌ์์ ์คํํ๋ฉด ์ปค๋งจ๋ ์ธ์๋ก ๋๊ฒจ์ฃผ๊ณ , ์ฟ ๋ฒ๋คํฐ์ค ์์์ ์คํ๋๋ค๋ฉด rest.InClusterConfig() ๋ฅผ ํตํด Service Account Token ์ ์ฐพ์์ค๋๋ค.
func buildConfig(kubeconfig string) (*rest.Config, error) {
if kubeconfig != "" {
cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, err
}
return cfg, nil
}
cfg, err := rest.InClusterConfig()
if err != nil {
return nil, err
}
return cfg, nil
}
๋ค์์ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์คํ ํจ์์ ๋๋ค.
์๋ํฌ์ธํธ "/" ๋ฅผ ํตํด ํ๋๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ์๋ต๊ฐ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
run := func(ctx context.Context) {
// complete your controller loop here
klog.Info("Controller loop...")
engine := gin.New()
engine.Use(
CorsHandler(),
)
engine.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"pod_namespace": os.Getenv("POD_NAMESPACE"),
"pod_name": os.Getenv("POD_NAME"),
"pod_id": os.Getenv("POD_IP"),
"id": id,
})
})
engine.Run(fmt.Sprintf("%s:%d", "0.0.0.0", 8080))
}
๋น์ฐํ๊ฒ๋ engine.Run ๊ณผ ๊ฐ์ด foreground ๋ก ์ง์์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์คํ์์ผ์ฃผ์ด์ผ ํฉ๋๋ค.
๋ฐ๋ก ์์์ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ Lease ๋ผ๋ ๋ฆฌ์์ค๋ฅผ ํตํด ์งํ๋๋ค๊ณ ํ๋๋ฐ, ์ด ์ญ์ Lease ๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ค๋๋ค.
var leaseLockName = os.Getenv("LEASE_LOCK_NAME")
var leaseLockNamespace = os.Getenv("LEASE_LOCK_NAMESPACE")
var id = uuid.New().String()
lock := &resourcelock.LeaseLock{
LeaseMeta: metav1.ObjectMeta{
Name: leaseLockName,
Namespace: leaseLockNamespace,
},
Client: client.CoordinationV1(),
LockConfig: resourcelock.ResourceLockConfig{
Identity: id,
},
}
leaseLockName ๊ณผ leaseLockNamespace ๋ Configmap ์ ์ด์ฉํด์ ํ๊ฒฝ๋ณ์๋ก ๋๊ฒจ์ค ๊ฒ์ด๊ณ , Identity ๋ uuid ๋ฅผ ๋๊ฒจ์ค๋๋ค.
์ด์ ๋ถํฐ๊ฐ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ํต์ฌ ์ฝ๋์ ๋๋ค.
leaderelection.RunOrDie(ctx, leaderelection.LeaderElectionConfig{
Lock: lock,
ReleaseOnCancel: true, // true๋ก ์ค์ ํ๋ฉด, ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๊ฑฐ๋ ์ปจํ
์คํธ๊ฐ ์ทจ์๋ ๋ ๋ฆฌ์ค๋ฅผ ์ฆ์ ํด์
LeaseDuration: 60 * time.Second, // RenewDeadline ๋์ ๊ฐฑ์ ์ ์คํจํ์ ๋, ๋ฆฌ๋์ญ์ด ์ ์ง๋ ์ ์๋ ์๊ฐ
RenewDeadline: 15 * time.Second, // ๋ฆฌ๋๋ ์ด ๊ธฐ๊ฐ ๋์ ๋ฆฌ๋์ญ์ ๊ฐฑ์ ํด์ผํจ
RetryPeriod: 5 * time.Second, // ๋ฆฌ๋ ํ๋ ์๋ ๊ฐ์ ๋๊ธฐ ์๊ฐ์ ์ค์
Callbacks: leaderelection.LeaderCallbacks{
OnStartedLeading: func(ctx context.Context) {
run(ctx)
},
OnStoppedLeading: func() {
klog.Infof("leader lost: %s", id)
os.Exit(0)
},
OnNewLeader: func(identity string) {
if identity == id {
return
}
klog.Infof("new leader elected: %s", identity)
},
},
})
์์์ ์์ฑํ๋ run ํจ์๋ leaderelection.RunOrDie ์ ์ฝ๋ฐฑํจ์๋ก ์คํ๋๊ฒ ๋ฉ๋๋ค.
OnStartedLeading ํจ์๋ ๋ฆฌ๋๊ฐ ๋์์ ๋ ํ๋ฒ ์คํ๋๋ ํจ์๊ณ , OnStoppedLeading ์ ๋ฆฌ๋๋ฅผ ์์คํ์ ๋ ํ๋ฒ ์คํ๋๋ ํจ์๊ณ , OnNewLeader ๋ ์๋ก์ด ๋ฆฌ๋๊ฐ ์ ์ถ๋์์ ๋ ๋ฆฌ๋๊ฐ ์๋ ์๋น์ค์์ ์คํ๋๋ ํจ์์ ๋๋ค.
์๊ฐ๋ณด๋ค ์ด๋ ค์ด ๋ถ๋ถ์ ์๋๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ผ ์ข ๋ ๋ํ ์ผํ ์ดํด๋ฅผ ์ํด Deep Dive ๋ฅผ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
๋ง์ฝ ๋์ ๋ฐฉ์๋ง ๋ณด๊ณ ์ถ๋ค๋ฉด, ๋ค์ Deep Dive ํํธ๋ ๊ฑด๋๋ฐ์ด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
Code - Deep Dive
๋ค์์ kube-controller-manager ์ ์ฝ๋์ธ๋ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค๋ฅผ ๋ณด๋ฉด Lease ๋ ์์ต๋๋ค. ์ฆ, kube-controller-manager ๊ฐ Lease ์ Yaml ์ ๋ฐ๋ผ๋ณด๋ฉด์ Reconcile ํ ๊ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋ง์ ๋ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ Lease ๋ฆฌ์์ค๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์คํ๋ ์ ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํํธ, ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ leaderelection.RunOrDie ํจ์๋ฅผ ์์์ผ๋ก ์คํ๋ฉ๋๋ค.
Run ํจ์๋ฅผ ๋ณด๊ฒ๋๋ฉด ์๊น ์ฝ๋ฐฑ์ ์์ฑํ๋ OnStoppedLeading defer ํจ์์ OnStartedLeading ๊ณ ๋ฃจํด์ ์คํํ๋ ๊ฑธ ๋ณผ ์ ์๊ณ , le.renew(ctx) ๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
renew ํจ์๋ฅผ ๋ณด๊ฒ ๋๋ฉด, ์ข ๋ ํต์ฌ์ ์ธ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋๋ฐ ํฌ๊ฒ tryAcquireOrRenew ์ tryCoordinatedRenew ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํจ์๋ค์ ๋ชจ๋ wait.Until ํจ์ ๋ด์์ ๋์ํ๊ฒ ๋ฉ๋๋ค.
wait.Until ์ ์ง๋ [Kubernetes] Controller ์ Operator, ์ด๋๊น์ง ๊น๋ดค๋? ์์ ๋ค๋ฃฌ์ ์ด ์์ฃ .
tryAcquireOrRenew ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ฌ ํ๋ก์ธ์ค๊ฐ ๋ฆฌ๋์ด๊ณ , Lease ๊ฐ ์ ํจํ๋ค๋ฉด, ์ด์ Lease ์ AcquireTime, LeaderTransitions ๋ฅผ ๊ฐ์ ธ์์ ์ ๋ฐ์ดํธ๋ฅผ ํด์ค๋๋ค. ๊ฒฐ๊ตญ ์ด์ Lease ์ ๋น๊ตํ์ ๋ RenewTime ๋ง ์ ๋ฐ์ดํธ ๋๊ฒ ์ฃ .
๋ฌธ์ ๊ฐ ์๋ค๋ฉด true ๋ฅผ ๋ฆฌํดํด์ค์ผ๋ก์จ ๊ฐฑ์ ์ ์ฑ๊ณตํ๊ฒ ๋ฉ๋๋ค.
์ฒซ๋ฒ์งธ ๋ก์ง์์ ๋๋์ง ์์๋ค๋ฉด, ๋ค์ ๋๋ฒ์งธ ๋ก์ง์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค.
btye ๋ก ๊ตฌ์ฑ๋ ์ด์ Lease ์ ๋ํ ์ ๋ณด์ ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ง Lease ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์ค๊ฒ ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ๋ก ์๋ if ๋ฌธ์ ํ๊ฒ ๋๋๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๊ฐฑ์ ์ ์คํจํ๊ณ , ๋ฆฌ๋๋ฅผ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋๋ฒ์งธ ๋ก์ง์์ ๋๋์ง ์์๋ค๋ฉด, ๋ค์ ์ธ๋ฒ์งธ ๋ก์ง์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค.
์ด์ Lease ์ HolderIdentity ๊ฐ ์กด์ฌํ๊ณ , ์ ํจํ์ง๋ง ๋ฆฌ๋๊ฐ ์๋๋ผ๋ฉด ๊ฐฑ์ ์ ํ ์ ์๋ค๋ ๋ก์ง์ ๋๋ค.
์ธ๋ฒ์งธ ๋ก์ง์์ ๋๋์ง ์์๋ค๋ฉด, ๋ง์ง๋ง ๋ค๋ฒ์งธ ๋ก์ง์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค.
ํ์ฌ ํ๋ก์ธ์ค๊ฐ ๋ฆฌ๋๋ผ๋ฉด ์ฒซ๋ฒ์งธ ๋ก์ง๊ณผ ๋น์ทํ๊ฒ RenewTime ๋ง ์ ๋ฐ์ดํธ ๋ ๊ฒ์ ๋๋ค.
๋ค๋ง ์ฐจ์ด๊ฐ ์๋ค๋ฉด ์ฒซ๋ฒ์งธ ๋ก์ง์ FastPath ์ด๊ณ , ๋ค๋ฒ์งธ ๋ก์ง์ SlowPath ๋ผ๋ ๊ฒ์ ๋๋ค.
๊ธ์ด ๋๋ฌด ๊ธธ์ด์ ธ์ ๊ตณ์ด FastPath ์ SlowPath ๋ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.
๋ชจ๋ ๋ก์ง์ด ๋๋๊ณ ๋, ๋ก์ง์ด ๊ณ์ ๋๋ค๋ฉด ์ต์ข ์ ์ผ๋ก ๊ฐฑ์ ํ ์ ์๋๋ก true ๋ฅผ ๋ฆฌํดํด์ค๋๋ค.
๋ค์์ tryCoordinatedRenew ํจ์์ ๋๋ค.
tryAcquireOrRenew ์ ๋ฌ๋ฆฌ ์๋ก์ด ๋ฆฌ๋๋ฅผ ์ป๊ธฐ ์ํ ํจ์๋ผ๊ธฐ ๋ณด๋ค๋ ์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด ๋ฆฌ๋ ์กฐ์จ์ ์ํ ํจ์๋ก ์ดํดํ๋ฉด ์ฝ์ต๋๋ค.
์ฝ๋๋ ์๋ก ๊ต์ฅํ ๋น์ทํ๋ฐ ํฐ ์ฐจ์ด๋ผ๊ณ ํ๋ฉด tryCoordinatedRenew ์ ์ต์ข true ๋ฅผ ๋ฆฌํดํด์ฃผ๋ ๊ฑฐ ๋นผ๊ณ , ์ ๋ถ false ๋ง ๋ฆฌํดํด์ฃผ๋ ๊ฒ์ด์ฃ . ํน์ด ์ฌํญ์ด ์๊ธฐ๊ฒ ๋๋ฉด ๊ฐฑ์ ์ ํด์ฃผ์ง ์์ ๋ฆฌ๋๋ฅผ ๋ฐํ์์ผ ๋ฒ๋ฆฝ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ฌ ๋ฆฌ๋์ธ ํ๋ก์ธ์ค๊ฐ ์ฃผ์ด์ง ์๊ฐ์ ๊ฐฑ์ ์ ํ์ง ๋ชปํ๊ฒ ๋๋ฉด, ๋ฆฌ๋ ์๊ฒฉ์ ์๊ฒ ๋๊ณ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ฆฌ๋๋ฅผ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์์ ๋์ ๋ฐฉ์
์ง๊ธ๊น์ง ์ฝ๋๋ฅผ ์ดํด๋ดค์ผ๋, ์ด๋ฒ์ ํด๋น ์ฝ๋๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ๋ฒ๋คํฐ์ค ์์์ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ Lease ๋ฆฌ์์ค๋ถํฐ ์ดํด๋ด ๋๋ค.
ํ์ฌ ๋ฆฌ๋์ id ๋ ae4cf8ca-f345-481c-b4dc-67995c009951(uuid ๋ก ์์ฑํ๋) ์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ต๋ 60์ด ๋ด๋ก ๋ฆฌ๋ ํ๋๋ ์์ ์ด ๋ฆฌ๋๋ก์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ฆ๋ช ํ์ง ๋ชปํ๋ฉด ๋ค๋ฅธ ํ๋๊ฐ ๋ฆฌ๋๊ฐ ๋๊ฒ ์ฃ .
๋ค์์ ๋ฐฐํฌ๋ ํ๋๋ค์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด 3๊ฐ์ ํ๋๊ฐ ๋ฐฐํฌ๋์๊ณ , ๊ทธ ์ค ํ๋๋ง ๋ฆฌ๋๋ก ์ ์ถ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ฉด, ๋ฆฌ๋ ํ๋์ ์ ๋ณด๋ง ์๋ต ๋ฐ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
id ๋ํ Lease ๋ฆฌ์์ค์ holderIdentity ์ ์ผ์นํฉ๋๋ค.
์ด๋ฒ์ ํ๋ฒ ๋ฆฌ๋ ํ๋๋ฅผ ์ฃฝ์ฌ๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ์กด์ ๋ฆฌ๋ ํ๋๊ฐ ์ฃฝ์๋ค๋ ๊ฑธ ํ์ธํ ์ ์๊ณ , ๊ทธ์ ๋ฐ๋ผ ์๋ก์ด ํ๋๊ฐ ๋ฆฌ๋๊ฐ ๋์์ต๋๋ค.
Lease ๋ฆฌ์์ค๋ฅผ ํ์ธํด๋ณด๋ฉด holderIdentity ๊ฐ ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๊ณ , leaseTransitions ๋ ๋ฆฌ๋๊ฐ ๋ฐ๋์ ๋ฐ๋ผ ์นด์ดํธ๊ฐ ์ฆ๊ฐํ์ต๋๋ค.
์ถ๊ฐ๋ก ๋ฆฌ๋๊ฐ ๋ ํ๋๋ฅผ ๊ณ์ํด์ ์ฃฝ์์ ๋ RetryPeriod(์ด ์ต์ ์ ์ฝ๋ ๋ ๋ฒจ์ ์์) ์ดํ์ ์๋ก์ด ํ๋๊ฐ ๋ฆฌ๋๊ฐ ๋์ ์ ์์ ์ผ๋ก ์๋ต์ ๋ฐ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ํ์ ์ธ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ค
๊ทธ๋ผ ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ํ๋ก์ ํธ๋ค์ ๋ฌด์์ด ์์๊น์?
Karpenter, Cert Manager, ArgoCD, AWS LB Controller, Kubernetes Components ๋ฑ ์์ฒญ๋๊ฒ ๋ค์ํ ํ๋ก์ ํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฆฌ๋ ์ ์ถ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋์ ์ฌ๊ธฐ๊น์ง!