kubernetes_replica

λ ˆν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ λ°–μ˜ 컨트둀러: κ΄€λ¦¬λ˜λŠ” νŒŒλ“œ 배포

  • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ 컨트둀러(rc)

    • apiVersion: v1
      kind: ReplicationController
      metadata:
        name: kubia
      spec:
        replicas: 3
        selector:
            app: kubia
        template:
          metadata:
            labels:
              app: kubia
          spec:
            containers:
            - name: kubia
              image: luksa/kubia
              ports:
              - containerPort: 8080
    • image

    • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨νŠΈλ‘€λŸ¬λŠ” μΏ λ²„λ„€ν‹°μŠ€ λ¦¬μ†ŒμŠ€λ‘œμ„œ νŒŒλ“œκ°€ 항상 μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„°μ—μ„œ λ…Έλ“œκ°€ μ‚¬λΌμ§€κ±°λ‚˜ λ…Έλ“œμ—μ„œ νŒŒλ“œκ°€ 제거된 경우, λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨νŠΈλ‘€λŠ” 사라진 νŒŒλ“œλ₯Ό 감지해 ꡐ체 νŒŒλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

    • λ™μž‘

      • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬λŠ” μ‹€ν–‰ 쀑인 νŒŒλ“œ λͺ©λ‘μ„ μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , νŠΉμ • μœ ν˜•μ˜ μ‹€μ œ νŒŒλ“œ μˆ˜κ°€ μ˜λ„ν•˜λŠ” μˆ˜μ™€ μΌμΉ˜ν•˜λŠ”μ§€ 항상 ν™•μΈν•©λ‹ˆλ‹€. 이런 νŒŒλ“œκ°€ λ„ˆλ¬΄ 적게 μ‹€ν–‰ 쀑인 경우 νŒŒλ“œ ν…œν”Œλ¦Ώμ—μ„œ μƒˆ λ³΅μ œλ³Έμ„ λ§Œλ“€κ³  λ„ˆλ¬΄ λ§Žμ€ νŒŒλ“œκ°€ μ‹€ν–‰ 쀑이면 초과 볡제본이 μ œκ±°λ©λ‹ˆλ‹€.

      • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ˜ μ„Έ κ°€μ§€ μš”μ†Œ 이해

        • image

        • λ ˆμ΄λΈ” μ…€λ ‰ν„°(label selector) : λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ˜ λ²”μœ„μ— μžˆλŠ” νŒŒλ“œλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

        • λ ˆν”Œλ¦¬μΉ΄ 수(replica count) : μ‹€ν–‰ν•  νŒŒλ“œμ˜ μ˜λ„ν•˜λŠ”(desired) 수λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

        • νŒŒλ“œ ν…œν”Œλ¦Ώ(pod template) : μƒˆλ‘œμš΄ νŒŒλ“œ λ ˆν”Œλ¦¬μΉ΄λ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

      • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬ μ‚¬μš© μ‹œ 이점

        • κΈ°μ‘΄ νŒŒλ“œκ°€ 사라지면 μƒˆ νŒŒλ“œλ₯Ό μ‹œμž‘ν•΄ νŒŒλ“œ(λ˜λŠ” μ—¬λŸ¬ νŒŒλ“œμ˜ 볡제본)κ°€ 항상 μ‹€ν–‰λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

        • ν΄λŸ¬μŠ€ν„° λ…Έλ“œμ— μž₯μ• κ°€ λ°œμƒν•˜λ©΄ μž₯μ• κ°€ λ°œμƒν•œ λ…Έλ“œμ—μ„œ μ‹€ν–‰ 쀑인 λͺ¨λ“  νŒŒλ“œ(λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ˜ μ œμ–΄ν•˜μ— μžˆλŠ” νŒŒλ“œ)에 κ΄€ν•œ ꡐ체 볡제본이 μƒμ„±λ©λ‹ˆλ‹€.

        • μˆ˜λ™ λ˜λŠ” μžλ™μœΌλ‘œ νŒŒλ“œλ₯Ό μ‰½κ²Œ μˆ˜ν‰μœΌλ‘œ ν™•μž₯ν•  수 있게 ν•©λ‹ˆλ‹€.

  • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬ λŒ€μ‹  λ ˆν”Œλ¦¬μΉ΄μ…‹ μ‚¬μš©ν•˜κΈ°(rs)

    • μΏ λ²„λ„€ν‹°μŠ€ ν΄λŸ¬μŠ€ν„° μƒμ—μ„œ 미리 μ§€μ •λœ Podλ₯Ό μž‘μ„±ν•˜μ—¬ μ‹€ν–‰μ‹œμΌœ λ‘λŠ” μž₯μΉ˜μž…λ‹ˆλ‹€.

    • Podκ°€ ν•„μš”ν•œ 수만큼 μ‹€ν–‰μ‹œν‚¨ μƒνƒœλ₯Ό ν΄λΌμš°λ“œ μ•ˆμ— 항상 λ§Œλ“€μ–΄ λ‘λŠ”μ—­ν• μ„ ν•©λ‹ˆλ‹€.

    • apiVersion: apps/v1beta2
      kind: ReplicaSet
      metadata:
        name: kubia
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: kubia
        template:
          metadata:
            labels:
              app: kubia
          spec:
            containers:
            - name: kubia
              image: luksa/kubia
    • μ΄ˆκΈ°μ—λŠ” λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬κ°€ νŒŒλ“œλ₯Ό λ³΅μ œν•˜κ³  λ…Έλ“œ μž₯μ• κ°€ λ°œμƒν–ˆμ„ λ•Œ μž¬μŠ€μΌ€μ€„λ§ν•˜λŠ” μœ μΌν•œ μΏ λ²„λ„€ν‹°μŠ€ ꡬ성 μš”μ†Œμ˜€μŠ΅λ‹ˆλ‹€. 후에 λ ˆν”Œλ¦¬μΉ΄μ…‹μ΄λΌλŠ” μœ μ‚¬ν•œ λ¦¬μ†ŒμŠ€κ°€ λ„μž…λ˜μ–΄ μ°¨μ„ΈλŒ€ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ΄λ©°, λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•  κ²ƒμž…λ‹ˆλ‹€.(λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬λŠ” κ²°κ΅­ μ‚¬μš©λ˜μ§€ μ•Šκ²Œ 될 것)

    • λ ˆν”Œλ¦¬μΉ΄μ…‹κ³Ό λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬ 비ꡐ

      • λ ˆν”Œλ¦¬μΉ΄μ…‹μ€ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ™€ λ˜‘κ°™μ΄ λ™μž‘ν•˜μ§€λ§Œ μ’€ 더 ν’λΆ€ν•œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λŠ” νŒŒλ“œ μ…€λ ‰ν„°λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

      • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ˜ λ ˆμ΄λΈ” μ…€λ ‰ν„°λŠ” νŠΉμ • λ ˆμ΄λΈ”μ΄ μžˆλŠ” νŒŒλ“œλ§Œμ„ λ§€μΉ­μ‹œν‚¬ 수 μžˆλŠ” 반면, λ ˆν”Œλ¦¬μΉ΄μ…‹μ˜ μ…€λ ‰ν„°λŠ” νŠΉμ • λ ˆμ΄λΈ”μ΄ μ—†λŠ” νŒŒλ“œλ‚˜ λ ˆμ΄λΈ”μ˜ κ°’κ³Ό 상관없이 νŠΉμ • λ ˆμ΄λΈ”μ˜ ν‚€λ₯Ό κ°–λŠ” νŒŒλ“œλ₯Ό λ§€μΉ­μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

      • λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬λŠ” 값에 상관없이 λ ˆμ΄λΈ” ν‚€μ˜ 쑴재만으둜 νŒŒλ“œλ₯Ό λ§€μΉ­μ‹œν‚¬ 수 μ—†μ§€λ§Œ, λ ˆν”Œλ¦¬μΉ΄μ…‹μ€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

  • 데λͺ¬μ…‹μ„ μ‚¬μš©ν•΄ 각 λ…Έλ“œμ— μ •ν™•νžˆ ν•œ 개의 νŒŒλ“œ μ‹€ν–‰ν•˜κΈ°

    • image

    • ν΄λŸ¬μŠ€ν„°μ˜ λͺ¨λ“  λ…Έλ“œμ—, λ…Έλ“œλ‹Ή ν•˜λ‚˜μ˜ νŒŒλ“œλ§Œ μ‹€ν–‰λ˜κΈΈ μ›ν•˜λŠ” 경우

    • λͺ¨λ“  λ…Έλ“œμ—μ„œ 둜그 μˆ˜μ§‘κΈ°μ™€ λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ₯Ό μ‹€ν–‰ν•˜λ €λŠ” 경우. 쒋은 μ˜ˆλŠ” μΏ λ²„λ„€ν‹°μŠ€μ˜ kube-proxy ν”„λ‘œμ„ΈμŠ€μ΄λ©°, μ„œλΉ„μŠ€λ₯Ό μž‘λ™μ‹œν‚€κΈ° μœ„ν•΄ λͺ¨λ“  λ…Έλ“œμ—μ„œ 싀행돼야 ν•©λ‹ˆλ‹€.

    • 데λͺ¬μ…‹(각 λ…Έλ“œμ— μ •ν™•νžˆ ν•˜λ‚˜μ˜ 볡제본만 μ‹€ν–‰)은 각 λ…Έλ“œμ—μ„œ ν•˜λ‚˜μ˜ νŒŒλ“œ 볡제본만 μ‹€ν–‰ν•˜μ§€λ§Œ λ ˆν”Œλ¦¬μΉ΄μ…‹μ€ ν΄λŸ¬μŠ€ν„° μ „μ²΄μ—μ„œ λ¬΄μž‘μœ„λ‘œ νŒŒλ“œλ₯Ό λΆ„μ‚°μ‹œν‚΅λ‹ˆλ‹€.

    • 데λͺ¬μ…‹μœΌλ‘œ λͺ¨λ“  λ…Έλ“œμ— νŒŒλ“œ μ‹€ν–‰ν•˜κΈ°

      • λͺ¨λ“  ν΄λŸ¬μŠ€ν„° λ…Έλ“œλ§ˆλ‹€ νŒŒλ“œλ₯Ό ν•˜λ‚˜λ§Œ μ‹€ν–‰ν•˜λ €λ©΄ 데λͺ¬μ…‹(DaemonSet) 였브젝트λ₯Ό 생성해야 ν•©λ‹ˆλ‹€. 데λͺ¬μ…‹μ— μ˜ν•΄ μƒμ„±λ˜λŠ” νŒŒλ“œλŠ” 타깃 λ…Έλ“œκ°€ 이미 지정돼 있고 μΏ λ²„λ„€ν‹°μŠ€ μŠ€μΌ€μ€„λŸ¬λ₯Ό κ±΄λ„ˆλ›°λŠ” 것을 μ œμ™Έν•˜λ©΄ 이 μ˜€λΈŒμ νŠΈλŠ” λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬ λ˜λŠ” λ ˆν”Œλ¦¬μΉ΄μ…‹κ³Ό 맀우 μœ μ‚¬ν•©λ‹ˆλ‹€. νŒŒλ“œκ°€ ν΄λŸ¬μŠ€ν„° 내에 λ¬΄μž‘μœ„λ‘œ 흩어져 λ°°ν¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

      • λ ˆν”Œλ¦¬μΉ΄μ…‹(λ˜λŠ” λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬)이 ν΄λŸ¬μŠ€ν„°μ— μ›ν•˜λŠ” 수의 νŒŒλ“œ 볡제본이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 반면, 데λͺ¬μ…‹μ—λŠ” μ›ν•˜λŠ” 볡제본 μˆ˜λΌλŠ” κ°œλ…μ΄ μ—†μŠ΅λ‹ˆλ‹€. νŒŒλ“œ 셀렉터와 μΌμΉ˜ν•˜λŠ” νŒŒλ“œ ν•˜λ‚˜κ°€ 각 λ…Έλ“œμ—μ„œ μ‹€ν–‰ 쀑인지 ν™•μΈν•˜λŠ” 것이 데λͺ¬μ…‹μ΄ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 역할이기 λ•Œλ¬Έμ— 볡제본 κ°œλ…μ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

      • λ…Έλ“œκ°€ λ‹€μš΄λ˜λ©΄ 데λͺ¬μ…‹μ€ λ‹€λ₯Έ κ³³μ—μ„œ νŒŒλ“œλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒˆ λ…Έλ“œκ°€ ν΄λŸ¬μŠ€ν„°μ— μΆ”κ°€λ˜λ©΄ 데λͺ¬μ…‹μ€ μ¦‰μ‹œ μƒˆ νŒŒλ“œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆ λ…Έλ“œμ— λ°°ν¬ν•©λ‹ˆλ‹€. μ‹€μˆ˜λ‘œ νŒŒλ“œ 쀑 ν•˜λ‚˜λ₯Ό μ‚­μ œν•΄ λ…Έλ“œμ— 데λͺ¬μ…‹μ˜ νŒŒλ“œκ°€ μ—†λŠ” κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€ μž…λ‹ˆλ‹€.

Reference

  • https://www.oreilly.com/library/view/kubernetes-in-action/9781617293726/

  • https://www.oreilly.com/library/view/cloud-native-devops/9781492040750/

Last updated