#title Kubernetes #keywords kubernetes, container [[TableOfContents]] == 서비스 디스커버리 == === ì¸ê·¸ë ˆìŠ¤ === ì¸ê·¸ë ˆìŠ¤(Ingress)는 서비스 ì•žìª½ì— ìœ„ì¹˜í•˜ë©° 스마트 ë¼ìš°í„° ë° í´ëŸ¬ìŠ¤í„° 엔트리 í¬ì¸íŠ¸ ì—í• ì„ í•˜ëŠ” 별ë„ì˜ ì¿ ë²„ë„¤í‹°ìŠ¤ ìžì›ì´ë‹¤. ì¸ê·¸ë ˆìŠ¤ëŠ” 외부ì—ì„œ ì ‘ê·¼ 가능한 URL, 로드 밸런싱, SSL 종료, ì´ë¦„ 기반 ê°€ìƒ í˜¸ìŠ¤íŒ… ë“±ì„ í†µí•´ ì„œë¹„ìŠ¤ì— ëŒ€í•œ HTTP 기반 ì ‘ê·¼ì„ ì œê³µí•œë‹¤. {{{ apiVersion: extentions/v1beta1 kind: Ingress ... spec: backend: serviceName: ... servicePort: 8080 }}} ì¸ê·¸ë ˆìŠ¤ëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ì—ì„œ 가장 ê°•ë ¥í•˜ê³ ë™ì‹œì— 가장 복잡한 서비스 디스커버리 메커니즘ì´ë‹¤. == ì„¤ì • ìžì› == === EnvVar === ì„¤ì •ì„ ì™¸ë¶€í™” 하는 가장 쉬운 ë°©ë²•ì€ ë„ì»¤ì˜ ENV 지시ìžë‚˜ ë„커파ì¼ì—ì„œ ì§ì ‘ ì •ì˜í• 수 있는 환경 ë³€ìˆ˜ì— ì„¤ì • ê°’ì„ ë°°ì¹˜í•˜ëŠ” 것ì´ë‹¤. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 디플로ì´ë¨¼íŠ¸ ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ì„¸íŠ¸ ê°™ì€ ì»¨íŠ¸ë¡¤ëŸ¬ì˜ íŒŒë“œ 명세ì—ì„œ ì§ì ‘ ì„¤ì •í• ìˆ˜ 있다. {{{ ... spec: containers: ... env: - name: ... value: ... }}} EnvVar는 ì†Œê·œëª¨ì˜ ë³€ìˆ˜ì™€ 간단한 ì„¤ì •ì—만 ì 합하다. ë˜, ì–´ë””ì— ë³€ìˆ˜ê°€ ì •ì˜ë˜ì–´ 있는지 찾기 ì–´ë µë‹¤ëŠ” 단ì ë„ ìžˆë‹¤. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 단순 환경 변수보다 훨씬 ìœ ì—°í•œ ì „ìš© ì„¤ì • ìžì›ì¸ 컨피그맵(ConfigMap), ì‹œí¬ë¦¿(Secret) ê°ì²´ë¥¼ ì œê³µí•œë‹¤. === 컨피그맵 === {{{ apiVersion: v1 kind: ConfigMap metadata: name: ... data: ... }}} ==== ì»¨í”¼ê·¸ë§µì— ì„¤ì •ëœ í™˜ê²½ 변수 세트 ==== {{{ ... spec: containers: - env: - name: ... valueFrom: configMapKeyRef: name: ... key: ... }}} {{{ ... spec: containers: envFrom: - configMapKeyRef: name: ... }}} ==== ì»¨í”¼ê·¸ë§µì„ ë³¼ë¥¨ìœ¼ë¡œ 마운트 ==== {{{ ... spec: containers: ... volumes: - name: config-volume configMap: name: ... }}} === ì‹œí¬ë¦¿ === 컨피그맵 ëŒ€ì‹ ì‹œí¬ë¦¿ì— ì ‘ê·¼í•˜ë ¤ë©´ [[Code(configMapKeyRef)]]를 [[Code(secretKeyRef)]]ë¡œ 바꾸ìž. ==== ì‹œí¬ë¦¿ì€ 얼마나 ì•ˆì „í•œê°€? ==== ì‹œí¬ë¦¿ì€ ë°ì´í„°ë¥¼ Base64ë¡œ ì¸ì½”딩해 ê°€ì§€ê³ ìžˆë‹¤ê°€ 환경 변수나 ë§ˆìš´íŠ¸ëœ ë³¼ë¥¨ìœ¼ë¡œ íŒŒë“œì— ì „ë‹¬í•˜ê¸° ì „ì— ë””ì½”ë”©ëœë‹¤. 간혹 ì‹œí¬ë¦¿ì„ 보안 기능으로 ì°©ê°í•˜ê¸°ë„ 하지만 Base64는 암호화 ê¸°ë²•ì´ ì‚¬ìš©ëœ ì¸ì½”ë”©ì´ ì•„ë‹ˆë©° 보안 측면ì—ì„œ í‰ë¬¸ í…스트와 ë™ì¼í•˜ë‹¤. ê·¸ë ‡ë‹¤ë©´ 왜 ì‹œí¬ë¦¿ì´ 컨피그맵보다 ì•ˆì „í•˜ë‹¤ê³ í• ê¹Œ? ì‹œí¬ë¦¿ì€ ë³´ì•ˆì„ ìœ ì§€í•˜ê¸° 위한 구현 세부사í•ì´ 많다. ëŠìž„ì—†ì´ ê°œì„ ì´ ì´ë£¨ì–´ì§€ëŠ” 중ì´ì§€ë§Œ 현재 ì‹œì ì—서는 í¬ê²Œ, 1. ì‹œí¬ë¦¿ì€ ìžì‹ ì—게 ì ‘ê·¼í•œ 파드가 실행 ì¤‘ì¸ ë…¸ë“œì—만 ë°°í¬ëœë‹¤. 2. 노드ì—ì„œ ì‹œí¬ë¦¿ì€ tmsfsì˜ ë©”ëª¨ë¦¬ì— ì €ìž¥ë˜ë©°, ì‹¤ì œ ìŠ¤í† ë¦¬ì§€ì—는 기ë¡ë˜ì§€ ì•Šê³ íŒŒë“œê°€ ì œê±°ë ë•Œ 함께 ì œê±°ëœë‹¤. 3. ì‹œí¬ë¦¿ì€ etcdì— ì•”í˜¸í™”ëœ í˜•íƒœë¡œ ì €ìž¥ëœë‹¤. ì´ëŸ° 주요 구현과 ìƒê´€ì—†ì´ 루트 사용ìžë¡œ ì‹œí¬ë¦¿ì— ì ‘ê·¼í•˜ê±°ë‚˜, 파드를 ìƒì„±í•´ì„œ ì‹œí¬ë¦¿ì— 마운트하는 등 다양한 방법으로 ì‹œí¬ë¦¿ì„ ì½ì„ 수 있다. ë”°ë¼ì„œ 민ê°í•œ ì •ë³´ëŠ” ì• í”Œë¦¬ì¼€ì´ì…˜ ë ˆë²¨ì—ì„œ 추가 암호화가 필요하다. == 스케ì¼ë§ == === ìˆ˜í‰ ìŠ¤ì¼€ì¼ë§ê³¼ ìˆ˜ì§ ìŠ¤ì¼€ì¼ë§ì˜ ì°¨ì´ === ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 스케ì¼ë§í•˜ëŠ” 것ì—는 2가지 주요 ì ‘ê·¼ ë°©ë²•ì´ ìžˆë‹¤. 1. ìˆ˜í‰ ìŠ¤ì¼€ì¼ë§ ì¿ ë²„ë„¤í‹°ìŠ¤ì—ì„œ 수í‰ìœ¼ë¡œ 스케ì¼í•˜ëŠ” ê²ƒì€ íŒŒë“œ ë ˆí”Œë¦¬ì¹´ë¥¼ ë” ë§Žì´ ë§Œë“œëŠ” 것ì´ë‹¤. 2. ìˆ˜ì§ ìŠ¤ì¼€ì¼ë§ 수ì§ìœ¼ë¡œ 스케ì¼í•˜ëŠ” ê²ƒì€ íŒŒë“œê°€ 관리하는 컨테ì´ë„ˆë¥¼ 실행하는 ë° ë” ë§Žì€ ìžì›ì„ ì œê³µí•˜ëŠ” 것ì´ë‹¤. ※ 설명으로는 간단해 ë³´ì´ì§€ë§Œ, 다른 서비스와 í´ëŸ¬ìŠ¤í„° ìžì²´ì— ì˜í–¥ì„ 미치지 ì•Šë„ë¡ ì˜¤í† ìŠ¤ì¼€ì¼ë§ì„ 위한 ì• í”Œë¦¬ì¼€ì´ì…˜ ì„¤ì •ì„ ìƒì„±í•˜ë ¤ë©´ ìƒë‹¹í•œ 시행착오를 ê±°ì³ì•¼ 한다. === ìˆ˜ë™ ìˆ˜í‰ ìŠ¤ì¼€ì¼ë§ === ì´ë¦„ì—ì„œ ì•Œ 수 ìžˆë“¯ì´ ì¿ ë²„ë„¤í‹°ìŠ¤ ìš´ì˜ìžë¥¼ 기반으로 최ì ì˜ ì„¤ì •ì„ ì 진ì 으로 튜ë‹í•œë‹¤. ì˜¤í† ìŠ¤ì¼€ì¼ë§ì´ 없는 경우나 ëŠë¦¬ê²Œ 변화하는 로드를 처리하는 ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ 경우 ì‚¬ìš©í• ìˆ˜ 있다. ìžì£¼ 변경ë˜ê³ ì ì‘ì´ í•„ìš”í•œ ë™ì 워í¬ë¡œë“œ 패턴ì—는 ì 합하지 않다. === ìˆ˜í‰ íŒŒë“œ ì˜¤í† ìŠ¤ì¼€ì¼ë§ === ê³ ì •ë˜ì–´ 있지 ì•Šìœ¼ë©´ì„œë„ ë¡œë“œë¥¼ 충분히 ì²˜ë¦¬í• ìˆ˜ 있는 ìš©ëŸ‰ì„ ë³´ìž¥í•˜ëŠ” ì• í”Œë¦¬ì¼€ì´ì…˜ ìš©ëŸ‰ì„ ì •ì˜í• 수 있다. 가장 간단한 ë°©ë²•ì€ [[Code(HorizonPodAutoscaler)]](HPA)를 사용해 íŒŒë“œì˜ ìˆ˜ë¥¼ 수í‰ìœ¼ë¡œ 스케ì¼í•˜ëŠ” 것ì´ë‹¤. {{{ apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler ... spec: minReplicas: 1 maxReplicas: 5 scaleTargetRef: apiVersion: extentions/v1beta1 kind: Deployment ... }}} https://t1.daumcdn.net/cfile/tistory/992DD43A5D5C028303&.jpg 그림. ìˆ˜í‰ íŒŒë“œ ì˜¤í† ìŠ¤ì¼€ì¼ë§ì˜ 메커니즘 === ìˆ˜ì§ íŒŒë“œ ì˜¤í† ìŠ¤ì¼€ì¼ë§ === ìˆ˜í‰ ìŠ¤ì¼€ì¼ë§ì€ 스테ì´íŠ¸ë¦¬ìŠ¤ ì„œë¹„ìŠ¤ì— ì§€ìž¥ì„ ëœ ì£¼ê¸° ë•Œë¬¸ì— ìˆ˜ì§ ìŠ¤ì¼€ì¼ë§ë³´ë‹¤ ì„ í˜¸ë˜ì§€ë§Œ, ìˆ˜ì§ ìŠ¤ì¼€ì¼ë§ì€ ì‹¤ì œ 로드 기반으로 ì„œë¹„ìŠ¤ì˜ ì‹¤ì œ ìžì› 요구를 튜ë‹í• ë•Œ ìœ ìš©í•˜ë‹¤. íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆëŠ” CPU와 메모리 requests를 ì§€ì •í• ìˆ˜ 있으며 íŠ¹ì •í•œ ì–‘ì˜ ìžì›ì„ 보장한다. 즉 ìžì›ì´ 보장ë˜ì§€ 않으면 파드가 스케줄ë˜ì§€ 않는다. 메모리 ìš”ì²ì„ 너무 낮게 잡으면 노드가 ë”ìš± 꽉 채워지기 ë•Œë¬¸ì— ë©”ëª¨ë¦¬ 압박으로 메모리 부족 오류로 워í¬ë¡œë“œ ì¶•ì¶œì´ ì¼ì–´ë‚ 수 있다. CPU limits를 너무 낮게 잡으면 CPU ê³ ê°ˆì´ë‚˜ ì„±ëŠ¥ì´ ì €í•˜ëœ ì›Œí¬ë¡œë“œê°€ ë°œìƒí• 수 있다. ë°˜ë©´ì— ë„ˆë¬´ ë§Žì€ ìžì›ì„ requets하면 불필요한 ìš©ëŸ‰ì´ í• ë‹¹ë˜ì–´ ìžì›ì´ ë‚비ëœë‹¤. í´ëŸ¬ìŠ¤í„°ì˜ ì‚¬ìš©ë¥ ê³¼ ìˆ˜í‰ ìŠ¤ì¼€ì¼ë§ì˜ íš¨ìœ¨ì„±ì„ ìœ„í•´ 가능한 ì •í™•í•˜ê²Œ ìžì›ì„ ìš”ì²í•˜ëŠ” ê²ƒì´ ì¤‘ìš”í•˜ë©° [[Code(Vertical Pod Autoscaler)]](VPA)ê°€ ì´ë¥¼ í•´ê²°í•˜ëŠ”ë° ë„ì›€ì´ ë˜ë©° ì‹¤ì œ 사용 í”¼ë“œë°±ì„ ê¸°ë°˜ìœ¼ë¡œ ìžì›ì„ ì¡°ì • ë° í• ë‹¹í•˜ëŠ” ê³¼ì •ì„ ìžë™í™”한다. {{{ apiVersion: poc.autoscaling.k8s.io/v1alpha1 kind: VerticalPodAutoscaler ... spec: selector: matchLables: app: ... updatePolicy: updateMode: "Off" }}} ※ VPA와 HPA를 함께 사용하는 ê²ƒì€ ì˜¤í† ìŠ¤ì¼€ì¼ëŸ¬ê°€ ì•„ì§ê¹Œì§€ëŠ” 서로를 ì¸ì‹í•˜ì§€ ì•Šì•„ ì›ì¹˜ ì•Šì€ ë™ìž‘ì´ ë°œìƒë 수 있다. VPA는 ì•„ì§ ë² íƒ€ë²„ì „ì´ë©° 향후 활발히 사용ë˜ë©´ 변경ë ê°€ëŠ¥ì„±ë„ ìžˆë‹¤. 그러나 ì—¬ì „ížˆ VPA는 ìžì› 소비 íš¨ìœ¨ì„±ì„ í¬ê²Œ í–¥ìƒ ì‹œí‚¬ ê°€ëŠ¥ì„±ì´ ìžˆëŠ” 기능ì´ë‹¤. === í´ëŸ¬ìŠ¤í„° ì˜¤í† ìŠ¤ì¼€ì¼ë§ === 새로운 노드를 스케ì¼ë§í•œë‹¤. ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ í´ë¼ìš°ë“œ 컴퓨팅 ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ìƒì—ì„œ 실행 ì¤‘ì¼ ë•Œë§Œ 수행ë 수 있다. ëª¨ë“ ì£¼ìš” í´ë¼ìš°ë“œ ì œê³µì—…ì²´ëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ ì˜¤í† ìŠ¤ì¼€ì¼ëŸ¬(CA)를 ì œê³µí•œë‹¤. HPA와 VPAì˜ ìŠ¤ì¼€ì¼ë§ ê¸°ìˆ ì€ í´ëŸ¬ìŠ¤í„° 용량 í•œë„ ë‚´ì—서만 íƒ„ë ¥ì„±ì„ ì œê³µí•œë‹¤. CA는 ì¿ ë²„ë„¤í‹°ìŠ¤ ì• ë“œì˜¨ìœ¼ë¡œ 구ë™ë˜ê³ ìš”ì²ëœ CPU나 메모리를 충족시키는 ìš©ëŸ‰ì„ ê°–ì¶˜ 노드가 없다면 새로운 노드를 í”„ë¡œë¹„ì „ 한다. 최소 노드 수와 최대 노드 수가 ì„¤ì •ë˜ì–´ì•¼ 한다. ---- CategoryDev