[[pagelist(^KubernetesINACTION)]] [[TableOfContents]] == ì¿ ë²„ë„¤í‹°ìŠ¤ 소개 == * p37 * 몇 ë…„ ì „ë§Œ 하ë”ë¼ë„ ëŒ€ë¶€ë¶„ì˜ ì†Œí”„íŠ¸ì›¨ì–´ 어플리케ì´ì…˜ì€ í•˜ë‚˜ì˜ í”„ë¡œì„¸ìŠ¤ ë˜ëŠ” 몇 ê°œì˜ ì„œë²„ì—ë¶„ì‚°ëœ í”„ë¡œì„¸ìŠ¤ë¡œ 실행ë˜ëŠ” 거대한 모놀리스(monolith)였다. * ì¿ ë² ì „ì—는 í†µí•©ì„ í•˜ë ¤ëŠ” 시ë„로 Hadoopë“±ì´ ê°ê´‘ì„ ë°›ê¸´í–ˆì—ˆì§€. ê·¼ë° ì´ê²ƒë„ 모노리스ë¼ê³ 해야하나 - [김준ì„] * ì €ëŠ” 하둡 ë‚´ì— ì—¬ëŸ¬ 로ì§ì´ ê°ê¸° atomic하게 ë³„ê°œì— service 로 구분 ë˜ì–´ 있지 않아서 모노리스ë¼ê³ ìƒê°í•©ë‹ˆë‹¤. ë¬¼ë¡ í”Œëž«í¼ì´ë¼ ì• ë§¤í•˜ê¸´ 합니다. - [bluemir] * p38 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 개발ìžê°€ ìš´ì˜ íŒ€ì˜ ë„움 ì—†ì´ë„ ìžì‹ ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì›í•˜ëŠ” ë§Œí¼ ìžì£¼ ë°°í¬í• 수 있ë„ë¡ í•œë‹¤. * DevOps는 ì €ì£¼ë‹¤ - [서지혜] * p39 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 하드웨어 ì¸í”„ë¼ë¥¼ ì¶”ìƒí™”í•˜ê³ ë°ì´í„° 센터 ì „ì²´ë¥¼ í•˜ë‚˜ì˜ ê±°ëŒ€í•œ 컴퓨팅 리소스로 ì œê³µí•œë‹¤ * ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ 하드웨어 ì¸í”„ë¼ë¥¼ ì¶”ìƒí™”하는 ë°©ë²•ë„ ë‚˜ì¤‘ì— ë‚˜ì˜¤ë ¤ë‚˜? ê¶ê¸ˆí•˜ë‹¤ - [서지혜] * yes, GCP ë„ autopilot ì´ë¼ëŠ” ê²ƒì„ ì œê³µí•˜ê³ , VM layer ì—†ì´ ë°”ë¡œ ì¶”ìƒí™” ê³„ì¸µì„ êµ¬ì„±í•˜ëŠ” ê²½ìš°ë„ ìžˆìŠµë‹ˆë‹¤. - [bluemir] * p40 * 모놀리스 어플리케ì´ì…˜ì˜ ì¼ë¶€ë¶„ì´ ìˆ˜í‰ì 으로 확장하기 매우 ì–´ë µê±°ë‚˜ ë¶ˆê°€ëŠ¥í•˜ê³ , ì–´ë–»ê²Œë“ ë¶„í• í• ìˆ˜ 없다면 ì „ì²´ 어플리케ì´ì…˜ì„ í™•ìž¥í• ìˆ˜ 없다. * MSAì˜ ê°€ìž¥ 중요한 기본 사ìƒì´ê¸´ 한ë°.. 모놀리틱한 ì¼€ì´ìФì—ë„ ì„œë¹„ìŠ¤ê°€ ì´ì •ë„ì¸ê±´ ê±°ì˜ ëª»ë³¸ê²ƒ ê°™ê³ , DBì— ëŒ€í•œ 예시지.. - [김준ì„] * 복잡한 ì¼€ì´ìФì—서는 사실ì´ê¸°ë„ 합니다. Message Queue 구조나, í˜¹ì€ Video encodingì—서는 ì´ê²Œ 불가능해서 ë¬¸ì œê°€ ë˜ëŠ” 경우가 있ë”ë¼êµ¬ìš”. - [bluemir] * p41 * 마ì´í¬ë¡œì„œë¹„스는 ì¼ë°˜ì 으로 RESTFul API를 ì œê³µí•˜ëŠ” HTTP와 ê°™ì€ ë™ê¸° í”„ë¡œí† ì½œê³¼ AMQP와 ê°™ì€ ë¹„ë™ê¸° í”„ë¡œí† ì½œë¡œ í†µì‹ í•œë‹¤. * ê° ë§ˆì´í¬ë¡œì„œë¹„스는 대체로 ì •ì ì¸ ì™¸ë¶€ API를 ì œê³µí•˜ëŠ” ë…립형 프로세스ì´ê¸° ë•Œë¬¸ì— ê°œë³„ì 으로 개발, ë°°í¬í• 수 있다. * ì´ë²ˆì— MSA를 추진하면서 ì 당한 í”„ë¡œí† ì½œì„ ì‚´íŽ´ë³´ê³ ìžˆëŠ”ë° AMQPë„ ì°¾ì•„ë´ì•¼ê² 다. MSA 지향하면서 왜 중앙화 ì‹œìŠ¤í…œì„ ì–˜ê¸°í•˜ëŠ”ê±´ì§€.. - [서지혜] * GRPC 쓰셔요.ã…Žã…Ž - AMQP 를 중앙화 해서 ì‚¬ìš©í• ìˆ˜ë„ ìžˆì§€ë§Œ ê° Serviceë³„ë¡œë„ ë¶„ë¦¬í•´ì„œ 다 따로 쓰는 ì¼€ì´ìŠ¤ë¥¼ ì—¼ë‘í•´ 둔것 ì•„ë‹ê¹Œìš”? ê·¸ë ‡ê²Œ 쓰는 ê²½ìš°ë„ ìžˆë”ë¼êµ¬ìš”. -[bluemir] * p44 * 시스템 관리ìžê°€ ìµœì‹ ë³´ì•ˆ 패치를 사용해 ì‹œìŠ¤í…œì„ ìµœì‹ ìƒíƒœë¡œ ìœ ì§€í•˜ëŠ” ë° ì£¼ì•ˆì ì„ ë‘는 ë° ë°˜í•´, ë§Žì€ ê°œë°œìžëŠ” ê·¸ë ‡ì§€ 않다는 ì ì´ ë‘ ì‹œìŠ¤í…œ ê°„ì˜ í° ì°¨ì´ë¥¼ 만들게 ëœë‹¤. * 우리 회사ì—서는 개발ìžë“¤ ê°„ì— ë³´ìˆ˜ì™€ 진보로 ë‚˜ë‰˜ì–´ì ¸ 싸우는걸 ë³´ëŠë¼ë©´ì€... 암호나 ì¼ë‹¨ ì œëŒ€ë¡œ 걸ë¼ê³ ìš” - [김준ì„] * p45 * 개발ìžê°€ 프로ë•ì…˜ 환경ì—서 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 실행하는 ë° ë” ë§Žì´ ê´€ì—¬í•˜ê²Œ ë˜ë©´, 사용ìžê°€ ë¬´ì—‡ì„ í•„ìš”ë¡œ í•˜ê³ ì–´ë–¤ ë¬¸ì œê°€ 있는지, ìš´ì˜ íŒ€ì´ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ìœ ì§€í•˜ë©´ì„œ ì§ë©´í•˜ëŠ” ë¬¸ì œê°€ 무엇ì¸ì§€ ë” ìž˜ ì´í•´í• 수 있다. * 개발ìžê°€ ìš´ì˜ë„ 하게ë˜ëŠ” DevOps는 ì €ì£¼ë‹¤ - [서지혜] * 풀스íƒì— ì´ì€ ì´ê´„ ë…¸ì˜ˆì˜ ìƒˆë¡œìš´ 단어 - [김준ì„] * p46 * 하드웨어 ì¸í”„ë¼ë¥¼ ì „í˜€ 알지 못하ë”ë¼ë„ ìš´ì˜ íŒ€ì„ ê±°ì¹˜ì§€ ì•Šê³ ê°œë°œìžê°€ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì§ì ‘ ë°°í¬í•˜ëŠ” ë°©ì‹ì´ 가장 ì´ìƒì ì´ë‹¤. ì´ë¥¼ 노옵스(NoOPs)ë¼ê³ 한다. * ì´ê±´ ë˜ ëì—¬ - [서지혜] * p47 * ê°€ìƒë¨¸ì‹ ì„ ì‚¬ìš©í•´ ê° ë§ˆì´í¬ë¡œì„œë¹„ìŠ¤ì˜ í™˜ê²½ì„ ê²©ë¦¬í•˜ëŠ” ëŒ€ì‹ ê°œë°œìžë“¤ì€ 리눅스 컨테ì´ë„ˆ ê¸°ìˆ ë¡œ ëˆˆì„ ëŒë ¸ë‹¤. * 컨테ì´ë„ˆì—서 실행ë˜ëŠ” 프로세스는 다른 ëª¨ë“ í”„ë¡œì„¸ìŠ¤ì™€ 마찬가지로 호스트 ìš´ì˜ì²´ì œ ë‚´ì—서 실행ëœë‹¤. 그러나 컨테ì´ë„ˆì˜ 프로세스는 ì—¬ì „ížˆ 다른 프로세스와 ê²©ë¦¬ë¼ ìžˆë‹¤. * ê°€ìƒë¨¸ì‹ ê³¼ 컨테ì´ë„ˆì˜ ì°¨ì´ê°€ ëì§€?! - [서지혜] * 컨테ì´ë„ˆë¥¼ ê°€ìƒë¨¸ì‹ ê³¼ 비êµí•˜ë©´ 컨테ì´ë„ˆëŠ” 훨씬 ë” ê°€ë²¼ì›Œì„œ ë™ì¼í•œ 하드웨어ì—서 ë” ë§Žì€ ìˆ˜ì˜ ì†Œí”„íŠ¸ì›¨ì–´ 구성 요소를 ì‹¤í–‰í• ìˆ˜ 있다. ê°€ìƒë¨¸ì‹ ì€ êµ¬ì„± 요소 프로세스ë¿ë§Œ ì•„ë‹ˆë¼ ì‹œìŠ¤í…œ 프로세스를 실행해야 하기 ë•Œë¬¸ì— ì¶”ê°€ 컴퓨팅 리소스가 필요하다. * ê°€ìƒë¨¸ì‹ ì´ ì»¨í…Œì´ë„ˆë³´ë‹¤ 무거운가 ë³´êµ°! - [서지혜] * ì œì¼ í° ì°¨ì´ëŠ” container는 kernel(ë° ì»¤ë„ ë©”ëª¨ë¦¬, 디바ì´ìФ 드ë¼ì´ë²„ 등등)ì„ ê³µìœ í•˜ì§€ë§Œ, VM ì€ ê·¸ë ‡ì§€ 않다는것ì´ì£ . 당연히 êµ¬ì¡°ìƒ container ê°€ 훨씬 lightweight 합니다. 다만 container 는 그냥 환경 ë…립ì ì¸ Process 로 보는게 ë” ì¢‹ê¸´ í•´ìš”. - [bluemir] * p49 * 컨테ì´ë„ˆëŠ” 호스트 OSì—서 실행ë˜ëŠ” ë™ì¼í•œ 커ë„ì—서 시스템 ì½œì„ ìˆ˜í–‰í•œë‹¤. * ê°€ìƒë¨¸ì‹ ì€ ê²ŒìŠ¤íŠ¸OSê°€ 하ì´í¼ë°”ì´ì €ë¡œ ì¶”ìƒí™”ëœ í˜¸ìŠ¤íŠ¸OS를 사용하지만 컨테ì´ë„ˆëŠ” 호스트OS를 ì§ì ‘ 사용하기 ë•Œë¬¸ì— ë” ê°€ë²¼ìš´ 거구나 - [서지혜] * ì´ ì»¤ë„ì€ í˜¸ìŠ¤íŠ¸ì˜ CPU ì—서 x86ì˜ ëª…ë ¹ì„ ìˆ˜í–‰í•˜ëŠ” ìœ ì¼í•œ 커ë„ì´ë‹¤. * 컨테ì´ë„ˆê°€ 커ë„ì— ì˜ì¡´ì„±ì´ 있는것으로 ë³´ì´ì§€ë§Œ, 리눅스 ê·œì•½ìƒ ì»¨í…Œì´ë„ˆëŠ” ìžì‹ ì´ ë¬¶ì¸ ì»¤ë„ì— ëŒ€í•œ 소스를 ì´ì§„ 코드로 ë‚´ë¶€ì 으로 ì–´ë–¤ ì»¤ë„ ë²„ì „ì—ì„œë„ í˜¸í™˜ë˜ê²Œ ê°€ì§€ê³ ìžˆê¸° ë•Œë¬¸ì— ì»¤ë„ ë²„ì „ì— ìƒê´€ì—†ì´ ë‚´ë¶€ 어플리케ì´ì…˜ì€ ëŒì•„갈수 있다.ê°€ ì •ë¡ ì¸ë°.. ì¿ ë² ì´ë¯¸ì§€ê°€ 우분투 14, 16, 18/ centOS ì™¸ì— ë³¸ì ì´ ì—†ì–´ì„œ ë»‘ë‚˜ëŠ”ì§€ë„ ëª¨ë¥´ê² ë„¤. - [김준ì„] * syscallë§Œ 호환ë˜ë©´ ë˜ì„œìš”. 다른 ì´ë¯¸ì§€ì“°ëŠ” ê²½ìš°ë„ ë§Žì´ ë´¤ì§€ë§Œ 뻑나는 경우는 못봤습니다. -[bluemir] * p51 * 컨테ì´ë„ˆ 격리를 가능하게 하는 메커니즘 소개 * ë‘ ê°€ì§€ 메커니즘으로 가능하다. * 첫 번째는 리눅스 네임스페ì´ìФ(namespace)로 ê° í”„ë¡œì„¸ìŠ¤ê°€ ì‹œìŠ¤í…œì— ëŒ€í•œ ë…ë¦½ëœ ë·°ë§Œ ë³¼ 수 있ë„ë¡ í•œë‹¤. ë‘ ë²ˆì§¸ëŠ” 리눅스 컨트롤 그룹(cgroups)으로, 프로세스가 ì‚¬ìš©í• ìˆ˜ 있는 ë¦¬ì†ŒìŠ¤ì˜ ì–‘ì„ ì œí•œí•œë‹¤. * 리눅스ì—서만 ë™ìž‘í• ê²ƒ ê°™ì€ ëŠë‚Œ - [서지혜] * yes, linux kernel ê¸°ìˆ ì´ë‹ˆê¹Œìš”. - [bluemir] * chroot와 다른ì ì€ ë§ˆìš´íŠ¸ 패스 ë¿ ì•„ë‹ˆë¼ ëª¨ë“ ë¦¬ì†ŒìŠ¤ì—대해 ì 용한다는것 - [김준ì„] * p52 * 컨테ì´ë„ˆ ê¸°ìˆ ì€ ì˜¤ëž«ë™ì•ˆ ì‚¬ìš©ë¼ ì™”ì§€ë§Œ ë„커 컨테ì´ë„ˆ 플랫í¼ì˜ 등장으로 ë” ë„리 ì•Œë ¤ì§€ê²Œ ë다. * Linux 컨테ì´ë„ˆ ê¸°ìˆ ì€ 2006년부터 연구ë˜ì–´ì™”ê³ , ë„커 초창기 ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 리눅스컨테ì´ë„ˆ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ì°¸ê³ í•˜ê³ ìžˆì—ˆë‹¤. 하지만 ìš”ì¦˜ì€ linux 컨테ì´ë„ˆì—서 ì œê³µë˜ì§€ 않는 기능과 ë²„ì „ 종ì†ì„±ì„ 벗어나기 위해 ë…ìžì ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 구축함 - [김준ì„] * p57 * 컨테ì´ë„ˆì˜ 프로세스가 기본 ë ˆì´ì–´ 중 í•˜ë‚˜ì— ìžˆëŠ” 파ì¼ì— ì“°ë©´ ì „ì²´ 파ì¼ì˜ ë³µì‚¬ë³¸ì˜ ìµœìƒìœ„ ë ˆì´ì–´ì— ë§Œë“¤ì–´ì§€ê³ í”„ë¡œì„¸ìŠ¤ëŠ” ë³µì‚¬ë³¸ì— ì“´ë‹¤. * 현재는 overlayFS2를 ì“°ê³ ìžˆëŠ”ê²ƒìœ¼ë¡œ 앎. 당근 ë²„ì „ì—…ì€ overlayFSì— ìŠ¤íŽ™ì„ ì¶”ê°€í•œê±°ê³ ë„커 ë²„ì „ì´ ì—…ë˜ë©´ ì‹ ê²½ì“¸ì¼ ì—†ìŒ. - [김준ì„] * p58 * ë¨¸ì‹ ì´ ë‹¤ë¥¸ ë²„ì „ì˜ ë¦¬ëˆ…ìŠ¤ 커ë„로 실행ë˜ê±°ë‚˜ ë™ì¼í•œ ì»¤ë„ ëª¨ë“ˆì„ ì‚¬ìš©í• ìˆ˜ 없는 경우 어플리케ì´ì…˜ì´ 실행 ë 수 없다. * 다른 ì»¤ë„ ë²„ì „ OSì—서 컨테ì´ë„ˆê°€ ì „í˜€ ëŒì•„가지 않는다는 소리를 좀 í•´ì•¼í• ê²ƒ ê°™ì€ë°. Linux Standard Base(LSB)로 ISO 표준 시스템 콜 APIì€ í˜¸í™˜ì´ ë˜ì–´ì„œ ë˜ê¸´í• 껀ë°.. 아마 minimum kernel ë²„ì „ì„ ìš”êµ¬í•˜ëŠ”ë°ë„ 있ì„ê±°ê³ .. https://en.wikipedia.org/wiki/Linux_Standard_Base - [김준ì„] * p59 * êµ¬ê¸€ì€ 10ë…„ë™ì•ˆ 보그와 오메가를 비밀로 ìœ ì§€í•˜ë‹¤ê°€ 2014ë…„ ë³´ê·¸, 오메가, 기타 ë‚´ë¶€ 구글 시스템으로 ì–»ì€ ê²½í—˜ì„ ê¸°ë°˜ìœ¼ë¡œ 하는 오픈소스 ì‹œìŠ¤í…œì¸ ì¿ ë²„ë„¤í‹°ìŠ¤ë¥¼ 출시했다. * êµ¬ê¸€ì´ Hadoop으로 배운게 컸나보네 - [서지혜] * p61 * 서비스 디스커버리, 스케ì¼ë§, 로드밸런싱, ìžê°€ ì¹˜ìœ , ë¦¬ë” ì„ ì¶œ ê°™ì€ ê²ƒë“¤ì´ í¬í•¨ëœë‹¤. * ë¦¬ë” ì„ ì¶œì€ ì²˜ìŒ ë“¤ì–´ë³´ë„¤ https://en.wikipedia.org/wiki/Leader_election ì´ê±° zookeeperê°€ ì‚¬ìš©í•œë‹¤ê³ ë˜ì–´ìžˆëŠ”ë° ì•ˆì¨ë´„, 69Pì— ë°©ë²•ì´ ë‚˜ì™€ìžˆë„¤ - [김준ì„] * Active stanbyë°©ì‹ì˜ ì¢€ë” ìžë™í™”ë˜ê³ 복잡한 ë²„ì „ 쯤 ë˜ëŠ”ê²ƒ 같아요 - [bluemir] * p62 * 마스터 노드는 ì „ì²´ ì¿ ë²„ë„¤ì´íЏ ì‹œìŠ¤í…œì„ ì œì–´í•˜ê³ ê´€ë¦¬í•˜ëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ 컨트롤 í”Œë ˆì¸ì„ 실행한다. 워커 노드는 ì‹¤ì œ ë°°í¬ë˜ëŠ” 컨테ì´ë„ˆ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 실행한다 * 마스터-워커 êµ¬ì„±ì€ í´ëŸ¬ìŠ¤í„° ì‹œìŠ¤í…œë“¤ì˜ ê¸°ë³¸ 아키í…ì³ë¡œêµ¬ë§Œ - [서지혜] * p63 * ì €ìžëŠ” (...) ë™ìž‘ ë°©ì‹ë¶€í„° 설명하는 ë°©ì‹ì„ 싫어한다. * 나는 지금 그게 ì•Œê³ ì‹¶ì€ë”” - [서지혜] * k8sì˜ leader electionì€ ê·¸ëƒ¥ ê·¼ë³¸ì€ etcd lease를 ì´ìš©í•´ì„œ timeout있는 lockì„ ì£¼ê¸°ì 으로 ê°±ì‹ í•˜ëŠ” 것 입니다. raft와 ìœ ì‚¬í•©ë‹ˆë‹¤. - [bluemir] * p66 * kube-proxy는 서비스를 ì œê³µí•˜ëŠ” ëª¨ë“ ì»¨í…Œì´ë„ˆì—서 서비스 ì—°ê²°ì´ ë¡œë“œë°¸ëŸ°ì‹±ë˜ë„ë¡ í•œë‹¤. * ë„¤íŠ¸ì›Œí¬ ì„¤ì •ì—서 í•´ë°©ì´ë‹¤ 만세!! - [김준ì„] * í•´ë³´ë©´ 아니ë”ë¼êµ¬ìš” ã…Žã…Žã…Ž kubeproxy ì˜ ë„¤íŠ¸ì›Œí¬ ì„¤ì •ì€ ë˜ í•´ì¤˜ì•¼ 합니다. - [bluemir] * p68 * ì¸í”„ë¼ì— ìž¥ì• ê°€ ë°œìƒí•œ 노드가 ì—†ì–´ë„ ì •ìƒì ì¸ ì‹œìŠ¤í…œ ìž‘ë™ì´ 가능하ë„ë¡ ì¶©ë¶„í•œ 예비 ìžì›ì´ 있는 경우 ìš´ì˜ íŒ€ì€ ìƒˆë²½ 3ì‹œì— ì¼ì–´ë‚œ ìž¥ì• ì— ì¦‰ì‹œ 대ì‘í• í•„ìš”ê°€ 없다. * ë™ë‚¨ì•„ê°€ ì œë°œ 하드좀 잘 관리해줬으면.. 예비 ìžì›ì¢€ - [김준ì„] * 요건 트루입니다. ì´ëŸ¬ì €ëŸ° ìš´ì˜ ìžë™í™”를 통해서 95% ì´ìƒì˜ ì´ë²¤íŠ¸ëŠ” ìžë™ ì²˜ë¦¬í• ìˆ˜ ìžˆê³ , 나머지는 다ìŒë‚ ë´ë„ ë ì •ë„... == ë„커와 ì¿ ë²„ë„¤í‹°ìŠ¤ ì²«ê±¸ìŒ == === ë„커를 사용한 컨테ì´ë„ˆ ì´ë¯¸ì§€ ìƒì„±, 실행, ê³µìœ í•˜ê¸° === * p73 * [busybox]( https://en.wikipedia.org/wiki/BusyBox)는 echo, ls, gzip 등과 ê°™ì€ í‘œì¤€ UNIX ëª…ë ¹ì¤„ ë„êµ¬ë“¤ì„ í•©ì³ ë†“ì€ ë‹¨ì¼ ì‹¤í–‰íŒŒì¼(executable)ì´ë¼ í• ìˆ˜ 있다. * busybox는 ubuntu ë¶€íŒ…í• ë•Œ ì ‘í•´ë³¼ìˆ˜ ìžˆëŠ”ë° ê°œë³„ ëª…ë ¹ì–´ ëŒ€ì‹ busybox로 대체한다. 부팅디스í¬ë¥¼ ì´ìš©í•œ OS 구ë™ë•ŒëŠ” ramì— ê³µê°„ì„ ë§Œë“œëŠ”ë°, 빡빡하게 ìš©ëŸ‰ì„ ê´€ë¦¬í•˜ê¸° ë•Œë¬¸ì— busybox를 쓴다. - [김준ì„] * p76 {{{ FROM node:7 ADD app.js /app.js ENTRYPOINT ["node", "app.js"] }}} * Dockerfileì„ ì“´ì§€ 오래ë˜ê¸´ 했다. - [김준ì„] * p79 * ì´ë¯¸ì§€ë¼ëŠ” ê²ƒì´ í•˜ë‚˜ì˜ í° ë°”ì´ë„ˆë¦¬ ë©ì–´ë¦¬ê°€ ì•„ë‹ˆë¼ ì—¬ëŸ¬ê°œì˜ ë ˆì´ì–´ë¡œ 구성ëœë‹¤ëŠ” ê²ƒì„ ì•„ë§ˆë„ ëˆˆì¹˜ì±˜ì„ ê²ƒì´ë‹¤. 서로 다른 ì´ë¯¸ì§€ê°€ 여러 ê°œì˜ ë ˆì´ì–´ë¥¼ ê³µìœ í• ìˆ˜ 있기 ë•Œë¬¸ì— ì´ë¯¸ì§€ì˜ ì €ìž¥ê³¼ ì „ì†¡ì— íš¨ê³¼ì ì´ë‹¤. * 기본 ì´ë¯¸ì§€ë¥¼ 구성하는 ëª¨ë“ ë ˆì´ì–´ëŠ” 단 한 번만 ì €ìž¥ë 것ì´ë‹¤. ë˜í•œ ì´ë¯¸ì§€ë¥¼ ê°€ì ¸ì˜¬ ë•Œë„ ë„커는 ê° ë ˆì´ì–´ë¥¼ 개별ì 으로 다운로드 한다. ì»´í“¨í„°ì— ì—¬ëŸ¬ê°œì˜ ë ˆì´ì–´ê°€ ì´ë¯¸ ì €ìž¥ë¼ ìžˆë‹¤ë©´ ë„커는 ì €ìž¥ë˜ì§€ ì•Šì€ ë ˆì´ì–´ë§Œ 다운로드 한다. * p80 * Dockerfileì„ ì´ìš©í•˜ëŠ” ê²ƒì´ í›¨ì”¬ 반복 ê°€ëŠ¥í•˜ê³ ì´ë¯¸ì§€ 빌드를 ìžë™í™”í• ìˆ˜ 있는 방법ì´ë‹¤. * image commit하는 ì‚¬ëžŒë„ ì˜ì™¸ë¡œ 많다. - [김준ì„] * 그러면 ë‚˜ì¤‘ì— CI는 ì–´ì©Œë ¤ê³ ... gitë„ ì•„ë‹ˆê³ .. - [bluemir] * p82 {{{ $ docker exec -it kubia-container bash }}} * 당연히 ë„커가 í•œë²ˆì— ëŒì•„가지 ì•Šê¸°ë•Œë¬¸ì— ê°€ìž¥ ë§Žì´ ì“°ëŠ” 구문 - [김준ì„] * p84 * 컨테ì´ë„ˆëŠ” ìžì²´ 리눅스 PID 네임스페ì´ìŠ¤ë¥¼ 사용하며 ê³ ìœ ì˜ ì‹œí€€ìŠ¤ 번호를 ê°€ì§€ê³ ì™„ì „ížˆ ë¶„ë¦¬ëœ í”„ë¡œì„¸ìŠ¤ 트리를 ê°–ê³ ìžˆë‹¤. * containerì˜ PID ë°‘ Conatainer ë‚´ë¶€ init 프로세스를 기준으로 treeê°€ ìƒê¸´ë‹¤. - [김준ì„] * ê²©ë¦¬ëœ í”„ë¡œì„¸ìŠ¤ë¥¼ 가진 것과 마찬가지로 ê° ì»¨í…Œì´ë„ˆëŠ” ê²©ë¦¬ëœ íŒŒì¼ì‹œìŠ¤í…œì„ ê°–ê³ ìžˆë‹¤. * default 위치로 hostì—서 ì ‘ê·¼ì„ í• ìˆ˜ 있는것으로 ì•Œê³ ìžˆê³ íŒŒì¼ êµí™˜ì„ 위한 mount pathì§€ì •ë„ ê°€ëŠ¥ - [김준ì„] * p85 * ìž‘ì—…ì„ ë‹¨ìˆœí™”í•˜ê¸° 위해 사설 ì´ë¯¸ì§€ ë ˆì§€ìŠ¤íŠ¸ë¦¬ë¥¼ ì„¤ì •í•˜ê¸°ë³´ë‹¤ëŠ” 공개ì 으로 ì‚¬ìš©í• ìˆ˜ 있는 ë ˆì§€ìŠ¤íŠ¸ë¦¬ 중 í•˜ë‚˜ì¸ ë„커 í—ˆë¸Œì— ì´ë¯¸ì§€ë¥¼ 푸시한다. * 사설 ì´ë¯¸ì§€ ë ˆì§€ìŠ¤íŠ¸ë¦¬ê°€ ì¤‘ìš”í•œë° - [김준ì„] === ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„° 설치 === * ì§ì ‘ ì„¤ì¹˜í•´ë³´ìž - [서지혜] * p87 * 세 번째 ì˜µì…˜ì€ kubeadm ë„구를 사용해 í´ëŸ¬ìŠ¤í„°ë¥¼ 설치하는 방법으로, ë¶€ë¡Bì—서 설명한다. ì´ ì±…ì˜ 11장까지 ì½ì–´ë³¸ ë’¤ 시ë„í•´ë³¼ ê²ƒì„ ì¶”ì²œí•œë‹¤. * ì´ê±¸ ì œì¼ ë§Žì´ ì“°ëŠ”ê²ƒ ê°™ì€ë° - [김준ì„] * ë˜ ë‹¤ë¥¸ ì˜µì…˜ì€ AWSì— ì¿ ë²„ë„¤í‹°ìŠ¤ë¥¼ 설치하는 것ì´ë‹¤. * 로드 í…ŒìŠ¤íŠ¸í• ë•Œ AWSì— êµ¬ì„±ëœê±¸ 사용하ë”ë¼ - [김준ì„] * p89 * darwinì„ windows로 ë³€ê²½í•˜ê³ ë§¨ ë’¤ì— .exe를 추가한다. * 왜 macì˜ darwinì´ ê¸°ë³¸ì¸ê°€? * p91 * 빌ë§ì„ 활성화한다. ì‹ ìš©ì¹´ë“œ ì •ë³´ê°€ 필요하지만 êµ¬ê¸€ì€ 12개월 무료 í‰ê°€íŒì„ ì œê³µí•œë‹¤. * ìžë‚˜ê¹¨ë‚˜ ë¹Œë§ ì¡°ì‹¬ - [김준ì„] * p92 * ê° ë…¸ë“œëŠ” ë„커, kubelet, kube-proxy를 실행한다. * ë„ì»¤ìœ„ì— kubelet, kube-proxyê°€ 올ë¼ê°€ìžˆëŠ”ê±°ì˜€ë˜ê°€ - [김준ì„] * êµ¬ì„±ì— ë”°ë¼ ë‹¤ë¥¼ìˆ˜ëŠ” ìžˆëŠ”ë° ì¼ë°˜ì 으로 kubelet ì€ ë³„ë„systemdaemon 으로 kube-proxy 는 pod으로 올ë¼ê°‘니다. - [bluemir] * p94 * kubectl alias와 ëª…ë ¹ì¤„ ìžë™ì™„성 ì„¤ì •í•˜ê¸° * kubectl kubectl 계ì†ì¹˜ë©´ k로 alias를 하게 ë˜ë”ë¼ - [김준ì„] * k와 ê°™ì€ ì§§ì€ ë³„ì¹ì„ 사용하ë”ë¼ë„ ìƒê°ë³´ë‹¤ ë§Žì€ ëª…ë ¹ì–´ë¥¼ ìž…ë ¥í•´ì•¼ 한다. * ë‹¤ë¥¸ê²ƒë„ ë‹¤ alias를.. - [김준ì„] === ì¿ ë²„ë„¤í‹°ìŠ¤ì— ì²« 번째 ì• í”Œë¦¬ì¼€ì´ì…˜ 실행하기 === * p97 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 개별 컨테ì´ë„ˆë“¤ì„ ì§ì ‘ 다루지 않는다. ëŒ€ì‹ í•¨ê¼ ë°°ì¹˜ëœ ë‹¤ìˆ˜ì˜ ì»¨í…Œì´ë„ˆë¼ëŠ” ê°œë…ì„ ì‚¬ìš©í•œë‹¤. ì´ ì»¨í…Œì´ë„ˆì˜ ê·¸ë£¹ì˜ ì´ë¦„ì„ íŒŒë“œë¼ê³ 한다. * POD는 ì—¬ëŸ¬ê°œì˜ ì»¨í…Œì´ë„ˆê°€ 들어갈수 있ìŒ. - [김준ì„] * ê° íŒŒë“œëŠ” ìžì²´ IP, 호스트 ì´ë¦„, 프로세스 ë“±ì´ ìžˆëŠ” 논리ì 으로 ë¶„ë¦¬ëœ ë¨¸ì‹ ì´ë‹¤. * ë¨¸ì‹ ì´ì§€ë§Œ osê°€ 없는 ëŠë‚Œ? ìžì›ê´€ë¦¬ ë“±ì„ ë‹¤ ìƒìœ„ì—서 해주니 논리ì 으로 ë¨¸ì‹ ì´ê¸°ë§Œ 함 - [김준ì„] * 요건 ì˜¤í•´ì˜ ì†Œì§€ê°€ 있는 설명ì´ê¸´ 하네요. ì´í•´ë¥¼ ë•기위해 ì˜ë„ì ì¸ ì™œê³¡ì¸ê²ƒ 같긴 하지만... - [bluemir] * p98 * ` kubectl get pods ` * kgp - [김준ì„] * p99 * kubectl ëª…ë ¹ì–´ë¥¼ 실행하면 ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ API 서버로 REST HTTP ìš”ì²ì„ ì „ë‹¬í•˜ê³ í´ëŸ¬ìŠ¤í„°ì— ìƒˆë¡œìš´ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ 오브ì 트를 ìƒì„±í•œë‹¤. * í´ë¼ì´ì–¸íЏ -> 서버 -> ëª…ë ¹ 수행 - [김준ì„] * p100 * 외부ì—서 íŒŒë“œì— ì ‘ê·¼ì„ ê°€ëŠ¥í•˜ê²Œ í•˜ë ¤ë©´ 서비스 오브ì 트를 통해 노출해야 한다. * 서비스 í• ë‹¹? - [김준ì„] * 파드와 마찬가지로 ì¼ë°˜ì ì¸ ì„œë¹„ìŠ¤(Cluster IP 서비스)를 ìƒì„±í•˜ë©´ ì´ê²ƒì€ í´ëŸ¬ìŠ¤í„° ë‚´ë¶€ì—서만 ì ‘ê·¼ 가능하기 ë•Œë¬¸ì— Load Balancer ìœ í˜•ì˜ íŠ¹ë³„í•œ 서비스를 ìƒì„±í•´ì•¼ 한다. * 로드밸런서 ìƒì„±ì€ ì²˜ìŒ ë³¸ë“¯ - [김준ì„] * 외부ì—서 Traffic ë°›ì„ë ¤ë©´ 가장 simple한 방법ì´ë¼... ì˜¤ížˆë ¤ node port ë°©ì‹ì´ ë” ë“œë¬¼ê¸´ 합니다. - [bluemir] * p101 * {{{ kubectl expose rc kubia --type=LoadBalancer --name kubia-http }}} * {{{ kubernetes ì„œë¹„ìŠ¤ì— ê´€í•œ ì„¤ëª…ì€ ìƒëžµ }}} * p103 * kubectl run ëª…ë ¹ì„ ìˆ˜í–‰í•˜ë©´ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ë¥¼ ìƒì„±í•˜ê³ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ê°€ ì‹¤ì œ 파드를 ìƒì„±í•œë‹¤. * ë„어쓰기 좀.. - [서지혜] * 마스터 노드가 ë‹¨ì¼ ë§ˆìŠ¤í„° 노드ì—서 호스팅 중ì¸ì§€ í˜¹ì€ ì—¬ëŸ¬ ëŒ€ì˜ ë§ˆìŠ¤í„° ë…¸ë“œì— ë¶„ì‚°ëœ ê²ƒì¸ì§€ 알 수 없다. * p104 * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ëŠ” 사ë¼ì§„ 파드를 대체하기 위해 새로운 파드를 ìƒì„±í• 것ì´ë‹¤. * 파드는 ì¼ì‹œì (ephermeral)ì´ë‹¤. * 새로운 파드는 다른 IP 주소를 í• ë‹¹ë°›ëŠ”ë‹¤. ì´ê²ƒì´ 바로 서비스가 필요한 ì´ìœ 다. * p106 * {{{ kubectl scale rc kubia --replicas=3 }}} * {{{ kubectl get rc }}} * p107 * 서비스는 다수 파드 앞ì—서 로드밸런서 ì—í• ì„ í•œë‹¤. 파드가 하나만 있으면 서비스는 ì´ íŒŒë“œ í•˜ë‚˜ì— ì •ì 주소를 ì œê³µí•œë‹¤. * p109 * ì–´ë–¤ ë…¸ë“œì— íŒŒë“œê°€ 스케줄ë§ë는지 ê¶ê¸ˆí• 수 있다. ì¿ ë²„ë„¤í‹°ìŠ¤ì—서는 파드가 ì ì ˆížˆ 실행하는 ë° í•„ìš”í•œ CPU와 메모리를 ì œê³µí•˜ëŠ” ë…¸ë“œì— ìŠ¤ì¼€ì¤„ë§ë다면, ì–´ë–¤ ë…¸ë“œì— íŒŒë“œê°€ 실행 중ì¸ì§€ëŠ” 중요하지 않다. * 파드를 ì¡°íšŒí• ë•Œ 파드 IP와 실행 ì¤‘ì¸ ë…¸ë“œ 표시하기 * {{ $ kubectl get pods -o wide }}} * p110 * ì¿ ë²„ë„¤í‹°ìŠ¤ ë˜í•œ 꽤 ë©‹ì§„ 웹 대시보드를 함께 ì œê³µí•œë‹¤ëŠ” ì ì„ ì•Œê²Œ ë˜ë©´ 기ë»í• 것ì´ë‹¤. * ì‹¤ì œë¡œ 하드하게 ì¨ë³´ë©´ 별로 안기ì˜ë”ë¼êµ¬ìš” - [bluemir] == 파드: ì¿ ë²„ë„¤í‹°ìŠ¤ì—서 컨테ì´ë„ˆ 실행 == === 파드 소개 === * p114 * 파드는 함께 ë°°ì¹˜ëœ ì»¨í…Œì´ë„ˆ 그룹ì´ë©° ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ ê¸°ë³¸ 빌딩 블ë¡ì´ë‹¤. * ëª¨ë“ ì»¨í…Œì´ë„ˆëŠ” í•ìƒ í•˜ë‚˜ì˜ ì›Œì»¤ 노드ì—서 실행ë˜ë©° 여러 워커 ë…¸ë“œì— ê±¸ì³ ì‹¤í–‰ë˜ì§€ 않는다. * ê¶ê¸ˆí–ˆë˜ 부분. 리소스를 테트리스는 ì–´ë ¤ìš´ê±°êµ° - [서지혜] * IPC í˜¹ì€ ë¡œì»¬ 파ì¼ì„ 통해 í†µì‹ í•˜ëŠ” 여러 프로세스로 구성ë¼, ê°™ì€ ë…¸ë“œì—서 실행해야 하는 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ìƒìƒí•´ë³´ìž. * ëª¨ë“ í”„ë¡œì„¸ìŠ¤ëŠ” ë™ì¼í•œ 표준 ì¶œë ¥ìœ¼ë¡œ 로그를 기ë¡í•˜ê¸° ë•Œë¬¸ì— ì–´ë–¤ 프로세스가 남긴 로그ì¸ì§€ 파악하는 ê²ƒì´ ë§¤ìš° ì–´ë µë‹¤. * p116 * UTC 네임스페ì´ìФ * 비슷하게 íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆëŠ” ë™ì¼í•œ IPC 네임스페ì´ìФ 아래ì—서 ì‹¤í–‰ë˜ IPC를 통해 서로 í†µì‹ í• ìˆ˜ 있다. * 플랫한 ê³µìœ ë„¤íŠ¸ì›Œí¬ ì£¼ì†Œ ê³µê°„ì— ìƒì£¼í•˜ë¯€ë¡œ ëª¨ë“ íŒŒë“œëŠ” 다른 íŒŒë“œì˜ IP주소를 사용해 ì ‘ê·¼í•˜ëŠ” ê²ƒì´ ê°€ëŠ¥í•˜ë‹¤. * p117 * 파드 사ì´ì—서 í†µì‹ ì€ í•ìƒ ë‹¨ìˆœí•˜ë‹¤. ë‘ íŒŒë“œê°€ ë™ì¼ í˜¹ì€ ì„œë¡œ 다른 워커 ë…¸ë“œì— ìžˆëŠ”ì§€ëŠ” 중요하지 않으며, ë‘ ê²½ìš° ëª¨ë‘ íŒŒë“œ ì•ˆì— ìžˆëŠ” 컨테ì´ë„ˆëŠ” NAT 없는 플랫 네트워í¬ë¥¼ 통해 서로 í†µì‹ í•˜ëŠ” ê²ƒì´ ê°€ëŠ¥í•˜ë‹¤, * ì´ê±° 파드 하나 들어가서 다른 서비스들 다 털 수 있는거 아닙니까 - [서지혜] * ì‹¤ì œ 공격 기법입니다. 그래서 node를 분리하거나 gVisor를 쓰거나 policy based network 로 보완하거나 합니다. - [bluemir] * ì´ê²ƒì€ ì‹¤ì œ 노드 ê°„ ë„¤íŠ¸ì›Œí¬ í† í´ë¡œì§€ì™€ 관계없ì´, 근거리 네트워í¬ì— 있는 컴퓨터 ê°„ì˜ í†µì‹ ê³¼ 비슷하다. * 파드는 논리ì ì¸ í˜¸ìŠ¤íŠ¸ë¡œì„œ 컨테ì´ë„ˆê°€ 아닌 환경ì—ì„œì˜ ë¬¼ë¦¬ì 호스트 í˜¹ì€ VMê³¼ 매우 ìœ ì‚¬í•˜ê²Œ ë™ìž‘한다. * p118 * 파드ì—서 컨테ì´ë„ˆì˜ ì ì ˆí•œ 구성 * 파드는 스케ì¼ë§ì˜ 기본 단위다. * ìµœê·¼ì— ì—¬ëŸ¬ 파드로 ìª¼ê°œë†“ì€ ì„œë²„ë“¤ì„ êµ³ì´ êµ³ì´ í•œ 파드로 ë§Œë“¤ì–´ë†“ì€ ê±¸ ë³´ê³ ì˜ì•„í–ˆë˜ ê¸°ì–µ - [서지혜] * ëª¨ë†€ë¦¬í‹±ì— ìµìˆ™í•œ ë¶„ë“¤ì„ ìžì£¼ ê·¸ë ‡ê²Œ 구성하시ë”ë¼êµ¬ìš”. pod ì„ í•˜ë‚˜ì˜ ê°€ìƒë¨¸ì‹ ì´ë¼ê³ 설명하면 ì´ëŸ° 오용/남용 ë“¤ì´ ìƒê¸°ê¸° 쉬운것 같습니다. - [bluemir] * p119 * í”„ë¡ íŠ¸ì—”ë“œ 구성 요소는 백엔드와 ì™„ì „ížˆ 다른 스케ì¼ë§ 요구 사í•ì„ ê°–ê³ ìžˆì–´ 개별ì 으로 확장하는 ê²½í–¥ì´ ìžˆë‹¤. * 사ì´íŠ¸ì¹´ 컨테ì´ë„ˆì˜ 다른 ì˜ˆì œë¡œëŠ” 로그 로테ì´í„°ì™€ 수집기, ë°ì´í„° 프로세서, í†µì‹ ì–´ëŒ‘í„° ë“±ì´ ìžˆë‹¤. === YAMLë˜ëŠ” JSON 디스í¬ë¦½í„°ë¡œ 파드 ìƒì„± === * p121 * {{{ $ kubectl get po kubia-zxzij -o yaml }}} * podì˜ ì•½ìž... - [서지혜] * p123 * ê±°ì˜ ëª¨ë“ ì¿ ë²„ë„¤í‹°ìŠ¤ 리소스가 ê°–ê³ ìžˆëŠ” 세 가지 중요한 ë¶€ë¶„ì´ ìžˆë‹¤. Metadata, spec, status * Metadata: ì´ë¦„, 네임스페ì´ìФ, ë ˆì´ë¸” ë° íŒŒë“œì— ê´€í•œ 기타 ì •ë³´ë¥¼ í¬í•¨í•œë‹¤. * Spec: 파드 컨테ì´ë„ˆ, 볼륨, 기타 ë°ì´í„° 등 파드 ìžì²´ì— 관한 ì‹¤ì œ 명세를 가진다. * Status: 파드 ìƒíƒœ, ê° ì»¨í…Œì´ë„ˆ 설명과 ìƒíƒœ, 파드 ë‚´ë¶€ IP, 기타 기본 ì •ë³´ 등 현재 실행 ì¤‘ì¸ íŒŒë“œì— ê´€í•œ 현재 ì •ë³´ë¥¼ í¬í•¨í•œë‹¤. * p125 * {{{ kubectl explain }}} * p126 * {{{ $ kubectl create -f kubia-manual.yaml }}} * p128 * {{{ $ kubectl logs kubia-manual -c kubia }}} === ë ˆì´ë¸”ì„ ì´ìš©í•œ 파드 구성 === * p130 * 파드 수가 ì¦ê°€í•¨ì— ë”°ë¼ íŒŒë“œë¥¼ 부분 집합으로 ë¶„ë¥˜í• í•„ìš”ê°€ 있다. * p131 * ë ˆì´ë¸”ì€ ë¦¬ì†ŒìŠ¤ì— ì²¨ë¶€í•˜ëŠ” 키-ê°’ ìŒìœ¼ë¡œ, ì´ ìŒì€ ë ˆì´ë¸” ì…€ë ‰í„°ë¥¼ 사용해 리소스를 ì„ íƒí• 때 활용ëœë‹¤. * p133 * kubectl get pods ëª…ë ¹ì€ ë ˆì´ë¸”ì„ í‘œì‹œí•˜ì§€ 않는 ê²ƒì´ ê¸°ë³¸ê°’ì´ë¼ --show-labels 스위치를 사용해 ë ˆì´ë¸”ì„ ë³¼ 수 있다. * ëª¨ë“ ë ˆì´ë¸”ì„ ë‚˜ì˜í•˜ëŠ” ëŒ€ì‹ íŠ¹ì • ë ˆì´ë¸”ì—ë§Œ 관심 있는 경우 해당 ë ˆì´ë¸”ì„ -L 스위치로 ì§€ì •í•´ ê° ë ˆì´ë¸”ì„ ìžì²´ ì—´ì— í‘œì‹œí• ìˆ˜ 있다. === ë ˆì´ë¸” ì…€ë ‰í„°ë¥¼ ì´ìš©í•´ 파드 부분 ì§‘í•© 나열 === * p135 * {{{ $ kubectl get po -l creation_method=manual }}} * {{{ $ kubectl get po -l '!env' }}} * p137 * ë ˆì´ë¸” ì…€ë ‰í„°ëŠ” 파드 목ë¡ì„ 나열하는 것ë¿ë§Œ 아니ë¼, 파드 부분 ì§‘í•©ì— ìž‘ì—…ì„ ìˆ˜í–‰í• ë•Œë„ ìœ ìš©í•˜ë‹¤. * p139 * ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ ì „ì²´ì ì¸ ì•„ì´ë””어는 ê·¸ ìœ„ì— ì‹¤í–‰ë˜ëŠ” ì• í”Œë¦¬ì¼€ì´ì…˜ìœ¼ë¡œë¶€í„° ì‹¤ì œ ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ë¥¼ 숨기는 ê²ƒì— ìžˆê¸°ì— íŒŒë“œê°€ ì–´ë–¤ ë…¸ë“œì— ìŠ¤ì¼€ì¤„ë§ ë¼ì•¼ 하는지 구체ì 으로 ì§€ì •í•˜ê³ ì‹¶ì§€ëŠ” ì•Šì€ ê²ƒì´ë‹¤. 그로 ì¸í•´ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ì— ê²°í•©ë˜ê¸° 때문ì´ë‹¤. 그러나 ì •í™•í•œ 노드를 ì§€ì •í•˜ëŠ” ëŒ€ì‹ í•„ìš”í•œ 노드 요구 사í•ì„ ê¸°ìˆ í•˜ê³ ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ 요구 사í•ì„ ë§Œì¡±í•˜ëŠ” 노드를 ì„ íƒí•˜ë„ë¡ í•œë‹¤. ì´ëŠ” 노드 ë ˆì´ë¸”ê³¼ ë ˆì´ë¸” ì…€ë ‰í„°ë¥¼ 통해 í• ìˆ˜ 있다. * 노드를 í¬í•¨í•œ ëª¨ë“ ì¿ ë²„ë„¤í‹°ìŠ¤ 오브ì íŠ¸ì— ë ˆì´ë¸”ì„ ë¶€ì°©í• ìˆ˜ 있다. === íŒŒë“œì— ì–´ë…¸í…Œì´ì…˜ 달기 === * p141 * ë ˆì´ë¸”ì€ ì˜¤ë¸Œì 트를 묶는 ë° ì‚¬ìš©í• ìˆ˜ 있지만, 어노테ì´ì…˜ì€ ê·¸ë ‡ê²Œ í• ìˆ˜ 없다. * p142 * ë ˆì´ë¸”ì—는 ì§§ì€ ë°ì´í„°ë¥¼, ê·¸ì— ë¹„í•´ 어노테ì´ì…˜ì—는 ìƒëŒ€ì 으로 í° ë°ì´í„°ë¥¼ ë„£ì„ ìˆ˜ 있다(ì´ 256kb)까지. * ë ˆì´ë¸”ì€ 63 char 로 ì œí•œë˜ë”ë¼ - [김준ì„] * ETCD 키 ê°’ì´ì–´ì„œ 그래요. ì¸ë±ì‹±í•˜ë ¤ë‹¤ 보니... - [bluemir] === 네임스페ì´ìŠ¤ë¥¼ 사용한 리소스 그룹화 === * p143 * 여러 네임스페ì´ìŠ¤ë¥¼ 사용하면 ë§Žì€ êµ¬ì„± 요소를 가진 복잡한 ì‹œìŠ¤í…œì„ ì¢€ ë” ìž‘ì€ ê°œë³„ 그룹으로 ë¶„ë¦¬í• ìˆ˜ 있다. ë˜í•œ 멀티테넌트 환경처럼 리소스를 분리하는 ë° ì‚¬ìš©ëœë‹¤. * 리소스 ì´ë¦„ì€ ë„¤ìž„ìŠ¤íŽ˜ì´ìФ 안ì—서만 ê³ ìœ í•˜ë©´ ëœë‹¤. * p145 * 네임스페ì´ìŠ¤ë¥¼ 사용해 서로 관계없는 리소스를 겹치지 않는 그룹으로 ë¶„ë¦¬í• ìˆ˜ 있다. === 파드 중지와 ì œê±° === * p148 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” SIGTERM ì‹ í˜¸ë¥¼ í”„ë¡œì„¸ìŠ¤ì— ë³´ë‚´ê³ ì§€ì •ëœ ì‹œê°„(기본값 30ì´ˆ) ë™ì•ˆ 기다린다. 시간 ë‚´ì— ì¢…ë£Œë˜ì§€ 않으면 SIGKILL ì‹ í˜¸ë¥¼ 통해 종료한다. 프로세스가 í•ìƒ ì •ìƒì 으로 종료ë˜ê²Œ 하기 위해서는 SIGTERM ì‹ í˜¸ë¥¼ 올바르게 처리해야 한다. * p151 * {{{ $ kubectl delete all -all }}} == ë ˆí”Œë¦¬ì¼€ì´ì…˜ê³¼ ê·¸ ë°–ì˜ ì»¨íŠ¸ë¡¤ëŸ¬: 관리ë˜ëŠ” 파드 ë°°í¬ == === 파드를 ì•ˆì •ì 으로 ìœ ì§€í•˜ê¸° === * p154 * 컨테ì´ë„ˆì˜ 주 í”„ë¡œì„¸ìŠ¤ì— í¬ëž˜ì‹œ(crash)ê°€ ë°œìƒí•˜ë©´ Kubeletì´ ì»¨í…Œì´ë„ˆë¥¼ 다시 시작한다. * 컨테ì´ë„ˆê°€ 서브 Processë¼ì„œ 모니터ë§ì´ 가능한듯 - [김준ì„] * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 무한 루프나 êµì°© ìƒíƒœì— ë¹ ì ¸ì„œ ì‘ë‹µì„ í•˜ì§€ 않는 ìƒí™©ì´ë¼ë©´ 어떨까? ì´ëŸ° 경우 ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 다시 시작ë˜ë„ë¡ í•˜ë ¤ë©´ ì• í”Œë¦¬ì¼€ì´ì…˜ ë‚´ë¶€ì˜ ê¸°ëŠ¥ì— ì˜ì¡´í•˜ì§€ ë§ê³ 외부ì—서 ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ ìƒíƒœë¥¼ ì²´í¬í•´ì•¼í•œë‹¤. * 우리 íšŒì‚¬ì‚¬ëžŒë“¤ì€ ë‹¤ ë‚´ë¶€ì—서 가능한걸로 ë´„. - [김준ì„] * p155 * íŒŒë“œì˜ ìŠ¤íŽ™ì— ê° ì»¨í…Œì´ë„ˆì˜ ë¼ì´ë¸Œë‹ˆìФ 프로브를 ì§€ì •í• ìˆ˜ 있다. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 주기ì 으로 프로브를 ì‹¤í–‰í•˜ê³ í”„ë¡œë¸Œê°€ ì‹¤íŒ¨í• ê²½ìš° 컨테ì´ë„ˆë¥¼ 다시 시작한다. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 세가지 ë§¤ì»¤ë‹ˆì¦˜ì„ ì‚¬ìš©í•´ 컨테ì´ë„ˆì— 프로브를 실행한다. HTTP GET / TCP 소켓 / Exec * ì•„ë¬´ëž˜ë„ HTTP GETì´ RESTì— ë§žê² ì§€ - [김준ì„] * 네, íŠ¹ì •ë²„ì „ì˜ exec 는 hang ë˜ëŠ” ë¬¸ì œê°€ ìžˆê³ , TCP 는 단지 socket listen ì´ë¼ warmup ë¬¸ì œê°€ 있습니다. - [bluemir] * 최근ì—는 startup Probe ë¼ëŠ” 시작ë 때 warmup ìƒí™©ë“±ì„ 별ë„로 ì²´í¬í• ìˆ˜ë„ ìžˆì–´ìš” - [bluemir] * p157 * {{{ $ kubectl logs mypod --previous }}} * Cheat sheet 추가 - [김준ì„] * `kubectl logs -p` ë„ ë©ë‹ˆë‹¤. `kubectl logs -l {ë¼ë²¨}`ë„ ê½¤ ìœ ìš©í•©ë‹ˆë‹¤. - [bluemir] * ìˆ«ìž 137ì€ ë‘ ìˆ«ìžë¥¼ 합한 값으로, 128 + X 다. * ìœ ìš©í•œ ì •ë³´ +1 SIGTERM(15) SIGKILL(9) - [김준ì„] === ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ 소개 === * p154 * 컨테ì´ë„ˆì˜ 주 í”„ë¡œì„¸ìŠ¤ì— í¬ëž˜ì‹œê°€ ë°œìƒí•˜ë©´ Kubleletì´ ì»¨í…Œì´ë„ˆë¥¼ 다시 시작한다. * 컨테ì´ë„ˆ 모니터ë§ì€ 어떻게 하는걸까 - [서지혜] * ë‚´ë¶€ 구현으로는 `docker inspect` 입니다. docker inspect 는 container ë‚´ì˜ 1번 processì˜ ì¢…ë£Œì—¬ë¶€ë¡œ 종료를 íŒë‹¨í•©ë‹ˆë‹¤. - [bluemir] * p155 * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ë” ì´ìƒ ì œëŒ€ë¡œ ë™ìž‘하지 않는다는 ì‹ í˜¸ë¥¼ ì¿ ë²„ë„¤í‹°ìŠ¤ì— ë³´ë‚´ì„œ, ì¿ ë²„ë„¤ì´íŠ¸ê°€ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 다시 시작하ë„ë¡ í•˜ëŠ” ë°©ë²•ì´ ìžˆë‹¤ë©´ ì¢‹ì„ ê²ƒì´ë‹¤. * 그래서 ë¼ì´ë¸Œë‹ˆìФ 프로브 ì„¤ì •ì„ í•´ì•¼í•˜ëŠ”êµ° - [서지혜] * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ë¼ì´ë¸Œë‹ˆìФ 프로브를 통해 컨테ì´ë„ˆê°€ ì‚´ì•„ 있는지 확ì¸í• 수 있다. * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 세 가지 ë©”ì»¤ë‹ˆì¦˜ì„ ì‚¬ìš©í•´ 컨테ì´ë„ˆì— 프로브를 실행한다. * HTTP GET 프로브는 ì§€ì •í•œ IP 주소, í¬íЏ, ê²½ë¡œì— HTTP GET ìš”ì²ì„ 수행한다. ... ì‘답 코드가 오류를 나타내지 않는 ê²½ìš°ì— í”„ë¡œë¸Œê°€ ì„±ê³µí–ˆë‹¤ê³ ê°„ì£¼ëœë‹¤. * TCP 소켓 프로브는 컨테ì´ë„ˆì˜ ì§€ì •ëœ í¬íŠ¸ì— TCP ì—°ê²°ì„ ì‹œë„한다. ì—°ê²°ì— ì„±ê³µí•˜ë©´ 프로브가 성공한 것 * TCP는 ì‘답까지는 ë³´ì§€ 않는구나 - [서지혜] * Exec 프로브는 컨테ì´ë„ˆ ë‚´ì˜ ìž„ì˜ì˜ ëª…ë ¹ì„ ì‹¤í–‰í•˜ê³ ëª…ë ¹ì˜ ì¢…ë£Œ ìƒíƒœ 코드를 확ì¸í•œë‹¤. ìƒíƒœ 코드가 0ì´ë©´ 프로브가 성공한 것ì´ë‹¤. * p158 * í¬ëž˜ì‹œëœ 컨테ì´ë„ˆì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ 로그 얻기 {{{ $ kubectl logs mypod --previous }}} * p159 * ìˆ«ìž 137ì€ ë‘ ìˆ«ìžë¥¼ 합한 값으로, 128 + x다. ...ì´ ì˜ˆì—서 x는 SIGKILL ì‹œê·¸ë„ ë²ˆí˜¸ì¸ 9ì´ë©°, 프로세스가 ê°•ì œë¡œ 종료ëìŒì„ ì˜ë¯¸í•œë‹¤. * p162 * í”„ë¡œë¸Œì— ìžì²´ì ì¸ ìž¬ì‹œë„ ë£¨í”„ë¥¼ 구현하는 ê²ƒì€ í—›ìˆ˜ê³ ë‹¤. * 그럼 왜 임계값 ì •í•˜ë¼ê³ í•˜ëŠ”ê±´ë° - [서지혜] * kubelet ì´ ìž¬ì‹œë„ ë£¨í”„ë¥¼ 관리해주니까 http probe endpoint 등ì—서는 별개로 구현해주지 ë§ë¼ëŠ” ì´ì•¼ê¸° ê°™ì€ë°, 사실 구현하는 사람 맘ì´ì£ - [bluemir] * íŒŒë“œë“¤ì€ Kubelet ì—서만 관리ë˜ëŠ”ë°, Kubeletì€ ë…¸ë“œì—서 실행ë˜ê¸° ë•Œë¬¸ì— ë…¸ë“œ ìžì²´ê°€ ê³ ìž¥ 나면 ì•„ë¬´ê²ƒë„ í• ìˆ˜ 없다. * p164 * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ëŠ” 실행 ì¤‘ì¸ íŒŒë“œ 목ë¡ì„ ì§€ì†ì 으로 모니터ë§í•˜ê³ , íŠ¹ì • "ìœ í˜•"ì˜ ì‹¤ì œ 파드 수가 ì˜ë„하는 수와 ì¼ì¹˜í•˜ëŠ”ì§€ í•ìƒ í™•ì¸í•œë‹¤. * deploy??ëž‘ ëê°€ 다른건지 ëª¨ë¥´ê² ë„¤ - [김준ì„] * ~~deployment ê°€ replicasSetì„ ë§Œë“니다. replicasSetì€ replicasControllerì— ì˜í•´ ì„¤ëª…ëœ ë™ìž‘ì„ í•©ë‹ˆë‹¤. êµ³ì´ 2단 êµ¬ì„±ì¸ ì´ìœ 는 deploy 단ì—서 ë°°í¬ ì „ëžµ( blueGreen/rolling update) ë“±ì„ ê³ ë¥¼ìˆ˜ 있기 때문입니다. 하지만 ì¼ë°˜ì 으로는 (사용하는 사람 입장ì—서) ê±°ì˜ ê°™ì€ê±°ê¸´ 합니다.~~ ì œê°€ ë”´ê±°ëž‘ í—·ê°ˆë ¸êµ°ìš”. 잊어주세요. - [bluemir] * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ëŠ” 파드 ìœ í˜•ì´ ì•„ë‹ˆë¼ íŠ¹ì • ë ˆì´ë¸” ì…€ë ‰í„°ì™€ ì¼ì¹˜í•˜ëŠ” 파드 ì„¸íŠ¸ì— ìž‘ë™í•œë‹¤. * ê°•ì¡° 밑줄 - [김준ì„] * ë ˆì´ë¸”ì€ ë‹¤ë¥¸ 서비스ì—서 보통 옵셔ë„하게 ë‹¤ë¤„ì§€ëŠ”ë° ì¿ ë² ì—서는 중요함 - [서지혜] * p165 * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì—는 세 가지 필수 요소가 있다. ë ˆì´ë¸” ì…€ë ‰í„° / ë ˆí”Œë¦¬ì¹´ 수 / 파드 템플릿 * https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/ 디플로ì—먼트를 주로 ë´ì„œ RC와 헷갈림. ''디플로ì´ë¨¼íЏ(Deployment) 는 파드와 ë ˆí”Œë¦¬ì¹´ì…‹( ReplicaSet)ì— ëŒ€í•œ ì„ ì–¸ì ì—…ë°ì´íŠ¸ë¥¼ ì œê³µí•œë‹¤''. ì´ë ‡ê²Œ ë³´ë©´ deployê°€ ë‚˜ì™€ì•¼í• ê²ƒ ê°™ì€ë°? - [김준ì„] * https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicationcontroller ì—서 ReplicaSetì„ êµ¬ì„±í•˜ëŠ” Deploymentê°€ 권장하는 방법ì´ë¼ê³ 하네요 - [서지혜] * p166 * ë ˆì´ë¸” ì…€ë ‰í„°ì™€ 파드 í…œí”Œë¦¿ì„ ë³€ê²½í•´ë„ ê¸°ì¡´ 파드ì—는 ì˜í–¥ì„ 미치지 않는다. * 갯수 관리만 ì¤‘ì‹œí•˜ê³ ë³€ê²½ìœ¼ë¡œ ì¸í•´ 범위를 벗어난 íŒŒë“œì— ëŒ€í•œ ì‚ì œ/ì •ì§€ëŠ” 안하는듯 - [김준ì„] * labelì´ ìž˜ëª» ì§€ì •ëœ Serviceë“¤ì„ ë³€ê²½í•˜ê³ ì‹¶ì€ë°.. 하필 íƒ€ìž…ì´ LoadBalancer ë¼ ë§ˆìŒì´ 찢어지는 중.. - [서지혜] * p172 * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ëŠ” ë…¸ë“œì˜ íŒŒë“œê°€ 다운ëìŒì„ ê°ì§€í•˜ìžë§ˆìž 파드를 대체하기 위해 새 파드를 기ë™í•œë‹¤. * K8S를 쓰는 ì´ìœ 중 ìžë™ 복구 - [김준ì„] * p173 * 노드가 몇 ë¶„ ë™ì•ˆ ì ‘ì†í• 수 없는 ìƒíƒœë¡œ ìœ ì§€ë 경우 해당 ë…¸ë“œì— ìŠ¤ì¼€ì¤„ëœ íŒŒë“œëŠ” ìƒíƒœê°€ 알수 ì—†ìŒìœ¼ë¡œ 변경ëœë‹¤. * Default로 í†µì‹ í•˜ëŠ” 시간 ë•Œë¬¸ì— nodeê°€ not ready로 바뀌는것과 별개로 ì‹œê°„ì´ ê±¸ë¦¬ëŠ”ë“¯ - [김준ì„] * 즉ê°ì ì¸ ì¸ê°„ì˜ ê°œìž…ì´ í•„ìš”í•˜ì§€ 않다. ì‹œìŠ¤í…œì´ ìžë™ìœ¼ë¡œ 스스로 ì¹˜ìœ í•œë‹¤. * ë™ì–´ 반복같ì€ë° - [서지혜] * p175 * {{{ $ kubectl label pod kubia-dmdck app=foo --overwrite }}} * 치트 시트 - [김준ì„] * p177 * 파드가 오작ë™í•œë‹¤ëŠ” ê²ƒì„ ì•ˆë‹¤ë©´ 파드를 ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì˜ ë²”ìœ„ 밖으로 빼내 컨트롤러가 새 파드로 êµì²´í•˜ë„ë¡ í•œ 다ìŒ, ì›í•˜ëŠ” ë°©ì‹ìœ¼ë¡œ 파드를 디버그하거나 ë¬¸ì œë¥¼ 재연해볼 수 있다. * 3장ì—서 forwardingì„ ì´ìš©í•´ pod를 디버깅하ìžëŠ”ê²ƒì˜ ì—°ìž¥ì„ ì¸ë“¯. ê´œì°®ì€ ìƒê°ì¸ê²ƒ 같다 - [김준ì„] * ì•„ì§ íŠ¹ì • podë§Œ 오작ë™í•˜ëŠ” 경우는 만나지 못했지만 ì´ëŸ°ì¼ì´ 있으면 사용해 ë´ì•¼ê² 다. - [서지혜] * ì´ê±° ì•ˆí•´ë´¤ëŠ”ë° ì¢‹ì€ ì•„ì´ë””어네요. - [bluemir] * p179 * export KUBE_EXPORT ="/usr/bin/nano" * use vim? - [김준ì„] * 파드를 수í‰ìœ¼ë¡œ 스케ì¼ë§ 하는 ê²ƒì´ ë¬´ì²™ 쉬운 ì¼ìž„ì„ ì˜ë¯¸í•œë‹¤. * ë¬¼ë¡ ê¸°ë°˜ì‹œìŠ¤í…œì´ ê·¸ë ‡ê²Œ ë§Œë“¤ì–´ì ¸ìžˆì–´ì•¼í•˜ê² ì§€ - [김준ì„] * {{{ kubectl scale rc kubia --replicas=10 }}} * 치트 시트 - [김준ì„] * {{{ kubectl scale rc kubia --cascade=false }}} * cascade - [김준ì„] * ReplicationController ì´ì œ 안쓰니까 ì˜ë¯¸ 없는 ì˜µì…˜ì´ ì•„ë‹ì§€... - [서지혜] === ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ ëŒ€ì‹ ë ˆí”Œë¦¬ì¹´ì…‹ 사용하기 === * p183 * ë ˆí”Œë¦¬ì¹´ì…‹ì´ë¼ëŠ” ìœ ì‚¬í•œ 리소스가 ë„ìž…ë다. ì´ëŠ” 차세대 ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì´ë©°, ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ë¥¼ ì™„ì „ížˆ ëŒ€ì²´í• ê²ƒì´ë‹¤. * ???? ëì—¬? - [김준ì„] * ì±…ì˜ ì¿ ë² ë²„ì „ì´ ë‚®ì•„ì„œ..ã…‹ã…‹ã…‹ - [서지혜] * ë ˆí”Œë¦¬ì¹´ì…‹ì€ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì™€ ë˜‘ê°™ì´ ë™ìž‘하지만 좀 ë” í’부한 표현ì‹ì„ 사용하는 파드 ì…€ë ‰í„°ë¥¼ ê°–ê³ ìžˆë‹¤. * ë ˆì´ë¸”ì´ ì—†ì–´ë„ ì…€ë ‰íŠ¸í• ìˆ˜ 있게 ëœë‹¤ - [서지혜] * p185 * APIë²„ì „ ì†ì„±ì— 대해 * ê° API (ReplicaSet / Deployment 등) APIí˜¸í™˜ì„ ì ì–´ë†“ì€ ë¸”ë¡œê·¸ë“¤ì´ ìžˆëŠ”ê²ƒë¡œ 기억함 - [김준ì„] * ì´ ë²„ì „ 관리하는거 너무 귀찮다... - [서지혜] * p186 * ì…€ë ‰í„°ì— í‘œí˜„ì‹ì„ ì¶”ê°€í• ìˆ˜ 있다. In / NotIn / Exsists / DoesNotExist * p188 * ë ˆí”Œë¦¬ì¹´ì…‹ì„ ì‚ì œí•˜ë©´ ëª¨ë“ íŒŒë“œê°€ ì‚ì œëœë‹¤. * ë ˆí”Œë¦¬ì¹´ì…‹ì€ cascade=false 옵션 없나? - [서지혜] === ë°ëª¬ì…‹ì„ 사용해 ê° ë…¸ë“œì—서 ì •í™•ížˆ í•œê°œì˜ íŒŒë“œ 실행하기 === * p188 * í´ëŸ¬ìŠ¤í„°ì˜ ëª¨ë“ ë…¸ë“œì—, 노드당 í•˜ë‚˜ì˜ íŒŒë“œë§Œ 실행ë˜ê¸¸ ì›í•˜ëŠ” 경우 * just one - [김준ì„] * 시스템 ìˆ˜ì¤€ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•˜ëŠ” ì¸í”„ë¼ ê´€ë ¨ 파드가 ì´ëŸ° 경우다. 예를 들면 ëª¨ë“ ë…¸ë“œì—서 로그 수집기와 리소스 모니터를 ì‹¤í–‰í•˜ë ¤ëŠ” 경우가 ì¢‹ì€ ì˜ˆë‹¤. ë˜ ë‹¤ë¥¸ ì¢‹ì€ ì˜ˆëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ kube-proxy 프로세스ì´ë©°, 서비스를 ìž‘ë™ì‹œí‚¤ê¸° 위해 ëª¨ë“ ë…¸ë“œì—서 실행ë¼ì•¼ 한다. * 로그 수집기, í†µì‹ ë“± -[김준ì„] * p189 * ë°ëª¬ì…‹ì€ 그림 4.8ê³¼ 노드 ìˆ˜ë§Œí¼ íŒŒë“œë¥¼ ë§Œë“¤ê³ ê° ë…¸ë“œì— ë°°í¬ëœë‹¤. * 새 노드가 í´ëŸ¬ìŠ¤í„°ì— ì¶”ê°€ë˜ë©´ ë°ëª¬ì…‹ì€ 즉시 새 파드 ì¸ìŠ¤í„´ìŠ¤ë¥¼ 새 ë…¸ë“œì— ë°°í¬í•œë‹¤. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * ë°ëª¬ì…‹ ì •ì˜ì˜ ì¼ë¶€ì¸ 파드 템플릿ì—서 node-selector ì†ì„±ì„ ì§€ì •í•˜ë©´ëœë‹¤. * p192 * {{{ $ kubectl get ds }}} * ìƒê°í•´ë³´ë‹ˆ ds 검색해본ì ì´ ì—†ë„¤ - [김준ì„] * 해봤으나 ê¶Œí•œì´ ì—†ì—ˆë‹¤ê³ í•©ë‹ˆë‹¤ - [서지혜] === 완료 가능한 ë‹¨ì¼ íƒœìŠ¤í¬ë¥¼ 수행하는 파드 실행 === * p194 * ìž‘ì—…ì„ ì™„ë£Œí•œ 후ì—는 종료ë˜ëŠ” 태스í¬ë§Œ ì‹¤í–‰í•˜ë ¤ëŠ” 경우가 ìžˆì„ ê²ƒì´ë‹¤. * 그게 바로 job입니다 - [김준ì„] * ì´ëŸ¬í•œ ìž¡ì˜ ì˜ˆë¡œëŠ” ë°ì´í„°ë¥¼ ì–´ë”˜ê°€ì— ì €ìž¥í•˜ê³ ìžˆê³ , ì´ ë°ì´í„°ë¥¼ 변환해서 어딘가로 ì „ì†¡í•´ì•¼ 하는 경우를 들 수있다. * ë’¤ì— cronì´ ë‚˜ì˜¤ì§€ë§Œ jobì€ ë°ì´í„° 백업 / 통계 / ì—…ë°ì´íЏ ì— ì£¼ë¡œ 사용ë¨. - [김준ì„] * p196 * ìž¡ 파드는 ë¬´í•œì • 실행하지 않으므로 기본 ì •ì±…ì„ ì‚¬ìš©í• ìˆ˜ 없다. ë”°ë¼ì„œ restartPolicy를 onFailure나 Never로 명시ì 으로 ì„¤ì •í•´ì•¼ 한다. * ìœ ì˜ì‚¬í• 밑줄 - [김준ì„] * p197 * ìž¡ì€ ë‘ ê°œ ì´ìƒì˜ 파드 ì¸ìŠ¤í„´ìŠ¤ë¥¼ ìƒì„±í•´ ë³‘ë ¬ ë˜ëŠ” 순차ì 으로 실행하ë„ë¡ êµ¬ì„±í• ìˆ˜ 있다. ì´ëŠ” ìž¡ ìŠ¤íŽ™ì— completions와 parallelism ì†ì„±ì„ ì„¤ì •í•´ 수행한다. * 몇번 완료해야해? í•œë²ˆì— ëª‡ê°œ ìˆ˜í–‰í• ê¹Œ? - [김준ì„] * 요거 활용해서 job queue, work queue ê°™ì€ ê²ƒì„ ë©‹ì§€ê²Œ 만들수 있습니다. [https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-patterns #] - [bluemir] * activeDeadlineSeconds ì†ì„±ì„ ì„¤ì •í•´íŒŒë“œì˜ ì‹¤í–‰ ì‹œê°„ì„ ì œí•œí• ìˆ˜ 있다. * ì´ê±¸ ì¨ì•¼í• 때가 있나 ì‹¶ìŒ - [김준ì„] * hang 걸리는 ìž¡ 종료시킬 때 ì‚¬ìš©í• ìˆ˜ 있ì„거같네요 - [서지혜] === ìž¡ì„ ì£¼ê¸°ì 으로 ë˜ëŠ” 한 번 실행ë˜ë„ë¡ ìŠ¤ì¼€ì¤„ë§í•˜ê¸° === * p200 * 리눅스나 ìœ ë‹‰ìŠ¤ ê°™ì€ ìš´ì˜ì²´ì œì—서 ì´ëŸ° ìž‘ì—…ì„ í¬ë¡ 작업ì´ë¼ 한다. ì¿ ë²„ë„¤í‹°ìŠ¤ì—ì„œë„ ì´ë¥¼ ì§€ì›í•œë‹¤. * 다들 아는 ê·¸ cron - [김준ì„] * p201 * 스케줄 ì„¤ì •í•˜ê¸° * ë¶„ 시 ì¼ ì›” ìš”ì¼ * 콤마로 구분. 0ì€ ì¼ìš”ì¼ 0,30 * * * * 0,6 매달 ì¼ìš”ì¼, í† ìš”ì¼ ë§¤ì‹œê° 0ë¶„, 30ë¶„ 마다. - [김준ì„] * {{{*/30 * * * * 0,6}}} ì´ë ‡ê²Œ í• ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤ - [서지혜] * ì¼ë°˜ì ì¸ ìƒí™©ì—서 í¬ë¡ ìž¡ì€ ìŠ¤ì¼€ì¤„ì— ì„¤ì •í•œ ê° ì‹¤í–‰ì— í•ìƒ í•˜ë‚˜ì˜ ìž¡ë§Œ ìƒì„±í•˜ì§€ë§Œ ë‘ ê°œì˜ ìž¡ì´ ë™ì‹œì— ìƒì„±ë˜ê±°ë‚˜ ì „í˜€ ìƒì„±ë˜ì§€ ì•Šì„ ìˆ˜ 있다. * ì´ ì±…ì˜ ë²„ì „ì´ 1.8기준ì´ë¼ 그런가. cronjobì˜ ê²½ìš° replace policyê°€ 있어서 만약 앞서 존재하는 jobì´ ë나지 않았다면 replace를 하거나 해당 ìž‘ì—…ì´ ëë‚ ë•Œê¹Œì§€ pending í• ìˆ˜ 있다. - [김준ì„] * 추가ì 으로 jobì´ ì œëŒ€ë¡œ ë났는지 completion í˜¹ì€ failure pod를 보관하는게 ìžˆëŠ”ë° ì—¬ê¸°ì„ ì†Œê°œ 안하네 - [김준ì„] == 서비스: í´ë¼ì´ì–¸íŠ¸ê°€ 파드를 ê²€ìƒ‰í•˜ê³ í†µì‹ ì„ ê°€ëŠ¥í•˜ê²Œ 함 == === 서비스 소개 === * p206 * ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ ì„œë¹„ìŠ¤ëŠ” ë™ì¼í•œ 서비스를 ì œê³µí•˜ëŠ” 파드 ê·¸ë£¹ì— ì§€ì†ì ì¸ ë‹¨ì¼ ì ‘ì ì„ ë§Œë“¤ë ¤ê³ í• ë•Œ ìƒì„±í•˜ëŠ” 리소스다. ê° ì„œë¹„ìŠ¤ëŠ” 서비스가 존재하는 ë™ì•ˆ ì ˆëŒ€ 바뀌지 않는 IP주소와 í¬íŠ¸ê°€ 있다. í´ë¼ì´ì–¸íŠ¸ëŠ” 해당 IP와 í¬íŠ¸ë¡œ ì ‘ì†í•œ ë‹¤ìŒ í•´ë‹¹ 서비스를 ì§€ì›í•˜ëŠ” 파드 중 하나로 ì—°ê²°ëœë‹¤. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * p208 * 서비스 ì—°ê²°ì€ ì„œë¹„ìŠ¤ ë’·ë‹¨ì˜ ëª¨ë“ íŒŒë“œë¡œ 로드밸런싱ëœë‹¤. ë ˆì´ë¸”ì…€ë ‰í„°ë¥¼ ê¸°ì–µí• ê²ƒì´ë‹¤. * ë™ìž‘ 밑줄 - [김준ì„] * p210 * ì„œë¹„ìŠ¤ì˜ í´ëŸ¬ìŠ¤í„° IP로 ìš”ì²ì„ ë³´ë‚´ê³ ì‘ë‹µì„ ë¡œê·¸ë¡œ 남기는 파드를 만드는 것ì´ë‹¤. * ì¿ ë²„ë„¤í‹°ìŠ¤ 노드로 ssh ì ‘ì†í•˜ê³ curl ëª…ë ¹ì„ ì‹¤í–‰í• ìˆ˜ 있따. * kubectl exec ëª…ë ¹ì–´ë¡œ 기존 파드ì—서 curl ëª…ë ¹ì„ ì‹¤í–‰í• ìˆ˜ 있다. * 위 세개다 쓰는듯. 파드ì—서 curlì„ í•˜ëŠ”ê²ƒì€ ë²ˆê±°ë¡œì›Œì„œ 가장 늦게 하긴 함. - [김준ì„] * p211 * ëª…ë ¹ì–´ì˜ ë”블 대시(--)는 kubectl ëª…ë ¹ì¤„ ì˜µì…˜ì˜ ëì„ ì˜ë¯¸í•œë‹¤. * 번ì—ì´ ì´ìƒí•œë° ê³µì‹ í™ˆíŽ˜ì´ì§€ì˜ {{{ Note: The double dash (--) separates the arguments you want to pass to the command from the kubectl arguments. }}} kubectl ì—서 ë„˜ê¸°ê³ ì‹¶ì€ê±¸ -- 로 êµ¬ë¶„í• ìˆ˜ 있다는 ê±°ìž„. - [김준ì„] * p212 * ì„œë¹„ìŠ¤ì˜ ì„¸ì…˜ 어피니티 ì†ì„±ì„ 기본값 None ëŒ€ì‹ ClientIP로 구성한다. * 하.. 티맥스ì—서 ìŒì„± 메세지를 ë°›ì„때 ê³„ì† ê°™ì€ íŒŒë“œë¡œ 붙게 해달ë¼ê³ 해서 ì´ê±¸ 본ì ì´ ìžˆê¸´í–ˆì§€ - [김준ì„] * p213 * 여러 í¬íŠ¸ê°€ 있는 서비스를 만들 때는 ê° í¬íЏì˜ì´ë¦„ì„ ì§€ì •í•´ì•¼ 한다. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * p216 * {{{ $ kubectl exec kubia-3inly env }}} * KUBERNETES_SERVICE_HOST 와 KUBERNETEST_SERVICE_PORT ê°€ 있는걸 첨알았네 - [김준ì„] * p217 * 서비스 ì´ë¦„ì˜ ëŒ€ì‹œ(-)는 밑줄(_)로 변환ë˜ê³ 서비스 ì´ë¦„ì´ í™˜ê²½ë³€ìˆ˜ ì´ë¦„ì˜ ì ‘ë‘어로 ì“°ì´ë©´ì„œ ëª¨ë“ ë¬¸ìžëŠ” 대문ìžë¡œ 표시ëœë‹¤. * ì´ë¦„ 변환 규칙 밑줄- [김준ì„] * DNS를 통한 서비스 검색 * FQDNì„ í†µí•œ 서비스 ì—°ê²° * 서비스명.네임스페ì´ìФ.svc.cluster.local[0-9]* ì´ì—ˆë˜ê°€.. 여튼 DNS / FQDNì„ ì“°ì§„ 않지만 ë™ìž‘ì€ ê°™ì€ê±¸ë¡œ 앎. DNSì—서 ê°€ì ¸ì˜¤ê³ FQDN으로 서비스명 매치 - [김준ì„] === í´ëŸ¬ìŠ¤í„° ì™¸ë¶€ì— ìžˆëŠ” 서비스 ì—°ê²° === * p221 * 서비스는 íŒŒë“œì— ì§ì ‘ ì—°ê²°ë˜ì§€ 않는다. ëŒ€ì‹ ì—”íŠ¸í¬ì¸íЏ 리소스가 ê·¸ 사ì´ì— 있다. * ep? ì´ê±° ë˜ ë²ˆì—ì´.. among usë„ ì•„ë‹ˆê³ - [김준ì„] * 엔드í¬ì¸íЏ 리소스는 서비스로 노출ë˜ëŠ” íŒŒë“œì˜ IP 주소와 í¬íЏ 목ë¡ì´ë‹¤. * svcê°€ ep 오브ì 트를 ë“¤ê³ ìžˆë‹¤ê³ í•˜ë©´ ë 것ì„.. - [김준ì„] * p224 * 외부 ì„œë¹„ìŠ¤ì˜ ë³„ì¹ìœ¼ë¡œ 사용ë˜ëŠ” 서비스를 ë§Œë“¤ë ¤ë©´ ìœ í˜• 필드를 ExternalName으로 ì„¤ì •í•´ 서비스 리소스를 ë§Œë“ ë‹¤. * ë‚´ë¶€ì—서 Nameì„ ì„¤ì •í•´ë³¸ ì´ë ¥ì´ 없어서.. - [김준ì„] * ExternalName 서비스는 DNS ë ˆë²¨ì—서만 구현ëœë‹¤. ì„œë¹„ìŠ¤ì— ê´€í•œ 간단한 CNAME DNSë ˆì½”ë“œê°€ ìƒì„±ëœë‹¤. * DNS ë ˆë²¨ì—서만 함 - [김준ì„] === 외부 í´ë¼ì´ì–¸íŠ¸ì— ì„œë¹„ìŠ¤ 노출 === * 외부ì—서 서비스를 ì•¡ì„¸ìŠ¤í• ìˆ˜ 있는 몇 가지 ë°©ë²•ì´ ìžˆë‹¤. 1. 노드í¬íŠ¸ë¡œ 서비스 ìœ í˜• ì„¤ì • 1. 서비스 ìœ í˜•ì„ ë…¸ë“œí¬íЏ ìœ í˜•ì˜ í™•ìž¥ì¸ ë¡œë“œë°¸ëŸ¬ì„œë¡œ ì„¤ì • 1. 단ì¼IP 주소로 여러 서비스를 노출하는 ì¸ê·¸ë ˆìФ 리소스 만들기 * ì •ì˜ ë°‘ì¤„ - [김준ì„] * 노드í¬íЏ 서비스를 만들면 ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ëª¨ë“ ë…¸ë“œì— íŠ¹ì • í¬íŠ¸ë¥¼ í• ë‹¹í•˜ê³ ì„œë¹„ìŠ¤ë¥¼ 구성하는 파드로 들어오는 ì—°ê²°ì„ ì „ë‹¬í•œë‹¤. * ë…¸ë“œì…€ë ‰í„°ë¡œ ì„¤ì •ëœ ë…¸ë“œ? ëª¨ë“ ë…¸ë“œì¸ê°€? - [김준ì„] * 외부 로드밸런서로 서비스 노출 * ì´ê²ƒë„ 사용해본ì ì€ ì—†ëŠ”ë°.. ê²°êµ ë…¸ë“œë¥¼ ì—´ê³ ê±°ê¸°ë¡œ 로드밸런서한테 패스받아서 ìžë™ìœ¼ë¡œ ë¶„ë°° 해준단 얘기지? - [김준ì„] * êµ¬í˜„ì— ë”°ë¼ ë‹¤ë¥¸ë°, 외부 LoadBalancerì—서 pod ip 로 ì§ì ‘ í„°ë„ë§ í•´ì£¼ê±°ë‚˜ í• ìˆ˜ 있습니다. - [bluemir] === ì¸ê·¸ë ˆìФ 리소스로 서비스 외부 노출 === * p245 * ì¸ê·¸ë ˆì´ìŠ¤ëŠ” 비êµì 새로운 ì¿ ë²„ë„¤í‹°ìŠ¤ 기능ì´ë¯€ë¡œ 향후 ë§Žì€ ê°œì„ ê³¼ 새로운 기능를 ê¸°ëŒ€í• ìˆ˜ 있다. * https://kubernetes.io/docs/reference/using-api/deprecation-guide/#ingress-v122 1.19까지 ì‚¬ìš©ê°€ëŠ¥í•˜ê³ deprecatedë¨? - [김준ì„] * istio 나 기타 다른 Ingress ë°œì „ì†ë„ê°€ 워낙 빨ë¼ì„œ k8s Ingress specì„ update ì†ë„ê°€ 못따ë¼ê°€ì„œ ê·¸ë ‡ìŠµë‹ˆë‹¤. k8s Ingress Spec으로는 안ë˜ëŠ”ê¸°ëŠ¥ì´ ë„ˆë¬´ ë§Žì•„ìš”. 지금 대세는 Istio를 쓰는 것입니다(Istioê°€ Ingress기능만 하는건 아닙니다.) - [bluemir] === 파드가 ì—°ê²°ì„ ìˆ˜ë½í• 준비가 ëì„ ë•Œ ì‹ í˜¸ 보내기 === * p246 * ì¿ ë²„ë„¤í‹°ìŠ¤ì—서는 ë¼ì´ë¸Œë‹ˆìФ 프로브와 비슷하게 íŒŒë“œì— ë ˆë””ë‹ˆìŠ¤ 프로브를 ì •ì˜í• 수 있다. * ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ ì•„ë‹ˆë¼ ì„œë¹„ìŠ¤ì—서는 ì´ë¼ê³ 해야하지 않나 - [김준ì„] * ë ˆë“œë‹ˆìŠ¤ 프로브 ìœ í˜• / 프로세스 exec / http get / TCP 소켓 * ì´ê±´ ë¼ì´ë¸Œë‹ˆìŠ¤ëž‘ 같네 - [김준ì„] * ë¼ì´ë¸Œë‹ˆìФ 프로브와달리 컨테ì´ë„ˆê°€ 준비 ìƒíƒœ ì ê²€ì— ì‹¤íŒ¨í•˜ë”ë¼ë„ 컨테ì´ë„ˆê°€ 종료ë˜ê±°ë‚˜ 다시 시작ë˜ì§€ 않는다. * ë ˆë””ë‹ˆìŠ¤ 프로브는 ìš”ì²ì„ ì²˜ë¦¬í• ì¤€ë¹„ê°€ ëœ íŒŒë“œì˜ ì»¨í…Œì´ë„ˆë§Œ ìš”ì²ì„ ìˆ˜ì‹ í•˜ë„ë¡ í•œë‹¤ * ì´ê²ƒë„ 나ì˜ì§€ ì•Šì€ ì˜µì…˜ì´ê¸´ í•œë° í•´ë³¸ì ì´ ì—†ìŒ - [김준ì„] * p252 * ë ˆë””ë‹ˆìŠ¤ 프로브를 í•ìƒ ì •ì˜í•˜ë¼ * ì—°ê²°ìžì²´ê°€ 안ë˜ë©´ 뻗어버리는 서비스가 ë§Žì€ë° ì´ê±´ ì¢‹ì€ ì„ íƒì¼ê¹Œ? - [김준ì„] * 부하ìƒí™©ì—서 readinessê°€ 안ë˜ë©´ Trafficì´ ì¸ìž…ë˜ì§€ 않으면서 부하ìƒí™©ì´ ìžì—°ìŠ¤ëŸ½ê²Œ 해소ë˜ë©´ 다시 ì¸ìž…ë˜ëŠ”ì‹ìœ¼ë¡œ í™œìš©í• ìˆ˜ 있습니다. - [bluemir] === 헤드리스 서비스로 개별 파드 찾기 === * === 서비스 ë¬¸ì œ í•´ê²° === * p257 * ì„œë¹„ìŠ¤ì— ì•¡ì„¸ìŠ¤ í• ìˆ˜ 있는지 확ì¸í•˜ë ¤ê³ 서비스 IP로 í•‘ì„ í• í•„ìš” 없다. * 첨ì—ì•”ê²ƒë„ ëª¨ë¥¼ë•Œ Ping ë‚ ë¦¬ê³ ê·¸ëž¬ì§€ - [김준ì„] == 볼륨: 컨테ì´ë„ˆì— ë””ìŠ¤í¬ ìŠ¤í† ë¦¬ì§€ ì—°ê²° == * p259 * 파드 ë‚´ë¶€ì˜ ê° ì»¨í…Œì´ë„ˆëŠ” ê³ ìœ í•˜ê²Œ ë¶„ë¦¬ëœ íŒŒì¼ì‹œìŠ¤í…œì„ ê°€ì§„ë‹¤. 파ì¼ì‹œìŠ¤í…œì€ ì»¨í…Œì´ë„ˆ ì´ë¯¸ì§€ì—서 ì œê³µë˜ê¸° 때문ì´ë‹¤. * ë„커 컨테ì´ë„ˆ 기본사ì´ì¦ˆê°€ 10gb를 ë°›ëŠ”ë‹¤ê³ í•œê²ƒ ê°™ì€ë° ì´ê±¸ 사용하는거ë˜ê°€? - [김준ì„] * p260 * 새로 시작한 컨테ì´ë„ˆëŠ” ì´ì „ì— ì‹¤í–‰í–ˆë˜ ì»¨í…Œì´ë„ˆì— 쓰여진 파ì¼ì‹œìŠ¤í…œì˜ ì–´ë–¤ ê²ƒë„ ë³¼ 수가 없다. * ì´ëŠ” 파드가 시작ë˜ë©´ ë³¼ë¥¨ì´ ìƒì„±ë˜ê³ , 파드가 ì‚ì œë˜ë©´ ë³¼ë¥¨ì´ ì‚ì œëœë‹¤ëŠ” ê²ƒì„ ì˜ë¯¸í•œë‹¤. * ì§€ê¸ˆì€ ì»¨í…Œì´ë„ˆ ê°„ì˜ íŒŒì¼ ì‹œìŠ¤í…œ ê³µìœ ë¥¼ 위해 íŒŒë“œì˜ ë¼ì´í”„사ì´í´ì„ 따르는 ë³¼ë¥¨ì„ ìƒì„±í•˜ëŠ”ë“¯ - [서지혜] * ì •ì˜ ë°‘ì¤„ - [김준ì„] === 볼륨 소개 === * p260 * ì¿ ë²„ë„¤í‹°ìŠ¤ ë³¼ë¥¨ì€ íŒŒë“œì˜ êµ¬ì„± 요소로 컨테ì´ë„ˆì™€ ë™ì¼í•˜ê²Œ 파드 스펙ì—서 ì •ì˜ëœë‹¤. * {{{ spec: containers: volumnMount: }}} 구조 리마ì¸ë“œ - [김준ì„] * ë³¼ë¥¨ì€ ì¿ ë²„ë„¤í‹°ìŠ¤ 오브ì 트가 아니므로 ìžì²´ì 으로 ìƒì„±, ì‚ì œë 수 없다. * 설명참 ì• ë§¤í•˜ë„¤ - [김준ì„] * ë³¼ë¥¨ì€ íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆì—서 사용 가능하지만 ì ‘ê·¼í•˜ë ¤ëŠ” 컨테ì´ë„ˆì—서 ê°ê° 마운트 ë¼ì•¼í•œë‹¤. ê° ì»¨í…Œì´ë„ˆì—서 파ì¼ì‹œìŠ¤í…œì˜ ì–´ëŠ ê²½ë¡œì—나 ë³¼ë¥¨ì„ ë§ˆìš´íŠ¸í• ìˆ˜ 있다. * 설명 밑줄. - [김준ì„] * p263 * ë³¼ë¥¨ì„ ì±„ìš°ê±°ë‚˜ 마운트하는 프로세스는 íŒŒë“œì˜ ì»¨í…Œì´ë„ˆê°€ 시작ë˜ê¸° ì „ì— ìˆ˜í–‰ëœë‹¤. * preloadê°™ì€? ì´ê±° 컨테ì´ë„ˆì˜ init 보다 ë¨¼ì €ì¸ê°€? - [김준ì„] * 다양한 ìœ í˜•ì˜ ë³¼ë¥¨ì´ ì‚¬ìš© 가능하다. * emptyDir * hostPath * gitRepo * nfs * gcePersistentDisk, awsElasticBlockStore, azureDisk * cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, csphereVolume, photonPersistentDisk, scaleIO * configMap, secret, downwardAPI - ì´ê²ƒë„ 볼륨으로 치다니 [김준ì„] * persistentVolumeClaim === ë³¼ë¥¨ì„ ì‚¬ìš©í•œ 컨테ì´ë„ˆ ê°„ ë°ì´í„° ê³µìœ === * p264 * emptyDir * ì´ë¦„ì—서 알 수 ìžˆë“¯ì´ ë³¼ë¥¨ì´ ë¹ˆ ë””ë ‰í„°ë¦¬ë¡œ 시작ëœë‹¤. * emptyDir ë³¼ë¥¨ì€ ë™ì¼ 파드ì—서 실행 ì¤‘ì¸ ì»¨í…Œì´ë„ˆ ê°„ 파ì¼ì„ ê³µìœ í• ë•Œ ìœ ìš©í•˜ë‹¤. * p268 * 볼륨으로 사용한 emptyDirì€ íŒŒë“œë¥¼ 호스팅하는 워커 ë…¸ë“œì˜ ì‹¤ì œ 디스í¬ì— ìƒì„±ë˜ë¯€ë¡œ 노드 디스í¬ê°€ ì–´ë–¤ ìœ í˜•ì¸ì§€ì— ë”°ë¼ ì„±ëŠ¥ì´ ê²°ì •ë다. * ì´ ìž‘ì—…ì„ ìœ„í•´ 다ìŒê³¼ ê°™ì´ emptyDirì˜ mediumì„ memory로 ì§€ì •í•œë‹¤. * ë¹ ë¥´ê² ëŠ”ë°? - [김준ì„] * memory limit ì´ ìžˆë‹¤ë©´ 해당 DIRì˜ ì‚¬ìš©ëŸ‰ì´ í¬í•¨ë˜ë¯€ë¡œ ì£¼ì˜ í•´ì•¼ 합니다. - [bluemir] * p269 * gitRepo ë³¼ë¥¨ì´ ìƒì„±ëœ 후ì—는 참조하는 리í¬ì§€í„°ë¦¬ì™€ ë™ê¸°í™”하지 않는다. * CI ì—서 ì‚¬ìš©í• ìˆ˜ ìžˆê² ëŠ”ë°? - [서지혜] * ìœ ì§€ë³´ìˆ˜ 중단! - [김준ì„] * p271 * 사ì´íŠ¸ì¹´ 컨테ì´ë„ˆ 소개 * 새로운 로ì§ì„ ë©”ì¸ ì• í”Œë¦¬ì¼€ì´ì…˜ ì½”ë“œì— ë°€ì–´ 넣어 ë³µìž¡ì„±ì„ ë”í•˜ê³ ìž¬ì‚¬ìš©ì„±ì„ ë–¨ì–´ëœ¨ë¦¬ëŠ” ëŒ€ì‹ ì— íŒŒë“œì— ì‚¬ì´ë“œì¹´ë¥¼ 추가하면 기존 컨테ì´ë„ˆ ì´ë¯¸ì§€ë¥¼ ì‚¬ìš©í• ìˆ˜ 있다. * ì´ëŸ°ê±° 좀 해설좀 ìžì„¸ížˆ 해줬으면. 사ì´ë“œì¹´ì™€ ë©”ì¸nginxì‚¬ì´ ê°™ì€ ê³µìœ ê³µê°„ì„ ê°€ì§€ê³ ìžˆëŠ”ë° ì‚¬ì´ë“œì¹´ 컨테ì´ë„ˆê°€ gitRepo ë³¼ë¥¨ì„ ê°€ì§€ê³ ì£¼ê¸°ì 으로 밀어넣어서 웹페ì´ì§€ë¥¼ ê°±ì‹ í•œë‹¨ ì†Œë¦¬ê² ì§€? - [김준ì„] * p272 * 프ë¼ì´ë¹— 깃 리í¬ì§€í„°ë¦¬ë¥¼ 컨테ì´ë„ˆì— ë³µì œí•˜ë ¤ë©´.. 다른 ìœ ì‚¬ ë°©ë²•ì„ ì‚¬ìš©í•´ì•¼ 한다 === 워커 노드 파ì¼ì‹œìŠ¤í…œì˜ íŒŒì¼ ì ‘ê·¼ === * p273 * 파ì¼ì‹œìŠ¤í…œì„ í†µí•´ 노드 디바ì´ìŠ¤ë¥¼ ì ‘ê·¼í•˜ê¸° 위해 ë…¸ë“œì˜ íŒŒì¼ì‹œìŠ¤í…œì„ ì‚¬ìš©í•´ì•¼ 한다. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * hostPath ë³¼ë¥¨ì€ ë…¸ë“œ 파ì¼ì‹œìŠ¤í…œì˜ íŠ¹ì • 파ì¼ì´ë‚˜ ë””ë ‰í„°ë¦¬ë¥¼ 가리킨다. * íŠ¹ì • ë…¸ë“œì— ì—í• (logë³´ê´€, db)를 ì§€ì •í•´ì„œ í•˜ê¸°ë•Œë¬¸ì— ìš°ë¦¬ìª½ì—ì„ ìžì£¼ ì“°ì¸ë‹¤ - [김준ì„] * hostPath ë³¼ë¥¨ì˜ ì½˜í…ì¸ ëŠ” ì‚ì œë˜ì§€ 않는다.파드가 ì‚ì œë˜ë©´ ë‹¤ìŒ íŒŒë“œê°€ í˜¸ìŠ¤íŠ¸ì˜ ë™ì¼ 경로를 가리키는 hostPath ë³¼ë¥¨ì„ ì‚¬ìš©í•˜ê³ , ì´ì „ 파드와 ë™ì¼í•œ ë…¸ë“œì— ìŠ¤ì¼€ì¤„ë§ëœë‹¤ëŠ” ì¡°ê±´ì—서 새로운 파드는 ì´ì „ 파드가 남긴 ëª¨ë“ í•ëª©ì„ ë³¼ 수 있다. * 하지만 노드ì—ë§Œ 남기 ë•Œë¬¸ì— ë…¸ë“œê°„ ê³µìœ ëŠ” 안ëœë‹¤ - [서지혜] * ë³¼ë¥¨ì˜ ì½˜í…ì¸ ëŠ” íŠ¹ì • ë…¸ë“œì˜ íŒŒì¼ì‹œìŠ¤í…œì— ì €ìž¥ë˜ë¯€ë¡œ ë°ì´í„°ë² ì´ìФ 파드가 다른 노드로 다시 스케줄ë§ë˜ë©´ ë” ì´ìƒ ì´ì „ ë°ì´í„°ë¥¼ ë³¼ 수 없다. hostPath ë³¼ë¥¨ì€ íŒŒë“œê°€ ì–´ë–¤ ë…¸ë“œì— ìŠ¤ì¼€ì¤„ë§ë˜ëŠëƒì— ë”°ë¼ ë¯¼ê°í•˜ê¸° ë•Œë¬¸ì— ì¼ë°˜ì ì¸ íŒŒë“œì— ì‚¬ìš©í•˜ëŠ” ê²ƒì€ ì¢‹ì€ ìƒê°ì´ 아니다. * 잘 ì•Œë ¤ì§„ 주ì˜ì‚¬í• 밑줄 - [김준ì„] * ëª¨ë“ nodeì— ê³µí‰í•˜ê²Œ 설치ë˜ëŠ” Deamonsetì—서 ìžì£¼ 사용 ë©ë‹ˆë‹¤. - [bluemir] * p275 * 다른 파드를 살펴보면 ëŒ€ë¶€ë¶„ì´ ë…¸ë“œì˜ ë¡œê·¸íŒŒì¼ì´ë‚˜ kubeconfig, CAì¸ì¦ì„œë¥¼ ì ‘ê·¼í•˜ê¸° 위해 ì´ ìœ í˜•ì˜ ë³¼ë¥¨ì„ ì‚¬ìš©í•œë‹¤ëŠ” ê²ƒì„ ë³¼ 수 있다. * ê·¸ë ‡ë„¤ - [김준ì„] === í¼ì‹œìŠ¤í„´íŠ¸ ìŠ¤í† ë¦¬ì§€ 사용 === * p275 * 파드ì—서 실행 ì¤‘ì¸ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 디스í¬ì— ë°ì´í„°ë¥¼ ìœ ì§€í•´ì•¼ í•˜ê³ íŒŒë“œê°€ 다른 노드로 재스케줄ë§ëœ 경우ì—ë„ ë™ì¼í•œ ë°ì´í„°ë¥¼ 사용해야 한다면 지금까지 언급한 볼륨 ìœ í˜•ì„ ì‚¬ìš©í• ìˆ˜ 없다. ì´ëŸ¬í•œ ë°ì´í„°ëŠ” ì–´ë–¤ í´ëŸ¬ìŠ¤í„° 노드ì—ì„œë„ ì ‘ê·¼ì´ í•„ìš”í•˜ê¸° 때문ì—NAS ìœ í˜•ì— ì €ìž¥ë¼ì•¼í•œë‹¤. * NAS ë•Œë¬¸ì— ë‚œì´ë„ +1 - [김준ì„] * PAAS를 ì“°ê³ ìžˆë‹¤ë©´ 난ì´ë„ 1 - [서지혜] * p277 * 파ì¼ì‹œìŠ¤í…œ ìœ í˜•ì€ EXT4(리눅스 파ì¼ì‹œìŠ¤í…œ ìœ í˜• 중 하나)ì´ë‹¤. * íŒŒì¼ ì‹œìŠ¤í…œì—ë„ ì—¬ëŸ¬ ìœ í˜•ì´ ìžˆêµ¬ë‚˜. 리눅스 ê³µë¶€ë„ ì¡°ë§Œê°„ í•´ì•¼ê² ë‹¤ - [서지혜] * p282 * ì´ëŸ° ìœ í˜•ì˜ ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ ê´€ë ¨ ì •ë³´ë¥¼ 파드 ì •ì˜ì— í¬í•¨í•œë‹¤ëŠ” ê²ƒì€ íŒŒë“œ ì •ì˜ê°€ íŠ¹ì • ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„°ì— ë°€ì ‘í•˜ê²Œ ì—°ê²°ë¨ì„ ì˜ë¯¸í•œë‹¤. * 개발ìžê°€ ì„œë²„ì •ë³´ë¥¼ 다 알아함 - [김준ì„] === 기반 ìŠ¤í† ë¦¬ì§€ ê¸°ìˆ ê³¼ 파드 분리 === * p283 * ì´ìƒì 으로는 ì¿ ë²„ë„¤í‹°ìŠ¤ì— ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ë°°í¬í•˜ëŠ” 개발ìžëŠ” ê¸°ì €ì— ì–´ë–¤ ì¢…ë¥˜ì˜ ìŠ¤í† ë¦¬ì§€ ê¸°ìˆ ì´ ì‚¬ìš©ë˜ëŠ”ì§€ 알 필요가 없어야 í•˜ê³ , ë™ì¼í•œ ë°©ì‹ìœ¼ë¡œ 파드를 실행하기 위해 ì–´ë–¤ ìœ í˜•ì˜ ë¬¼ë¦¬ 서버가 사용ë˜ëŠ”ì§€ 알 필요가 없어야 한다. ë™ì¼í•œ ë°©ì‹ìœ¼ë¡œ 파드를 실행하기 위해 ì–´ë–¤ ìœ í˜•ì˜ ë¬¼ë¦¬ 서버가 사용ë˜ëŠ”ì§€ 알 필요가 없어야 한다. * ê°€ìƒí™”ë•Œë¬¸ì— ë‚œì´ë„ +1 - [김준ì„] * ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ì˜ 세부 사í•ì„ ì²˜ë¦¬í•˜ì§€ ì•Šê³ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„°ì— ìŠ¤í† ë¦¬ì§€ë¥¼ ìš”ì²í• 수 있ë„ë¡ í•˜ê¸° 위해 새로운 리소스 ë‘개가 ë„ìž…ë다. 바로 í¼ì‹œìŠ¤í„´íŠ¸ 볼륨( PersistentVolume)ê³¼ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„( PersistentVolumeClaim)ì´ë‹¤. * 드디어 - [김준ì„] * ì œë°œë„어쓰기좀ë…ì¼ì–´ë„ì•„ë‹ˆê³ - [서지혜] * í´ëŸ¬ìŠ¤í„° 관리ìžê°€ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì„ í”„ë¡œë¹„ì €ë‹í•˜ë©´ 파드는 í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ì„ í†µí•´ ì´ë¥¼ 사용한다. 1. í´ëŸ¬ìŠ¤í„° 관리ìžëŠ” ë„¤íŠ¸ì›Œí¬ ìŠ¤í† ë¦¬ì§€ ìœ í˜•ì„ ì„¤ì •í•œë‹¤. 1. 관리ìžëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ APIì— PV 디스í¬ë¦½í„°ë¥¼ 게시해 í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì„ ìƒì„±í•œë‹¤. 1. 사용ìžëŠ” í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ì„ ìƒì„±í•œë‹¤. 1. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ì ì •í•œ í¬ê¸°ì™€ ì ‘ê·¼ ëª¨ë“œì˜ PV를 ì°¾ê³ PVC를 PVì— ë°”ì¸ë”©í•œë‹¤. 1. 사용ìžëŠ” PVC를 참조하는 ë³¼ë¥¨ì„ ê°€ì§„ 파드를 ìƒì„±í•œë‹¤. * 순서 밑줄 - [김준ì„] * p285 * {{{ kind: PersistentVolume metadata: name: mongodb-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce - ReadOnlymany persistentVolumeReclaimPolicy: Retain gcePersistentDisk : pdName: mongodb fsType: ext4 }}} * 대략ì ì¸ yaml 밑줄 - [김준ì„] * p287 * ì´ì œ 관리ìžì˜ 모ìžë¥¼ ë‚´ë ¤ë†“ê³ ê°œë°œìžì˜ 모ìžë¥¼ 다시 ì¨ ë³´ìž. * 모ìžì“°ê¸° - [서지혜] * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ê³¼ í´ëŸ¬ìŠ¤í„° 노드는 파드나 í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ê³¼ 달리 íŠ¹ì • 네임스페ì´ìŠ¤ì— ì†í•˜ì§€ 않는다. * ì£¼ì˜ ì‚¬í• ë° ì •ì˜ ë°‘ì¤„ - [김준ì„] * íŒŒë“œì— ì§ì ‘ ì‚¬ìš©í• ìˆ˜ëŠ” ì—†ê³ í´ë ˆìž„ì„ ë¨¼ì € 해야한다. * 주세요 - [김준ì„] * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì— ëŒ€í•œ í´ë ˆìž„ì€ íŒŒë“œë¥¼ ìƒì„±í•˜ëŠ” 것과 ë³„ê°œì˜ í”„ë¡œì„¸ìŠ¤ë‹¤. * 파드는 ì–¸ì œë“ ìž¬ìŠ¤ì¼€ì¥´ë§ ë 수 있기 때문 - [서지혜] * p288 * {{{ kind: PersistentVolumeClaim metadata: name: mongodb-pvc spec: resources: requests: storage: 1Gi accessModes: - ReadWriteOnce storageClassname: "" }}} * yaml 밑줄 - [김준ì„] * {{{kubectl get pvc}}} * p289 * ì ‘ê·¼ëª¨ë“œë¡œ 사용ë˜ëŠ” 약어다. * RWO(ReadWriteOnce): ë‹¨ì¼ ë…¸ë“œë§Œì´ ì½ê¸°/쓰기용으로 ë³¼ë¥¨ì„ ë§ˆìš´íŠ¸ í• ìˆ˜ 있다. * ROX(ReadOnlyMany): 다수 노드가 ì½ê¸°ìš©ìœ¼ë¡œ ë³¼ë¥¨ì„ ë§ˆìš´íŠ¸ í• ìˆ˜ 있다. * RWX(ReadWriteMany): 다수 노드가 ì½ê¸°/쓰기용으로 ë³¼ë¥¨ì„ ë§ˆìš´íŠ¸ í• ìˆ˜ 있다. * 파드 수가 아닌 ë³¼ë¥¨ì„ ë™ì‹œì— ì‚¬ìš©í• ìˆ˜ 있는 워커 노드 수와 ê´€ë ¨ì´ ìžˆë‹¤. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì€ í´ëŸ¬ìŠ¤í„° ìˆ˜ì¤€ì˜ ë¦¬ì†ŒìŠ¤ì´ë¯€ë¡œ íŠ¹ì • 네임스페ì´ìŠ¤ì— ìƒì„±í• 수 없다. ê·¸ë¦¬ê³ ë™ì¼í•œ 네임스페ì´ìŠ¤ì˜ íŒŒë“œì—서만 ì‚¬ìš©í• ìˆ˜ 있다. * ì´ê²Œ 무슨ë§ì´ì§€? - [서지혜] * í´ëŸ¬ìŠ¤í„°ëŠ” 최ìƒìœ„ 수준ì´ê³ ê·¸ ì•ˆì— ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë“±ìœ¼ë¡œ ë‚˜ëˆ ì§€ëŠ”ë° PV는 네임스페ì´ìФ ì•ˆì— ì„¤ì •í•˜ëŠ” 리소스가 ì•„ë‹ˆë¼ ì—¬ëŸ¬ í´ëŸ¬ìŠ¤í„°ì—서 ì ‘ê·¼í• ìˆ˜ 있는거ë¼ê³ 얘기하는듯. -[김준ì„] * p290 * í¼ì‹œìŠ¤í„´íŠ¸ 볼륨 í´ë ˆìž„ 참조 {{{ .. volumeMounts: - name: mongodb-data mountpath: /data/db .. volumes: - name: mongodb-data persistentVolumeClaim: claimName: mongodb-pvc }}} * ì°¸ê³ ë°‘ì¤„ - [김준ì„] * p293 * ì´ë¯¸ ë³¼ë¥¨ì„ ì‚¬ìš©í–ˆê¸° ë•Œë¬¸ì— ë°ì´í„°ë¥¼ ê°€ì§€ê³ ìžˆìœ¼ë¯€ë¡œ í´ëŸ¬ìŠ¤í„° 관리ìžê°€ ë³¼ë¥¨ì„ ì™„ì „ížˆ 비우지 않으면 새로운 í´ë ˆìž„ì— ë°”ì¸ë”©í• 수 없다. * pv를 비워야한단 소린가? - [김준ì„] * persistentVolumeClaimPolicy를 Retain * 다른 ë‘ ê°€ì§€ 리í´ë ˆìž„ ì •ì±…ì€ Recycleê³¼ Delete다. * Recycleì€ deprecated ë˜ì—ˆë‹¤. [https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming|ì°¸ê³ ] - [서지혜] === í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì˜ ë™ì í”„ë¡œë¹„ì €ë‹ === * p294 * ì—¬ì „ížˆ í´ëŸ¬ìŠ¤í„° 관리ìžëŠ” ì‹¤ì œ ìŠ¤í† ë¦¬ì§€ë¥¼ 미리 í”„ë¡œë¹„ì €ë‹ í•´ë‘¬ì•¼ 한다. * ì¼ ëŸ‰ì´ ì¤„ì–´ë“¤ì§€ëŠ” 않는다. 하지만 한번 해놓ì€ê²Œ ë” ì˜ë¯¸ë¥¼ 가지게 ëœë‹¤. - [김준ì„] * p295 * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ í”„ë¡œë¹„ì €ë„ˆë¥¼ ë°°í¬í•˜ê³ 사용ìžê°€ ì„ íƒ ê°€ëŠ¥í•œ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì˜ íƒ€ìž…ì„ í•˜ë‚˜ ì´ìƒì˜ ìŠ¤í† ë¦¬ì§€í´ëž˜ìФ 오브ì 트로 ì •ì˜í• 수 있다. 사용ìžê°€ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ì—서 ìŠ¤í† ë¦¬ì§€í´ëž˜ìŠ¤ë¥¼ 참조하면 í”„ë¡œë¹„ì €ë„ˆê°€ í¼ì‹œìŠ¤í„´íŠ¸ ìŠ¤í† ë¦¬ì§€ë¥¼ í”„ë¡œë¹„ì €ë‹í• 때 ì´ë¥¼ 처리한다. * ë™ìž‘ 밑줄 - [김준ì„] * p298 * ìŠ¤í† ë¦¬ì§€í´ëž˜ìŠ¤ì˜ ì¢‹ì€ ì ì€ í´ë ˆìž„ ì´ë¦„으로 ì´ë¥¼ 참조한다는 사실ì´ë‹¤. 그러므로 다른 í´ëŸ¬ìŠ¤í„° ê°„ ìŠ¤í† ë¦¬ì§€í´ëž˜ìФ ì´ë¦„ì„ ë™ì¼í•˜ê²Œ 사용한다면 PVC ì •ì˜ë¥¼ 다른 í´ëŸ¬ìŠ¤í„°ë¡œ ì´ì‹ 가능하다. * 재사용성 ì¦ê°€ - [김준ì„] * í”„ë¡œë¹„ì €ë„ˆëŠ” ì‹¤ì œ ìŠ¤í† ë¦¬ì§€ë„ í”„ë¡œë¹„ì €ë‹í–ˆë‹¤. * EZ - [서지혜] * {{{kubectl get sc}}} * p302 * 빈 문ìžì—´ì„ ìŠ¤í† ë¦¬ì§€í´ëž˜ìФ ì´ë¦„으로 ì§€ì •í•˜ë©´ PVCê°€ 새로운 PV를 ë™ì í”„ë¡œë¹„ì €ë‹ í•˜ëŠ” ëŒ€ì‹ ë¯¸ë¦¬ í”„ë¡œë¹„ì €ë‹ ëœ PVì— ë°”ì¸ë”©ëœë‹¤. * ë™ì í”„ë¡œë¹„ì €ë‹ëœ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì„ ê°€ì ¸ì˜¤ëŠ” ê²ƒì„ í¬í•¨í•œ ì €ì²´ ì ˆì°¨ë¥¼ 그림ì—서 확ì¸í•˜ìž. 1. í´ëŸ¬ìŠ¤í„° 관리ìžëŠ” í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ í”„ë¡œë¹„ì €ë„ˆë¥¼ ì„¤ì •í•œë‹¤. 1. 관리ìžëŠ” 하나 í˜¹ì€ ê·¸ ì´ìƒì˜ ìŠ¤í† ë¦¬ì§€í´ëž˜ìŠ¤ë¥¼ ìƒì„±í•˜ê³ 그중 하나를 기본값으로 ì •í•œë‹¤. 1. 사용ìžëŠ” ìŠ¤í† ë¦¬ì§€í´ëž˜ìФ 중 하나를 참조해 PVC를 ìƒì„±í•œë‹¤. 1. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ìŠ¤í† ë¦¬ì§€í´ëž˜ìŠ¤ì™€ 거기서 ì°¸ì¡°ëœ í”„ë¡œë¹„ì €ë„ˆë¥¼ ì‚´íŽ´ë³´ê³ í”„ë¡œë¹„ì €ë„ˆì—게 pvc로 ìš”ì²ëœ ì ‘ê·¼ 모드, ìŠ¤í† ë¦¬ì§€ í¬ê¸°, 파ë¼ë¯¸í„°ë¥¼ 기반으로 새 PV를 í”„ë¡œë¹„ì €ë‹í•˜ë„ë¡ ìš”ì²í•œë‹¤. 1. í”„ë¡œë¹„ì €ë„ˆëŠ” ì‹¤ì œ ìŠ¤í† ë¦¬ì§€ë¥¼ í”„ë¡œë¹„ì €ë‹í•˜ê³ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ì„ ìƒì„±í•˜ê³ PVCì— ë°”ì¸ë”©í•œë‹¤. 1. 사용ìžëŠ” PVC ì´ë¦„으로 참조하는 볼륨과 파드를 ìƒì„±í•œë‹¤. * ì–´ë µë„¤ - [김준ì„] == 컨피그맵과 시í¬ë¦¿: ì• í”Œë¦¬ì¼€ì´ì…˜ ì„¤ì • == === 컨테ì´ë„ˆí™”ëœ ì• í”Œë¦¬ì¼€ì´ì…˜ ì„¤ì • === * p306 * 파ì¼ì„ ì´ë¯¸ì§€ ì•ˆì— ë„£ê³ ë¹Œë“œí•˜ëŠ” ê²ƒì€ ì• í”Œë¦¬ì¼€ì´ì…˜ 소스 ì½”ë“œì— ì„¤ì • ë‚´ìš©ì„ ë„£ê³ í•˜ë“œì½”ë”©í•˜ëŠ” 것과 비슷하다. 그로 ì¸í•´ ì¸ì¦ ì •ë³´ë‚˜ 암호화 키와 ê°™ì´ ë¹„ë°€ë¡œ ìœ ì§€í•´ì•¼ 하는 ë‚´ìš©ì„ í¬í•¨í•´ ì–´ë–¤ ì •ë³´ê°€ ëë“ , 해당 ì´ë¯¸ì§€ì— ì ‘ê·¼í• ìˆ˜ 있는 ëª¨ë“ ì‚¬ëžŒì´ë©´ ë³¼ 수 있게 ëœë‹¤. * credentail키 컨테ì´ë„ˆì— ë„£ê³ ì´ë¯¸ì§€ ë§ì•˜ë‹¤ê°€ ì´ë¯¸ì§€ ížˆìŠ¤í† ë¦¬ ì‹¹ì§€ìš°ê³ ë‹¤ì‹œ ë§ë¼ê³ 시니어 엔지니어가 슬랙서 태그걸로 호출하ë˜ê²Œ 지지난달. 본ì¸ë§Œì˜ ë³´ì•ˆì •ì±…ë•Œë¬¸ì—... - [김준ì„] * ì„¤ì • ë°ì´í„°ë¥¼ ì €ìž¥í•˜ëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ 리소스를 컨피그맵ì´ë¼ê³ 한다. * configMap 줄여서 cm - [김준ì„] * ì»¨í”¼ê·¸ë§µì„ ì‚¬ìš©í•´ ì„¤ì • ë°ì´í„°ë¥¼ ì €ìž¥í• ì§€ ì—¬ë¶€ì— ê´€ê³„ì—†ì´ ë‹¤ìŒ ë°©ë²•ì„ í†µí•´ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ êµ¬ì„±í• ìˆ˜ 있다. * 컨테ì´ë„ˆì— ëª…ë ¹ì¤„ ì¸ìˆ˜ ì „ë‹¬ * ê° ì»¨í…Œì´ë„ˆë¥¼ 위한 ì‚¬ìš©ìž ì •ì˜ í™˜ê²½ë³€ìˆ˜ ì§€ì • * 특수한 ìœ í˜•ì˜ ë¶ˆë¥¨ì„ í†µí•´ ì„¤ì • 파ì¼ì„ 컨테ì´ë„ˆì— 마운트 * ëª…ë ¹ì¤„ ì¸ìˆ˜ ì „ë‹¬ CMD, ENTRYPOINT / 환경변수 $(INTERVAL) / '/app/nginx/config/' - [김준ì„] === 컨테ì´ë„ˆì— ëª…ë ¹ì¤„ ì¸ìž ì „ë‹¬ === * p307 * ENTRYPOINT와 CMD ì´í•´ * Dockerfileì—서 ë‘ ê°œì˜ ì§€ì¹¨ì„ ë‹¤ìŒ ë‘ ë¶€ë¶„ì„ ì •ì˜í•œë‹¤. * ENTRYPOINT는 컨테ì´ë„ˆê°€ 시작ë 때 호출ë ëª…ë ¹ì–´ë¥¼ ì •ì˜í•œë‹¤. * CMD는 ENTRYPOINTì— ì „ë‹¬ë˜ëŠ” ì¸ìžë¥¼ ì •ì˜í•œë‹¤. * p308 * CMD ëª…ë ¹ì–´ë¥¼ 사용해 ì´ë¯¸ì§€ê°€ 실행ë 때 ì‹¤í–‰í• ëª…ë ¹ì–´ë¥¼ ì§€ì •í• ìˆ˜ 있지만, 올바른 ë°©ë²•ì€ ENTRYPOINT ëª…ë ¹ì–´ë¡œ ì‹¤í–‰í•˜ê³ ê¸°ë³¸ ì¸ìžë¥¼ ì •ì˜í•˜ë ¤ëŠ” 경우ì—ë§Œ CMD를 ì§€ì •í•˜ëŠ” 것ì´ë‹¤. * shellê³¼ exec í˜•ì‹ ê°„ì˜ ì°¨ì´ì * ë‘ëª…ë ¹ì–´ëŠ” ë‘ ê°€ì§€ 서로 다른 형ì‹ì„ ì§€ì›í•œë‹¤. * shellí˜•ì‹ - 예: ENTRYPOINT node app.js * exec í˜•ì‹ - 예: ENTRYPOINT [:node , "app.js"] * exec 형ì‹ì„ 사용하면 ì…¸ 내부가 ì•„ë‹ˆë¼ ì»¨í…Œì´ë„ˆ ë‚´ë¶€ì—서 프로세스를 ì§ì ‘ 실행한다는게 무슨 ì˜ë¯¸ì§€ - [서지혜] * {{{1 ? Ssl 0:00 node app.js }}} * {{{1 ? ss 0:00 /bin/sh -c node app.js 7 ? sl 0:00 node app.js }}} * exec로 실행ëì„때랑 shell형ì‹ìœ¼ë¡œ 실행ëì„때 ì°¨ì´ í”„ë¡œì„¸ìŠ¤ ë·° - [김준ì„] * p311 * || ë„커 || ì¿ ë²„ë„¤í‹°ìŠ¤ || 설명 || || ENTRYPOINT || command || 컨테ì´ë„ˆ 안ì—서 실행ë˜ëŠ” ì‹¤í–‰íŒŒì¼ || || CMD || args || 실행파ì¼ì— ì „ë‹¬ë˜ëŠ” ì¸ìž || * 매핑ë˜ëŠ” ê°’. command: args: 로 차트ì—서는 ì“°ì§€ - [김준ì„] * p312 * 문ìžì—´ ê°’ì„ ë”°ì˜´í‘œë¡œ ë¬¶ì„ í•„ìš”ëŠ” 없다(숫ìžëŠ” 묶어야 한다) * "15" ì´ë ‡ê²Œ ì¸ìž ë„˜ê¸¸ë• ìˆ«ìžëŠ” ë¬¶ì–´ë¼ - [김준ì„] === 컨테ì´ë„ˆì˜ 환경변수 ì„¤ì • === * p314 * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ìžë°”로 ìž‘ì„±ëœ ê²½ìš°ì—는 System.getenv("INTERVAL"). NodeJS로 작성ë„니 경우ì—는 process.env.INTERVAL, 파ì´ì¬ìœ¼ë¡œ ìž‘ì„±ëœ ê²½ìš°ë„¤ëŠ” {{{os.environ.['INTERVAL']ì„}}} 사용하면 ëœë‹¤. * 기본 env 호출법 밑줄 - [김준ì„] *{{{ env: - name: INTERVAL value: "30" }}} * 예시 - [김준ì„] * 환경변수는 파드 ë ˆë²¨ì´ ì•„ë‹Œ 컨테ì´ë„ˆ ì •ì˜ ì•ˆì— ì„¤ì •í•œë‹¤. * p315 * $(VAR) êµ¬ë¬¸ì„ ì‚¬ìš©í•´ ì´ë¯¸ ì •ì˜ëœ 환경변수나 기타 기존 변수를 ì°¸ì¡°í• ìˆ˜ë„ ìžˆë‹¤. * $(VARIABLE_NAME) - [김준ì„] * value 필드 ëŒ€ì‹ valueFrom 으로 í™˜ê²½ë³€ìˆ«ê°’ì˜ ì›ë³¸ 소스로 ì‚¬ìš©í• ìˆ˜ 있다. * from - [김준ì„] === 컨피그맵으로 ì„¤ì • 분리 === * p316 * ì»¨í”¼ê·¸ë§µì€ ì§§ì€ ë¬¸ìžì—´ì—서 ì „ì²´ ì„¤ì • 파ì¼ì— ì´ë¥´ëŠ” ê°’ì„ ê°€ì§€ëŠ” 키/ê°’ ìŒìœ¼ë¡œ ê¶ˆì„±ëœ ë§µì´ë‹¤. * Map - [김준ì„] * 파드는 ì»¨í”¼ê·¸ë§µì„ ì´ë¦„으로 참조하기 때문ì—, ëª¨ë“ í™˜ê²½ì—서 ë™ì¼í•œ 파드 ì •ì˜ë¥¼ 사용해 ê° í™˜ê²½ì—서 서로 다른 ì„¤ì •ì„ ì‚¬ìš©í• ìˆ˜ 있다. * 컨피그맵 ì´ë¦„ì€ ê°™ê³ ë‚´ìš©ì€ ë‹¤ë¥´ê²Œ? - [김준ì„] * p318 * {{{ kubectl create configmap fortune-config --from-literal=sleep-interval=25 }}} * 컨피그맵 키는 ìœ íš¨í•œ DNS 서브ë„ë©”ì¸(subdomain)ì´ì–´ì•¼ 한다(ì˜ìˆ«ìž, 대시, 밑줄, ì ë§Œ í¬í•¨ 가능). 필요한 경우 ì ì´ ë¨¼ì € 나올 수 있다. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * {{{ - image: luksa/fortune:env env: - name: INTERVAL valueFrom: configMapKeyRef: name: fortune-config key: sleep-interval }}} * 한개만 pick - [김준ì„] * {{{ kubectl create configmap my-config --from-file=config-file.conf }}} * p323 * 파드를 ìƒì„±í• 때 존재하지 않는 ì»¨í”¼ê·¸ë§µì„ ì§€ì •í•˜ë©´ 어떻게 ë˜ëŠ”ì§€ ê¶ê¸ˆí• 것ì´ë‹¤. * configë§µì´ ì—†ìŠµë‹ˆë‹¤? ì• ì´ˆì— ì‹¤í–‰ì€ ë˜ë‚˜? - [김준ì„] * 그런 ë‹¤ìŒ ëˆ„ë½ëœ ì»¨í”¼ê·¸ë§µì„ ìƒì„±í•˜ë©´ ì‹¤íŒ¨í–ˆë˜ ì»¨í…Œì´ë„ˆëŠ” 파드를 다시 만들지 ì•Šì•„ë„ ì‹œìž‘ëœë‹¤. * 오 그럼 실행ë˜ë‚˜ë³´ë„¤ - [김준ì„] * 컨피그맵 참조를 옵션으로 í‘œì‹œí• ìˆ˜ë„ ìžˆë‹¤(configMapKeyRef.optional: true로 ì§€ì •). ì´ëŸ° 경우ì—는 ì»¨í”¼ê·¸ë§µì´ ì¡´ìž¬í•˜ì§€ ì•Šì•„ë„ ì»¨í…Œì´ë„ˆëŠ” 시작한다. * 옵션 밑줄 - [김준ì„] * envFrom ì†ì„±ì„ 사용해 환경변수로 ëª¨ë‘ ë…¸ì¶œí• ìˆ˜ 있다. * 파ì¼ë‹¨ìœ„로 envFrom으로 환경변수 노출한단 뜻 - [김준ì„] * p324 * CONFIG_FOO-BAR는 대시를 ê°€ì§€ê³ ìžˆì–´ 올바른 환경변수 ì´ë¦„ì´ ì•„ë‹ˆê¸° 때문ì´ë‹¤. ì´ëŸ° ê²½ìš°ì— ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ì–´ë–¤ í˜•íƒœë¡œë“ ìž„ì˜ì˜ 키로 변환하지 않는다. * ì–¸ë”ë°” 쓰세요 - [김준ì„] * p325 * {{{ args: ["$(INTERVAL)"] }}} * 앞ì—서 한 것과 ë™ì¼í•˜ê²Œ 환경변수를 ì •ì˜í–ˆì§€ë§Œ $(ENVVARIABLENAME) ë¬¸ë²•ì„ ì‚¬ìš©í•´ ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ 해당 ë³€ìˆ˜ì˜ ê°’ì„ ì¸ìžì— 주입한다. * ì •ì˜ ë°‘ì¤„ - [김준ì„] * p326 * 컨테ì´ë„ˆì— ë…¸ì¶œì‹œí‚¤ë ¤ë©´, 6장ì—서 언급한 특수 볼륨 ìœ í˜• 중 í•˜ë‚˜ì¸ ì»¨í”¼ê·¸ë§µ ë³¼ë¥¨ì„ ì‚¬ìš©í• ìˆ˜ 있다. * ì´ê±´ 안ì¨ë³¸ê²ƒ 같네 - [김준ì„] * p329 * {{{ volumeMounts: ... - name: config mountPath: /etc/nginx/conf.d readOnly: true ... volumes: - name: config configMap: name: fortune-config ... }}} * configMapì„ volume으로 ì„ ì–¸ 후 volumeMount로 해당 config를 mount - [김준ì„] * p331 * 다행히 컨피그맵 ë³¼ë¥¨ì„ ì»¨í”¼ê·¸ë§µ í•ëª©ì˜ ì¼ë¶€ë§Œìœ¼ë¡œ 채울 수 있다. * {{{ volumes: - name: config configMap: name: fortune-config items: - key: my-nginx-config.conf path: gzip.conf }}} * ì›ëž˜ ìžˆë˜ íŒŒì¼ì€ 해당 파ì¼ì‹œìŠ¤í…œì´ ë§ˆìš´íŠ¸ë¼ ìžˆëŠ” ë™ì•ˆ ì ‘ê·¼í• ìˆ˜ 없게 ëœë‹¤. * ì „ì²´ ë³¼ë¥¨ì„ ë§ˆìš´íŠ¸í•˜ëŠ” ëŒ€ì‹ volumeMountì— subPathì†ì„±ìœ¼ë¡œ 파ì¼ì´ë‚˜ ë””ë ‰í„°ë¦¬ 하나를 ë³¼ë¥¨ì— ë§ˆìš´íŠ¸í• ìˆ˜ 있다. * ì´ë ‡ê²Œ í• ìˆ˜ ìžˆìŒ - [김준ì„] * p333 * 하지만 개별 파ì¼ì„ 마운트하는 ì´ ë°©ë²•ì€ íŒŒì¼ ì—…ë°ì´íŠ¸ì™€ ê´€ë ¨í•´ ìƒëŒ€ì 으로 í° ê²°í•¨ì„ ê°€ì§€ê³ ìžˆë‹¤. * ì´ë ‡ê²Œ í• ìˆ˜ 있으나 쓰지마세요 - [김준ì„] * p334 * 환경변수 ë˜ëŠ” ëª…ë ¹ì¤„ ì¸ìˆ˜ë¥¼ ì„¤ì • 소스로 ì‚¬ìš©í• ë•Œì˜ ë‹¨ì ì€ í”„ë¡œì„¸ìŠ¤ê°€ 실행ë˜ê³ 있는 ë™ì•ˆì— ì—…ë°ì´íŠ¸í• ìˆ˜ 없다는 것ì´ë‹¤. * command나 entry-point로는 별로 좋지 않다는 ê±°ì§€ - [김준ì„] * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ì„¤ì •ì„ ë‹¤ì‹œ ì½ëŠ” ê¸°ëŠ¥ì„ ì§€ì›í•˜ëŠ” 않는 ê²½ìš°ì— ì‹¬ê°í•œ ë¬¸ì œê°€ ë°œìƒí•œë‹¤. ì´ë¡œ ì¸í•´ 서로 다른 ì„¤ì •ì„ ê°€ì§„ ì¸ìŠ¤í„´ìŠ¤ê°€ 실행ë˜ëŠ” 결과를 초래한다. * commandê°€ 다르단거지 - [김준ì„] * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 다시 ì½ê¸°ë¥¼ ì§€ì›í•œë‹¤ë©´, ì»¨í”¼ê·¸ë§µì„ ìˆ˜ì •í•˜ëŠ” ê²ƒì€ ê·¸ë¦¬ í°ë¬¸ì œëŠ” 아니다. 하지만 컨피그맵 ë³¼ë¥¨ì˜ íŒŒì¼ì´ 실행 ì¤‘ì¸ ëª¨ë“ ì¸ìŠ¤í„´ìŠ¤ì— ê±¸ì³ ë™ê¸°ì 으로 ì—…ë°ì´íЏë˜ì§€ 않기 때문ì—, 개별 íŒŒë“œì˜ íŒŒì¼ì´ 최대 1ë¶„ ë™ì•ˆ ë™ê¸°í™”ë˜ì§€ 않는 ìƒíƒœë¡œ ìžˆì„ ìˆ˜ 있ìŒì„ ì•Œê³ ìžˆì–´ì•¼ 한다. * command로 실행ë˜ëŠ”ê±¸ env로 ë°”ê¾¸ê³ reload하는걸 ìƒê°í•´ë´¤ëŠ”ë° ìƒê°ë³´ë‹¤ ì–´ë µê² ë„¤ - [김준ì„] === 시í¬ë¦¿ìœ¼ë¡œ 민ê°í•¨ ë°ì´í„°ë¥¼ 컨테ì´ë„ˆì— ì „ë‹¬ === * p337 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 시í¬ë¦¿ì´ë¼ëŠ” ë³„ë„ ì˜¤ë¸Œì 트를 ì œê³µí•œë‹¤. * secret - [김준ì„] * 시í¬ë¦¿ì„ 다ìŒê³¼ ê°™ì€ ìƒí™©ì—서 ì‚¬ìš©í• ìˆ˜ 있다. * 환경변수로 시í¬ë¦¿ í•ëª©ì„ ì»¨í…Œì´ë„ˆì— ì „ë‹¬ * 시í¬ë¦¿ í•ëª©ì„ ë³¼ë¥¨ 파ì¼ë¡œ 노출 * 활용 ëª©ë¡ - [김준ì„] * ë˜í•œ 노드 ìžì²´ì 으로 시í¬ë¦¿ì„ í•ìƒ ë©”ëª¨ë¦¬ì—ë§Œ ì €ìž¥ë˜ê²Œ í•˜ê³ ë¬¼ë¦¬ ì €ìž¥ì†Œì— ê¸°ë¡ë˜ì§€ 않ë„ë¡ í•œë‹¤. * ì´ê±´ 개발ìžë“¤ì´ ì‹¤í–‰í• ë•Œë§Œ 안다는 그것 - [김준ì„] * 마스터 노드ì—는 시í¬ë¦¿ì„ 암호화ë˜ì§€ ì•Šì€ í˜•ì‹ìœ¼ë¡œ ì €ìž¥í•˜ë¯€ë¡œ, 시í¬ë¦¿ì— ì €ìž¥í•œ 민ê°í•œ ë°ì´í„°ë¥¼ ë³´í˜¸í•˜ë ¤ë©´ 마스터 노드를 보호하는 ê²ƒì´ í•„ìš”í•˜ë‹¤.(base64로 ì¸ì½”딩으로 바뀜) * base64로 ì¸ì½”딩해서 보관한다ë˜ë° - [김준ì„] * p339 * 시í¬ë¦¿ì´ ê°–ê³ ìžˆëŠ” 세 가지 í•ëª©ì€ íŒŒë“œ 안ì—서 ì¿ ë²„ë„¤í‹°ìŠ¤ API 서버와 í†µì‹ í• ë•Œ 필요한 ëª¨ë“ ê²ƒì„ ë‚˜íƒ€ë‚¸ë‹¤. * p341 * {{{ $ kubectl create secret generic fortune-https --from-file=https.key }}} * 예시 밑줄 -[김준ì„] * 시í¬ë¦¿ì˜ 세 가지 ìœ í˜•ì—는 ë„커 ë ˆì§€ìŠ¤íŠ¸ë¦¬ë¥¼ 사용하기 위한 docker-registry, TLS í†µì‹ ì„ ìœ„í•œ tls, genericì´ ìžˆë‹¤. * docker-registry / genericì •ë„ë§Œ ì¨ë³¸ë“¯ - [김준ì„] * p343 * Base64 ì¸ì½”ë”©ì„ ì‚¬ìš©í•˜ëŠ” 까ë‹ì€ 간단하다. 시í¬ë¦¿ í•ëª©ì— ì¼ë°˜ í…스트ë¿ë§Œ ì•„ë‹ˆë¼ ë°”ì´ë„ˆë¦¬ ê°’ë„ ë‹´ì„ ìˆ˜ 있기 때문ì´ë‹¤. * ë³µí˜¸í™”ë„ ì‰½ì§€ 왜 ì¼ëƒ.. - [김준ì„] * p345 * {{{ ... - name: certs mountPath: /etc/nginx/certs/ readOnly: true ... - name: certs secret: secretname: fortune-https }}} * 활용 ì˜ˆì œ 밑줄 - [김준ì„] * p348 * ì¸ì¦ì„œì™€ ê°œì¸ í‚¤ë¥¼ secret ë³¼ë¥¨ì— ë§ˆìš´íŠ¸í•´ íŒŒë“œì— ì„±ê³µì 으로 ì „ë‹¬í–ˆë‹¤. secret ë³¼ë¥¨ì€ ì‹œí¬ë¦¿ 파ì¼ì„ ì €ìž¥í•˜ëŠ” ë° ì¸ë©”모리 파ì¼ì‹œìŠ¤í…œ(tmpfs)ì„ ì‚¬ìš©í•œë‹¤. * 메모리 íŒŒì¼ ì‹œìŠ¤í…œ. linux ì„¤ì¹˜í• ë•Œë„ ì”€ - [김준ì„] * {{{ env: - name: FOO_SECRET valueFrom: secretKeyRef: name: fortune-https key: foo }}} * ì´ê²ƒì€ INTERVAL 환경변수를 ì„¤ì •í•˜ëŠ” 것과 ê±°ì˜ ë¹„ìŠ·í•˜ë‹¤. 단지 ì´ë²ˆì—는 ì»¨í”¼ê·¸ë§µì„ ì°¸ì¡°í•˜ëŠ” ë° confgMapKeyRef ëŒ€ì‹ secretKeyRef를 사용해 시í¬ë¦¿ì„ 참조한다는 ì ì´ ë‹¤ë¥´ë‹¤. * 비슷하네 - [김준ì„] * p350 * {{{ $ kubectl create secret docker-registry mydockerhubsecret \ --docker-username=myusername --docker-password=mypassword \ --docker-email=my.email@provider.com }}} * docker-registry secret ì˜ˆì œ - [김준ì„] * {{{ imagePullScrets: - name: mydockerhubsecret }}} * 시í¬ë¦¿ì„ ì„œë¹„ìŠ¤ì–´ì¹´ìš´íŠ¸ì— ì¶”ê°€í•´ ëª¨ë“ íŒŒë“œì— ìžë™ìœ¼ë¡œ 추가ë 수 있게 하는 ë²•ì„ ë°°ìš¸ 것ì´ë‹¤. * saì— ì¶”ê°€ëŠ” ì¶”í›„ì— - [김준ì„] == ì• í”Œë¦¬ì¼€ì´ì…˜ì—서 파드 메타ë°ì´í„°ì™€ ê·¸ ì™¸ì˜ ë¦¬ì†ŒìŠ¤ì— ì•¡ì„¸ìŠ¤í•˜ê¸° == === Downward API로 메타ë°ì´í„° ì „ë‹¬ === * p354 * 그러나 íŒŒë“œì˜ IP, 호스트 노드 ì´ë¦„ 파드 ìžì²´ì˜ ì´ë¦„ê³¼ ê°™ì´ ì‹¤í–‰ 시ì 까지 ì•Œë ¤ì§€ì§€ ì•Šì€ ë°ì´í„°ì˜ 경우는 어떨까? * ì´ê²Œ 필요한 ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 있나? - [김준ì„] * Listenì„ íŠ¹ì • Address 로 해야 한다거나 Leader Electionì˜ Key로 ì¨ì•¼ 한다거나 logì— hostnameì´ë‚˜ Node Nameì„ ë‚¨ê²¨ì•¼ 한다거나 í• ìˆ˜ 있습니다. - [bluemir] * p355 * Downward API를 사용하면 파드 ìžì²´ì˜ 메타ë°ì´í„°ë¥¼ 해당 파드 ë‚´ì—서 실행 ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤ì— ë…¸ì¶œí• ìˆ˜ 있다. 현재 ë‹¤ìŒ ì •ë³´ë¥¼ 컨테ì´ë„ˆì— ì „ë‹¬ í• ìˆ˜ 있다. * íŒŒë“œì˜ ì´ë¦„ * íŒŒë“œì˜ ì£¼ì†Œ * 파드가 ì†í•œ 네임스페ì´ìФ * 파드가 실행 ì¤‘ì¸ ë…¸ë“œì˜ ì´ë¦„ * 파드가 실행 ì¤‘ì¸ ì„œë¹„ìŠ¤ 어카운트 ì´ë¦„ * ê°ì»¨í…Œì´ë„ˆì˜ CPU와 메모리 ìš”ì² * ê° ì»¨í…Œì´ë„ˆì˜ CPU와 메모리 ì œí•œ * íŒŒë“œì˜ ë ˆì´ë¸” * íŒŒë“œì˜ ì–´ë…¸í…Œì´ì…˜ * CPU와 메모리 ìš”ì²ì€ 대부분 어플리케ì´ì…˜ì˜ heap 사ì´ì¦ˆ ì¡°ì •í•˜ëŠ”ë° ì“¸ìˆ˜ ìžˆê² ë„¤ - [김준ì„] * p356 * {{{ env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name ... - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP ... }}} * yaml 예시 - [김준ì„] * p359 * 환경변수 ëŒ€ì‹ íŒŒì¼ë¡œ 메타ë°ì´í„°ë¥¼ ë…¸ì¶œí•˜ë ¤ëŠ” 경우 downwardAPI ë³¼ë¥¨ì„ ì •ì˜í•´ 컨테ì´ë„ˆì— ë§ˆìš´íŠ¸í• ìˆ˜ 있다. * {{{ ... volumeMounts: - name: downward mountPath: /etc/downward volumes: - name: downard downwardAPI: items: - path: "podName" fieldRef: fieldPath: metadata.name ... }}} * ì •ì˜ ë°‘ì¤„ - [김준ì„] * p362 * 보다시피 ê° ë ˆì´ë¸”/어노테ì´ì…˜ì€ 별ë„ì˜ ì¤„ì— í‚¤=ê°’ 형ì‹ìœ¼ë¡œ ì €ìž¥ëœë‹¤. ê°’ì´ ì—¬ëŸ¬ì¤„ì¸ ê²½ìš° 줄 바꾸기 문ìžê°€ \n으로 í‘œì‹œë¼ í•œ 줄로 기ë¡ëœë‹¤. * 그래서 ê°’ì„ ê°€ì ¸ì˜¤ë©´ ê¼ vimì´ë‚˜ 기타 프로그램ì—서 ì¤„ì„ ì—†ì• ê³ ì´ìƒí•œê²Œ 없는지 ë´ì•¼í• 때가 있지 - [김준ì„] * p363 * í™˜ê²½ë³€ìˆ«ê°’ì€ ë‚˜ì¤‘ì— ì—…ë°ì´íЏ í• ìˆ˜ 없기 ë•Œë¬¸ì— íŒŒë“œì˜ ë ˆì´ë¸” ë˜ëŠ” 어노테ì´ì…˜ì´ 환경변수로 ë…¸ì¶œëœ ê²½ìš° ë³€ê²½ì´ ë°œìƒí•œ 다ìŒì— 새로운 ê°’ì„ ë…¸ì¶œí• ìˆ˜ 있는 ë°©ë²•ì´ ì—†ë‹¤. * ì´ëŸ° ê¸°ëŠ¥ì€ ì œê³µë˜ì§€ë§Œ 안쓰시는게 좋습니다 - [김준ì„] * 컨테ì´ë„ˆ 리소스 ì œí•œ ìš”ì²ê³¼ ê°™ì€ ì»¨í…Œì´ë„ˆ ìˆ˜ì¤€ì˜ ë©”íƒ€ë°ì´í„°ë¥¼ 노출하는 경우 ë‹¤ìŒ ì˜ˆì œì— í‘œì‹œëœ ê²ƒì²˜ëŸ¼ 리소스 필드를 참조하는 컨테ì´ë„ˆì˜ ì´ë¦„ì„ ì§€ì •í•´ì•¼ 한다. * ê·¸ë ‡ë‹¤ë”ë¼ - [김준ì„] === ì¿ ë²„ë„¤í‹°ìŠ¤ API 서버와 í†µì‹ í•˜ê¸° === * p364 * ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 다른 ë¦¬ì†ŒìŠ¤ì˜ ì •ë³´ê°€ 필요하거나 가능한 한 ìµœì‹ ì •ë³´ì— ì ‘ê·¼í•´ì•¼ 하는 경우 API 서버와 ì§ì ‘ í†µì‹ í•´ì•¼ 한다. * 사실 어디다 사용하는건지 ëª¨ë¥´ê² ë‹¤. - [김준ì„] * {{{kubectl cluster-info}}}를 실행해 URLì„ ì–»ì„수 있다. * curlì˜ --insecure ì˜µì…˜ì„ ì‚¬ìš©í•´ 서버 ì¸ì¦ì„œ 확ì¸ì„ 건너뛰ë„ë¡ ì‹œë„í•´ë³¼ 수 있지만 ì›í•˜ëŠ” 결과를 얻지는 못한다. * --insecure ë§Žì´ ì“°ì§€ 난 docker-registry ì— ì ‘ê·¼í• ë•Œ ë§Žì´ ì“´ë“¯ - [김준ì„] * {{{$ kubectl proxy}}} and {{{$ curl localhost:8001}}} * kube-proxyì— ì ‘ê·¼ - [김준ì„] * 초기 ë²„ì „ì˜ ì¿ ë²„ë„¤í‹°ìŠ¤ì— ë„ìž…ëœ ê°€ìž¥ ì¼ë°˜ì ì¸ ë¦¬ì†ŒìŠ¤ ìœ í˜•ë“¤ì€ íŠ¹ì • ê·¸ë£¹ì— ì†í•˜ì§€ 않는다. APi ê·¸ë£¹ì€ ë‚˜ì¤‘ì— ë„ìž…ë다. API ê·¸ë£¹ì´ ì—†ëŠ”, ì´ëŸ° 초기 리소스 ìœ í˜•ì€ ì´ì œ core API ê·¸ë£¹ì— ì†í•˜ëŠ” 것으로 간주ëœë‹¤. * v1 ê¸°ì¤€ì´ ë˜ê¹Œí•˜ëŠ”ê±¸ 풀어주는 í•목ì´ë„¤ - [김준ì„] * {{{$ curl http://localhost:8001/apis/batch/v1}}} * í˜¸ì¶œí• ìˆ˜ 있는 create나 deleteê°™ì€ê±¸ 보여줌. pod나 jobì˜ statusë„ ì–´ë–¤ ì¹´í…Œê³ ë¦¬ê°€ 있는지 보여줌 - [김준ì„] * {{{$ curl http://localhost:8001/apis/batch/v1/jobs}}} * kubectlì˜ get jobs 는 ì´ëŸ° API를 ì¨ì„œ ë³´ì—¬ì£¼ê² ì§€? - [김준ì„] * p371 * 파드 ë‚´ë¶€ì—서 API서버와 í†µì‹ í•˜ë ¤ë©´ ë‹¤ìŒ ì„¸ 가지를 처리해야 한다. * APIì„œë²„ì˜ ìœ„ì¹˜ë¥¼ 찾아야 한다. * API 서버와 í†µì‹ í•˜ê³ ìžˆëŠ”ì§€ 확ì¸í•´ì•¼ 한다. * API 서버로 ì¸ì¦í•´ì•¼ 한다. ê·¸ë ‡ì§€ 않으면 ë³¼ ìˆ˜ë„ ì—†ê³ ì•„ë¬´ê²ƒë„ í• ìˆ˜ 없다. * {{{https://kubernets}}} / -k( -- insecure) / ì¸ì¦ì„œ ë° í† í° í•„ìš” - [김준ì„] * p377 * 파드 ë‚´ì—서 실행 ì¤‘ì¸ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ ì¿ ë²„ë„¤í‹°ìŠ¤ APIì— ì ì ˆížˆ 액세스 í• ìˆ˜ 있는 ë°©ë²•ì„ ì •ë¦¬í•´ë³´ìž. * APIì„œë²„ì˜ ì¸ì¦ì„œê°€ ì¸ì¦ 기관으로부터 서명ë는지 ê²€ì¦, ca, cart 파ì¼ìž„. * ì• í”Œë¦¬ì¼€ì´ì…˜ì€ tokenì„ Authroization í—¤ë”ì— bearer í† í°ìœ¼ë¡œ 넣어 ì „ì†¡í•´ì•¼í•¨ * namespace 파ì¼ì€ íŒŒë“œì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìФ ì•ˆì— ìžˆëŠ” API오브ì íŠ¸ì˜ CRUD ìž‘ì—…ì„ ìˆ˜í–‰í• ë•Œ 네임스페ì´ìŠ¤ë¥¼ API서버로 ì „ë‹¬í•˜ëŠ”ë° ì‚¬ìš©í•´ì•¼ 한다. * ì¼ë°˜ì ì¸ ì¸ì¦ ì ˆì°¨ - [김준ì„] * p378 * https, ì¸ì¦ì„œ, ì¸ì¦ í† í°ì„ 다루는 ì¼ì€ 떄떄로 개발ìžì—게 너무 복잡해 ë³´ì¼ ë•Œê°€ 있다. ì €ìžëŠ” 개발ìžê°€ 서버 ì¸ì¦ì„œì˜ ìœ íš¨ì„± 검사를 비활성화하는 경우를 ë§Žì´ ë´ì™”다. * 프로ì 트 ì´ˆë°˜ì— ë³´ë©´ 대부분 ì´ëŸ°ê²½ìš°ê°€ 종종 - [김준ì„] * API서버와 ì§ì ‘ í†µì‹ í•˜ëŠ” ëŒ€ì‹ ë©”ì¸ ì»¨í…Œì´ë„ˆì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ì€ HTTPS ëŒ€ì‹ HTTP로 앰배서ë”ì— ì—°ê²°í•˜ê³ ì•°ë°°ì„œë” í”„ë¡ì‹œê°€ API ì„œë²„ì— ëŒ€í•œ HTTPS ì—°ê²°ì„ ì²˜ë¦¬í•˜ë„ë¡í•´ ë³´ì•ˆì„ íˆ¬ëª…í•˜ê²Œ ê´€ë¦¬í• ìˆ˜ 있다. * ë©”ì¸ - > ì•°ë²„ì„œë” : proxy 컨테ì´ë„ˆ -> API 서버 - [김준ì„] * p381 * curlì€ ì¼ë°˜ HTTP ìš”ì²ì„ ì•°ë°°ì„œë” ì»¨í…Œì´ë„ˆ ë‚´ì—서 실행 ì¤‘ì¸ í”„ë¡ì‹œë¡œ ì „ì†¡í•œ 다ìŒ, 프ë¡ì‹œëŠ” HTTPS ìš”ì²ì„ API 서버로 ì „ì†¡í•˜ë©°, í† í°ì„ ì „ì†¡í•´ í´ë¼ì´ì–¸íЏ ì¸ì¦ì„ ì²˜ë¦¬í•˜ê³ ì„œë²„ì˜ ì¸ì¦ì„œë¥¼ ê²€ì¦í•´ ì„œë²„ì˜ ì‹ ì›ì„ 확ì¸í•œë‹¤. * ca는 proxy 컨테ì´ë„ˆë‹ˆê¹Œ ì¸ì¦ ë í…Œê³ , 시í¬ë¦¿ì— 있는 default-token으로 tokenì˜ ì—ì„ í•´ì„œ 처리한다는것 같네 - [김준ì„] * p382 * 그러나 단순한 API ìš”ì² ì´ìƒì„ ìˆ˜í–‰í•˜ë ¤ë©´ ì¿ ë²„ë„¤í‹°ìŠ¤ API í´ë¼ì´ì–¸íЏ ë¼ì´ë¸ŒëŸ¬ë¦¬ 중 하나를 사용하는 ê²ƒì´ ì¢‹ë‹¤. * í´ë¼ë¦¬ì–¸íЏ ë¼ì´ë¸ŒëŸ¬ë¦¬ê°€ ì°¸ 많네 - [김준ì„] == 디플로ì—먼트: ì„ ì–¸ì ì• í”Œë¦¬ì¼€ì´ì…˜ ì—…ë°ì´íЏ == * p389 * ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„°ì—서 실행ë˜ëŠ” ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” 방법과 ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ 어떻게 무중단 ì—…ë°ì´íЏ 프로세스로 ì „í™˜í•˜ëŠ”ë° ë„ì›€ì„ ì£¼ëŠ”ì§€ ì„¤ëª…í• ê²ƒì´ë‹¤. * 9장 목ì - [김준ì„] === 파드ì—서 실행 ì¤‘ì¸ ì• í”Œë¦¬ì¼€ì´ì…˜ ì—…ë°ì´íЏ === * p391 * ëª¨ë“ íŒŒë“œë¥¼ ì—…ë°ì´íŠ¸í•˜ëŠ” 방법ì—는 ë‘ ê°€ì§€ê°€ 있다. ë‹¤ìŒ ì¤‘ 하나를 ìˆ˜í–‰í• ìˆ˜ 있다. * 기본 파드를 ëª¨ë‘ ì‚ì œí•œ ë‹¤ìŒ ìƒˆ 파드를 시작한다. * 새로운 파드를 ì‹œìž‘í•˜ê³ , ê°€ë™í•˜ë©´ 기존 파드를 ì‚ì œí•œë‹¤. 새 파드를 ëª¨ë‘ ì¶”ê°€í•œ ë‹¤ìŒ í•œêº¼ë²ˆì— ê¸°ì¡´ 파드를 ì‚ì œí•˜ê±°ë‚˜ 순차ì 으로 새 파드를 ì¶”ê°€í•˜ê³ ê¸°ì¡´ 파드를 ì ì§„ì 으로 ì œê±°í•´ ì´ ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ 있다. * 세가지 ì´ë¯¸ì§€ ì—…ë°ì´íЏ 방법 - [김준ì„] * p392 * 새 파드 ëª¨ë‘ ì‹¤í–‰ë˜ë©´ 그림과 ê°™ì´ ì„œë¹„ìŠ¤ì˜ ë ˆì´ë¸” ì…€ë ‰í„°ë¥¼ ë³€ê²½í•˜ê³ ì„œë¹„ìŠ¤ë¥¼ 새 파드로 ì „í™˜í• ìˆ˜ 있다. ì´ê²ƒì„ 블루-그린 디플로ì´ë¨¼íЏë¼ê³ 한다. * 블루 ê·¸ë¦°ì€ ë˜ ë¬´ìŠ¨ëœ»ì¼ê¹Œ - [김준ì„] * 새 파드가 ëª¨ë‘ ì‹¤í–‰ëœ í›„ ì´ì „파드를 한 ë²ˆì— ì‚ì œí•˜ëŠ” 방법 ëŒ€ì‹ íŒŒë“œë¥¼ 단계별로 êµì²´í•˜ëŠ” ë¡¤ë§ ì—…ë°ì´íŠ¸ë¥¼ ìˆ˜í–‰í• ìˆ˜ë„ ìžˆë‹¤. * 기본 설명 - [김준ì„] === ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ë¡œ ìžë™ ë¡¤ë§ ì—…ë°ì´íЏ 수행 === * p394 * kubectlì„ ì‚¬ìš©í•´ ì—…ë°ì´íŠ¸ë¥¼ 수행하면 프로세스가 훨씬 간단해지지만 ë‚˜ì¤‘ì— ë³¼ 수 ìžˆë“¯ì´ ì´ë°©ë²•ë„ ì´ì œëŠ” ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” ì˜¤ëž˜ëœ ë°©ë²•ì´ ë다. * ì´ê±´ 문서로만봤지 í•œë²ˆë„ ì‹¤ì „ì„œ 못봄 - [김준ì„] * p396 * YAML 파ì¼ì—는 대시 3개가 있는 줄로 구분해 여러 리소스 ì •ì˜ë¥¼ í¬í•¨í• 수 있다. * 메모 - [서지혜] * p397 * 기본 imagePullPolicy는 ì´ë¯¸ì§€ íƒœê·¸ì— ë”°ë¼ ë‹¤ë¥´ë‹¤. 컨테ì´ë„ˆê°€ latest 태그를 명시ì 으로 참조하는 경우 imagePullPolicyì˜ ê¸°ë³¸ê°’ì€ alwaysì´ì§€ë§Œ 컨테ì´ë„ˆê°€ 다른 태그를 참조하는 경우 ì •ì±…ì˜ ê¸°ë³¸ê°’ì€ IfNotPresentì´ë‹¤. * ìƒì‹ +1. ì´ê±´ 몰ëžë„¤ - [김준ì„] * p398 * {{{ $ kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v2 }}} * kubia-v1 replicasetì„ v2로 ë°”ê¾¸ê³ ì´ë¯¸ì§€ëŠ” v2 tag를 ì“°ìž - [김준ì„] * p400 * kubectlì´ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì˜ ì…€ë ‰í„°ë¥¼ 변경하기 ì „ì— ì‹¤í–‰ ì¤‘ì¸ íŒŒë“œì˜ ë ˆì´ë¸”ì„ ë¨¼ì € ìˆ˜ì •í•˜ê¸° 때문ì´ë‹¤. * 컨트롤러는 첫번째 v2파드를 ë§Œë“ ë‹¤. kubectlì€ ì´ì „ ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ë¥¼ 하나씩 ìŠ¤ì¼€ì¼ ë‹¤ìš´í•œë‹¤. * kubectlì´ ë¡¤ë§ ì—…ë°ì´íŠ¸ë¥¼ 계ì†í•˜ë©´ v2 íŒŒë“œì— ëŒ€í•œ ìš”ì² ë¹„ìœ¨ì´ ì ì ë” ë†’ì•„ì§€ê¸° 시작한다. ê²°êµ ì´ì „ ë ˆí”Œë¦¬ì¼€ì´ì…˜ ì»¨íŠ¸ë¡¤ëŸ¬ì˜ íŒŒë“œê°€ 0으로 ìŠ¤ì¼€ì¼ ë‹¤ìš´ë˜ë©° 마지막 v1 파드가 ì‚ì œë¼ ì„œë¹„ìŠ¤ê°€ ì´ì œ v2íŒŒë“œì— ì˜í•´ì„œë§Œ ì§€ì›ëœë‹¤ëŠ” ê²ƒì„ ì˜ë¯¸í•œë‹¤. * p403 * ë¡¤ë§ ì—…ë°ì´íŠ¸ì˜ ëª¨ë“ ë‹¨ê³„ë¥¼ 수행하는 ê²ƒì´ kubectl í´ë¼ì´ì–¸íЏë¼ëŠ” ê²ƒì„ ì•Œì•„ì°¨ë ¸ì„ ê²ƒì´ë‹¤. * ì§€ê¸ˆì€ ì—…ë°ì´íŠ¸ê°€ ì›í™œí•˜ê²Œ ì§„í–‰ë지만 kubectlì´ ì—…ë°ì´íŠ¸ë¥¼ 수행하는 ë™ì•ˆ ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì´ ì§„í–‰ë지만 kubectlì´ ì—…ë°ì´íŠ¸ë¥¼ 수행하는 ë™ì•ˆ ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì´ ëŠì–´ì§„다면 어떨까? * k8së„ ì´ë ‡ê²Œ ì–´ì„¤í”Œë•Œë„ ìžˆì—ˆêµ° - [김준ì„] * p404 * ì¿ ë²„ë„¤í‹°ìŠ¤ì—게 ì˜ë„하는 ì‹œìŠ¤í…œì˜ ìƒíƒœë¥¼ ì„ ì–¸í•˜ê³ ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ ê·¸ê²ƒì„ ë‹¬ì„±í• ìˆ˜ 있는 가장 ì¢‹ì€ ë°©ë²•ì„ ì°¾ì•„ëƒ„ìœ¼ë¡œì¨ ìŠ¤ìŠ¤ë¡œ ê·¸ ìƒíƒœë¥¼ 달성하ë„ë¡ í•˜ëŠ”ì§€ì— ëŒ€í•´ì„œ 강조했다. * k8sê°€ 스스로 ë°°í¬ ë° replica 관리를 해야 í•˜ëŠ”ë° kubectl rolling-update는 사용ìžê°€ 변경하게 ë˜ëŠ” ì…ˆì´ë¼ëŠ” 뜻ì´êµ° - [서지혜] * 바로 ì´ê²ƒì´ 현재 ì¿ ë²„ë„¤í‹°ìŠ¤ì—서 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ë°°í¬í•˜ëŠ” 가장 ì¢‹ì€ ë°©ë²•ì¸ ë””í”Œë¡œì´ë¨¼íЏë¼ëŠ” 새로운 리소스를 ë„입하게 ëœ ì›ë™ë ¥ì´ë‹¤. * enum같네.. - [김준ì„] === ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì„ ì–¸ì 으로 ì—…ë°ì´íŠ¸í•˜ê¸° 위한 디플로ì´ë¨¼íЏ 사용하기 === * 디플로ì´ë¨¼íŠ¸ëŠ” ë‚®ì€ ìˆ˜ì¤€ì˜ ê°œë…으로 간주ë˜ëŠ” ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ì…‹ì„ í†µí•´ 수행하는 ëŒ€ì‹ ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ë°°í¬í•˜ê³ ì„ ì–¸ì 으로 ì—…ë°ì´íŠ¸í•˜ê¸° 위한 ë†’ì€ ìˆ˜ì¤€ì˜ ë¦¬ì†ŒìŠ¤ë‹¤. * ì¢€ë” ì¶”ìƒì ? ì¸ ê°œë…ì´ê² ì§€ - [김준ì„] * {{{ apiVersion: apps/v1beta1 kind: Deployment metadata: name: kubia spec: replicas: 3 template: metadata: name: kubia labels: app: kubia spec: containers: - image: luksa/kubia:v1 name: nodejs }}} * yaml ì°¸ê³ - [김준ì„] * p407 * {{{ $ kubectl rollout status deployment kubia }}} * rolloutì€ ë°°í¬ëœê±¸ 얘기하는건가 - [김준ì„] * p408 * 디플로ì´ë¨¼íŠ¸ëŠ” 파드를 ì§ì ‘ 관리하지 않는다. ëŒ€ì‹ ë ˆí”Œë¦¬ì¹´ì…‹ì„ ìƒì„±í•˜ê³ ì´ë“¤ì´ 파드를 관리하ë„ë¡ ë§¡ê²¨ë‘”ë‹¤. * k8sê°€ ë‹¤í•´ì¤˜ë¼ - [김준ì„] * p409 * 디플로ì´ë¨¼íЏ ë¦¬ì†ŒìŠ¤ì— ì •ì˜ëœ 파드 í…œí”Œë¦¿ì„ ìˆ˜ì •í•˜ê¸°ë§Œ 하면 ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ ì‹¤ì œ 시스템 ìƒíƒœë¥¼ ë¦¬ì†ŒìŠ¤ì— ì •ì˜ëœ 산태로 만드는 ë° í•„ìš”í•œ ëª¨ë“ ë‹¨ê³„ë¥¼ 수행한다. ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ì…‹ì„ ìŠ¤ì¼€ì¼ ì—… ë˜ëŠ” ìŠ¤ì¼€ì¼ ë‹¤ìš´í•˜ëŠ” 것과 마찬가지로 디플로ì´ë¨¼íЏ 파드 템플릿ì—서 새 ì´ë¯¸ì§€ 태그를 참조해 ì‹œìŠ¤í…œì´ ì˜ë„하는 ìƒíƒœê°€ ë 수 있ë„ë¡ ì¿ ë²„ë„¤í‹°ìŠ¤ì— ë§¡ê¸°ë©´ ëœë‹¤. *kubectlì´ ì•„ë‹Œ k8sì„œë²„ì— ë§¡ê¸´ë‹¤ëŠ” ì˜ë¯¸ë„ í¬í•¨ì´ê² ì§€? - [김준ì„] * 새로운 ìƒíƒœë¥¼ 달성하는 ë°©ë²•ì€ ë””í”Œë¡œì´ë¨¼íŠ¸ì— êµ¬ì„±ëœ ë””í”Œë¡œì´ë¨¼íЏ ì „ëžµì— ì˜í•´ ê²°ì •ëœë‹¤. ê¸°ë³¸ì€ RollingUpdateë¼ëŠ” ë¡¤ë§ ì—…ë°ì´íЏ ì „ëžµì´ë‹¤. 대안으로 Recreate ì „ëžµì´ ìžˆëŠ”ë°, ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ì˜ íŒŒë“œ í…œí”Œë¦¿ì„ ìˆ˜ì •í•œ 후 ëª¨ë“ íŒŒë“œë¥¼ 샂게하는 것과 마찬가지로 한 ë²ˆì— ê¸°ì¡´ ëª¨ë“ íŒŒë“œë¥¼ ì‚ì œí•œ ë’¤ 새로운 파드를 ë§Œë“ ë‹¤. * p410 * {{{ $ kubectl patch deployment kubia -p '{"spec": {"minReadySeconds": 10}}' }}} * 디플로ì´ë¨¼íЏ 오브ì íŠ¸ì˜ ì „ì²´ YAMLì„ íŽ¸ì§‘í•˜ê±°ë‚˜ patch ëª…ë ¹ì–´ë¥¼ 사용해 ì´ë¯¸ì§€ë¥¼ 변경하는 ëŒ€ì‹ kubectl set image ëª…ë ¹ì–´ë¥¼ 사용해 컨테ì´ë„ˆê°€ í¬í•¨ëœ ëª¨ë“ ë¦¬ì†ŒìŠ¤ë¥¼ ìˆ˜ì •í• ìˆ˜ 있다. * {{{ $ kubectl set image deployment kubia nodejs=luksa/kubia:v2 }}} * 디플로ì´ë¨¼íŠ¸ì™€ ê·¸ ì™¸ì˜ ë¦¬ì†ŒìŠ¤ë¥¼ ìˆ˜ì •í•˜ëŠ” 방법 * kubectl edit * kubectl patch * kubectl apply * kubectl replace * kubectl set image * p415 * {{{ $ kubectl rollout status deployment kubia }}} * ë°°í¬ í˜„í™© 치트 시트 - [김준ì„] * p417 * {{{ $ kubectl rollout history deployment kubia }}} * ë°°í¬ history 치트 시트 - [김준ì„] * {{{ $ kubectl rollout undo deployment kubia --to-revision=1 }}} * ë°°í¬ undo 치트 시트 - [김준ì„] * p419 * ë¡¤ë§ ì—…ë°ì´íЏ ì†ë„ êµ¬ì„±ì„ ìœ„í•œ ì†ì„± * maxSurge : 디플로ì´ë¨¼íŠ¸ê°€ ì˜ë„하는 ë ˆí”Œë¦¬ì¹´ 수보다 얼마나 ë§Žì€ íŒŒë“œ ì¸ìŠ¤í„´ìŠ¤ 수를 í—ˆìš©í• ìˆ˜ 있는지 ê²°ì •í•œë‹¤.ë°±ë¶„ë¥ or ì ˆëŒ€ê°’ * maxUnavailable : ì—…ë°ì´íЏ ì¤‘ì— ì˜ë„하는 ë ˆí”Œë¦¬ì¹´ 수를 기준으로 ì‚¬ìš©í• ìˆ˜ 없는 파드 ì¸ìŠ¤í„´ìŠ¤ 수를 ê²°ì •. ë°±ë¶„ë¥ or ì ˆëŒ€ê°’. * p422 * {{{ $ kubectl rollout pause deployment kubia }}} * 카나리 릴리스를 효과ì 으로 실행 í• ìˆ˜ 있다. * {{{ $ kubectl rollout resume deployment kubia }}} * p424 * minReadySecondsê°€ 지나기 ì „ì— ìƒˆ 파드가 ì œëŒ€ë¡œ ìž‘ë™í•˜ì§€ ì•Šê³ ë ˆë””ë‹ˆìŠ¤ 프로브가 실패하기 시작하면 새 ë²„ì „ì˜ ë¡¤ì•„ì›ƒì´ íš¨ê³¼ì 으로 차단ëœë‹¤. * maxSurge / maxUnavailable ê·œì¹™ì— ì˜í•´ì„œ - [김준ì„] * ì ì ˆí•˜ê²Œ êµ¬ì„±ëœ ë ˆë“œë‹ˆìŠ¤ 프로브와 ì ì ˆí•œ minReadySeconds ì„¤ì •ìœ¼ë¡œ ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 버그가 있는 ë²„ì „ v3를 ë°°í¬í•˜ì§€ 못하게 í–ˆì„ ê²ƒì´ë‹¤. * p429 * 기본ì 으로 ë¡¤ì•„ì›ƒì´ 10ë¶„ ë™ì•ˆ ì§„í–‰ë˜ì§€ 않으면 실패한 것으로 간주ëœë‹¤. kubectl descirbe deployement ëª…ë ¹ì–´ë¥¼ 사용하면 ì˜ˆì œì™€ ê°™ì´ ProgressDeadlineExceeded ì¡°ê±´ì´ í‘œì‹œëœë‹¤. == 스테ì´íŠ¸í’€ì…‹: ë³µì œëœ ìŠ¤í…Œì´íŠ¸í’€ ì• í”Œë¦¬ì¼€ì´ì…˜ ë°°í¬í•˜ê¸° == === 스테ì´íŠ¸í’€ 파드 ë³µì œí•˜ê¸° === * p434 * ê° ì¸ìŠ¤í„´ìŠ¤ê°€ 별ë„ì˜ ìŠ¤í† ë¦¬ì§€ë¥¼ 필요로 하는 ë¶„ì‚° ë°ì´í„° ì €ìž¥ì†Œë¥¼ ì‹¤í–‰í•˜ë ¤ë©´ ë ˆí”Œë¦¬ì¹´ì…‹ì„ ì‚¬ìš©í• ìˆ˜ 없다. * ì„œë¡ ì´ ê¸¸ë‹¤ - [김준ì„] === 스테ì´íŠ¸í’€ì…‹ ì´í•´í•˜ê¸° === * p438 * 스테ì´íŠ¸í’€ì…‹ì€ ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ ì¸ìŠ¤í„´ìŠ¤ê°€ ê°ê° ì•ˆì •ì ì¸ ì´ë¦„ê³¼ ìƒíƒœë¥¼ 가지며 개별ì 으로 취급ë¼ì•¼ 하는 ì• í”Œë¦¬ì¼€ì´ì…˜ì— 알맞게 만들어졌다. * ê° POD별 ì „ìš© Volume, ì „ìš© 네트워í¬ë¥¼ 가지게 해야하는듯 - [김준ì„] * ì „í˜•ì 으로 ETCD ê°™ì€ Data Store Applicationì´ ë”± ì´ëŸ° ì¼€ì´ìŠ¤ìž…ë‹ˆë‹¤. diskê°€ íŠ¹ì • 갯수 ë§Œí¼ ìžˆê³ , ë”± íŠ¹ì • ì´ë¦„ì˜ podì´ íŠ¹ì • diskì— ì—°ê²°ë˜ì•¼ ë˜ê¸° 때문입니다. - [bluemir] * p439 * ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ 경우 새 ì¸ìŠ¤í„´ìŠ¤ê°€ ì´ì „ ì¸ìŠ¤í„´ìŠ¤ì™€ ì™„ì „ížˆ ê°™ì€ ìƒíƒœì™€ ì•„ì´ë´í‹°í‹°ë¥¼ ê°€ì ¸ì•¼ í•¨ì„ ì˜ë¯¸í•œë‹¤. * RSê³¼ 다른ì - [김준ì„] * p440 * 스테ì´íŠ¸í’€ 파드가 종료ë˜ë©´ 새로운 파드 ì¸ìŠ¤í„´ìŠ¤ëŠ” êµì²´ë˜ëŠ” 파드와 ë™ì¼í•œ ì´ë¦„, ë„¤íŠ¸ì›Œí¬ ì•„ì´ë´í‹°í‹°, ìƒíƒœ 그대로 다른 노드ì—서 ë˜ì‚´ì•„나야 한다. * 스테ì´íŠ¸í’€ì…‹ìœ¼ë¡œ ìƒì„±ëœ 파드는 서수 ì¸ë±ìŠ¤ê°€ í• ë‹¹ë˜ê³ íŒŒë“œì˜ ì´ë¦„ê³¼ 호스트 ì´ë¦„, ì•ˆì •ì ì¸ ìŠ¤í† ë¦¬ì§€ë¥¼ ë¶™ì´ëŠ” ë° ì‚¬ìš©ëœë‹¤. * kubia-0, kubia-1,kubia-2 ... - [김준ì„] * p441 * 스테ì´íŠ¸í’€ì…‹ì€ ê±°ë²„ë‹ í—¤ë“œë¦¬ìŠ¤ 서비스를 ìƒì„±í•´ì„œ ê° íŒŒë“œì—게 ì‹¤ì œ ë„¤íŠ¸ì›Œí¬ ì•„ì´ë´í‹°í‹°ë¥¼ ì œê³µí•´ì•¼ 한다. * SRV 로 kubia.default.svc.cluster.local 를 기본으로 kubia-0.kubia... - [김준ì„] * p442 * 하지만 ë ˆí”Œë¦¬ì¹´ì…‹ê³¼ 달리 êµì²´ëœ 파드는 사ë¼ì§„ 파드와 ë™ì¼í•œ ì´ë¦„ê³¼ 호스트 ì´ë¦„ì„ ê°–ëŠ”ë‹¤. * kubia-0ì´ ì—†ì–´ì§€ë©´ kubia-0ì´ ìƒì„±ë¨ - [김준ì„] * p443 * 스테ì´íЏ í’€ì…‹ì„ ìŠ¤ì¼€ì¼ë§í•˜ë©´ 사용하지 않는 ë‹¤ìŒ ì„œìˆ˜ ì¸ë±ìŠ¤ë¥¼ 갖는 새로운 파드 ì¸ìŠ¤í„´ìŠ¤ë¥¼ ìƒì„±í•œë‹¤. ì¸ìŠ¤í„´ìŠ¤ ë‘ ê°œì—서 세 개로 스케ì¼ì—…하면 새로운 ì¸ìŠ¤í„´ìŠ¤ëŠ” ì¸ë±ìФ 2를 부여받는다. * p445 * 스테ì´íЏ í’€ íŒŒë“œì˜ ìŠ¤í† ë¦¬ì§€ëŠ” ì˜êµ¬ì ì´ì–´ì•¼ í•˜ê³ íŒŒë“œì™€ëŠ” 분리ë¼ì•¼ 한다. * 스테ì´íŠ¸í’€ì…‹ì´ íŒŒë“œë¥¼ ìƒì„±í•˜ëŠ” 것과 ê°™ì€ ë°©ì‹ìœ¼ë¡œ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ ë˜í•œ ìƒì„±í•´ì•¼ 한다. ì´ëŸ° ì´ìœ 로 스테ì´íŠ¸í’€ì…‹ì€ ê° íŒŒë“œì™€ 함께하는 í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ì„ ë³µì œí•˜ëŠ” 하나 ì´ìƒì˜ 볼륨 í´ë ˆìž„ í…œí”Œë¦¿ì„ ê°€ì§ˆ 수 있따. * p446 * 스테ì´íŠ¸í’€ì…‹ì„ í•˜ë‚˜ ìŠ¤ì¼€ì¼ ì—…í•˜ë©´ ë‘ ê°œ ì´ìƒì˜ API 오브ì 트가 ìƒì„±ëœë‹¤. 하지만 ìŠ¤ì¼€ì¼ ë‹¤ìš´ì„ í• ë•Œ 파드만 ì‚ì œí•˜ê³ í´ë ˆìž„ì€ ë‚¨ê²¨ë‘”ë‹¤. * ë°ì´í„°ê°€ ë‚ ì•„ê°€ê¸° 때문ì—. 다시 scale up하면 다시 붙는다 - [김준ì„] * p448 * 스테ì´íЏ í’€ì…‹ì€ êµì²´ 파드를 ìƒì„±í•˜ê¸° ì „ì— íŒŒë“œê°€ ë” ì´ìƒ 실행 중ì´ì§€ 않는다는 ì ì„ ì ˆëŒ€ì 으로 í™•ì‹ í•´ì•¼ 한다는 뜻ì´ë‹¤. * ì•„ì´ë´í‹°ë•Œë¬¸ì— ë³µìž¡í• ë“¯ - [김준ì„] === 스테ì´íŠ¸í’€ì…‹ 사용하기 === * p450 * ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ë°°í¬í•˜ë ¤ë©´ 다른 ìœ í˜•ì˜ ì˜¤ë¸Œì 트 ë‘ ê°€ì§€ë¥¼ ìƒì„±í•´ì•¼ 한다. * ë°ì´í„° 파ì¼ì„ ì €ìž¥í•˜ê¸° 위한 í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ * 스테ì´íŠ¸í’€ì…‹ì— í•„ìš”í•œ ê±°ë²„ë‹ ì„œë¹„ìŠ¤ * 스테ì´íŠ¸í’€ì…‹ ìžì²´ * p425 * clusterIp 필드를 None으로 ì„¤ì •í•˜ë©´ 헤드리스 서비스가 ëœë‹¤. === 스테ì´íŠ¸í’€ì…‹ì˜ í”¼ì–´ 디스커버리 === * p462 * í´ëŸ¬ìŠ¤í„°ëœ ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ 중요한 요구 사í•ì€ í”¼ì–´ 디스커버리ì´ë‹¤. * p463 * SRV ë ˆì½”ë“œëŠ” íŠ¹ì • 서비스를 ì œê³µí•˜ëŠ” ì„œë²„ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ê³¼ í¬íŠ¸ë¥¼ 가리키는 ë° ì‚¬ìš©ëœë‹¤. * DNS? kubedns한테 물어보면ë˜ë‚˜? - [김준ì„] * 네, ì¼ë°˜ì 으로는 kubedns ê°€ ì‘ë‹µí•˜ì£ - [bluemir] === 스테ì´íŠ¸í’€ì…‹ì´ ë…¸ë“œ 실패를 처리하는 ê³¼ì • ì´í•´í•˜ê¸° === * p467 * ì¿ ë²„ë„¤í‹°ìŠ¤ ë²„ì „ 1.7 부터 스테ì´íŠ¸í’€ì…‹ë„ ë””í”Œë¡œì´ë¨¼íŠ¸ë‚˜ ë°ëª¬ì…‹ê³¼ ê°™ì€ ë°©ì‹ìœ¼ë¡œ ë¡¤ë§ ì—…ë°ì´íŠ¸ë¥¼ ì§€ì›í•œë‹¤. * p469 * 스테ì´íŠ¸í’€ì…‹ì€ ë…¸ë“œê°€ 실패한 경우 ë™ì¼í•œ ì•„ì´ë´í‹°í‹°ì™€ ìŠ¤í† ë¦¬ì§€ë¥¼ 가진 ë‘ ê°œì˜ íŒŒë“œê°€ ì ˆëŒ€ 실행ë˜ì§€ 않는 ê²ƒì„ ë³´ìž¥í•˜ë¯€ë¡œ, 스테ì´íŠ¸í’€ì…‹ì€ íŒŒë“œê°€ ë” ì´ìƒ 실행ë˜ì§€ 않는다는 ê²ƒì„ í™•ì‹ í• ë•Œê¹Œì§€ 대체 파드를 ìƒì„±í• 수 없으며, ìƒì„±í•´ì„œë„ 안 ëœë‹¤. * ì˜¤ì§ í´ëŸ¬ìŠ¤í„° 관리ìžê°€ ì•Œë ¤ì¤˜ì•¼ë§Œ 알수 있다. ì´ë¥¼ 위해 관리ìžëŠ” 파드를 ì‚ì œí•˜ê±°ë‚˜ ì „ì²´ 노드를 ì‚ì œí•´ì•¼ 한다. * livenessê°™ì€ê±´ 못쓰나? - [김준ì„] * liveness 는 container 단위ì´ë¯€ë¡œ Pod ì´ ìž¬ì„±ì„± ë˜ê±°ë‚˜ 종료ë˜ëŠ”ë°ëŠ” ê´€ì—¬í• ìˆ˜ 없습니다. - [bluemir] == ì¿ ë²„ë„¤í‹°ìŠ¤ ë‚´ë¶€ ì´í•´ == * p475 * ì‹œìŠ¤í…œì˜ ê¸°ëŠ¥ì„ ìž˜ ì´í•´í• 때까지 ì‹œìŠ¤í…œì˜ ë™ìž‘ ë°©ì‹ì„ ìžì„¸ížˆ 다루는 ê²ƒì´ í•©ë¦¬ì ì´ì§€ 않기 때문ì´ë‹¤ * ê¸°ìˆ ì„œì ì„ ì½ì„ ë• í•„ìš”í•œ 부분으로 건너뛰면서 ì½ëŠ” ë°©ì‹ì´ ë” íš¨ìœ¨ì ì¸ ê²ƒ 같다 - [서지혜] === 아키í…ì³ ì´í•´ === * p476 * 컨트롤 í”Œë ˆì¸ì€ í´ëŸ¬ìŠ¤í„° ê¸°ëŠ¥ì„ ì œì–´í•˜ê³ ì „ì²´ í´ëŸ¬ìŠ¤í„°ê°€ ë™ìž‘하게 만드는 ì—í• ì„ í•œë‹¤. * {{{ etcd ë¶„ì‚° ì €ìž¥ ìŠ¤í† ë¦¬ì§€ API 서버 스케쥴러 컨트롤 ë§¤ë‹ˆì € }}} * 컨테ì´ë„ˆë¥¼ 실행하는 ìž‘ì—…ì€ ê° ì›Œì»¤ 노드ì—서 실행ë˜ëŠ” 구성 요소가 담당한다. * {{{ Kubelet Kube-proxy 컨테ì´ë„ˆ 런타임(Docker, rkt 외 기타) }}} * ì• ë“œì˜¨ 구성 요소 * {{{ ì¿ ë²„ë„¤í‹°ìŠ¤ DNS 서버 대시보드 ì¸ê·¸ë ˆìФ 컨트롤러 힙스터 컨테ì´ë„ˆ ë„¤íŠ¸ì›Œí¬ ì¸í„°íŽ˜ì´ìФ í”ŒëŸ¬ê·¸ì¸ }}} ==== ì¿ ë²„ë„¤í‹°ìŠ¤ 구성 ìš”ì†Œì˜ ë¶„ì‚° 특성 ==== * p477 * 구성 ìš”ì†Œë“¤ì€ ëª¨ë‘ ê°œë³„ 프로세스로 실행ëœë‹¤. * p478 * {{{ $ kubectl get componentstatuses }}} * 치트 밑줄 - [김준ì„] * ì¿ ë²„ë„¤í‹°ìŠ¤ 시스템 구성 요소는 ì˜¤ì§ API ì„œë²„í•˜ê³ ë§Œ í†µì‹ í•œë‹¤. 서로 ì§ì ‘ í†µì‹ í•˜ì§€ 않는다. * ì¶”ìƒí™”ê°€ 잘 ë˜ì–´ìžˆêµ° - [서지혜] * 볼떄마다 놀ëžê¸´ 합니다. - [bluemir] * API 서버는 etcs와 í†µì‹ í•˜ëŠ” ìœ ì¼í•œ 구성 요소ì´ë‹¤. * etcdê°€ ë였ë”ë¼ - [서지혜] * ë¶„ì‚° Key-value Storage입니다. - [bluemir] * ì›Œì»¤ë…¸ë“œì˜ êµ¬ì„± 요소는 ëª¨ë‘ ë™ì¼í•œ 노드ì—서 실행ë˜ì•¼ 하지만 컨트롤 í”Œë ˆì¸ì˜ 구성 요소는 여러 ì„œë²„ì— ê±¸ì³ ì‹¤í–‰ë 수 있다. * p479 * kubeletì€ í•ìƒ ì¼ë°˜ 시스템구성 요소로 실행ë˜ëŠ” ìœ ì¼í•œ 구성 요소ì´ë©°, kubeletì´ ë‹¤ë¥¸ 구성 요소를 파드로 실행한다. ==== ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ etcd를 사용하는 방법 ==== * p480 * ìƒì„±í•œ ëª¨ë“ ì˜¤ë¸Œì 트는 API서버가 다시 시작ë˜ê±°ë‚˜ 실패하ë”ë¼ë„ ìœ ì§€í•˜ê¸° 위해 매니페스트가 ì˜êµ¬ì 으로 ì €ìž¥ë 필요가 있다. ì´ë¥¼ 위해 ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” ë¹ ë¥´ê³ , 분산해서 ì €ìž¥ë˜ë©°, ì¼ê´€ëœ 키-ê°’ ì €ìž¥ì†Œë¥¼ ì œê³µí•˜ëŠ” etcd를 사용한다. ë¶€ì‚°ë¼ ìžˆê¸° ë•Œë¬¸ì— ë‘˜ ì´ìƒì˜ etcd ì¸ìŠ¤í„´ìŠ¤ë¥¼ 실행해 ê³ ê°€ìš©ì„±ê³¼ 우수한 ì„±ëŠ¥ì„ ì œê³µí• ìˆ˜ 있다. * {{{ $ etcdctl ls /registry }}} * 치트 밑줄 - [김준ì„] * p483 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 다른 ëª¨ë“ êµ¬ì„± 요소가 API 서버를 통하ë„ë¡ í•¨ìœ¼ë¡œì¨ ì´ë¥¼ ê°œì„ í–ˆë‹¤. API 서버 한곳ì—서 ë‚™ê´€ì „ ìž ê¸ˆ ë§¤ì»¤ë‹ˆì¦˜ì„ êµ¬í˜„í•´ì„œ í´ëŸ¬ìŠ¤í„°ì˜ ìƒíƒœë¥¼ ì—…ë°ì´íŠ¸í•˜ê¸° 때문ì—, 오류가 ë°œìƒí• ê°€ëŠ¥ì„±ì„ ì¤„ì´ê³ í•ìƒ ì¼ê´€ì„±ì„ 가질 수 있다. * ê³ ê°€ìš©ì„±ì„ ë³´ìž¥í•˜ê¸° 위해서는 ë‘ê°œ ì´ìƒì˜ etcd ì¸ìŠ¤í„´ìŠ¤ë¥¼ 실행하는 ê²ƒì´ ì¼ë°˜ì ì´ë‹¤.여러 etcd ì¸ìŠ¤í„´ìŠ¤ëŠ” ì¼ê´€ì„±ì„ ìœ ì§€í•´ì•¼í•œë‹¤. ì´ëŸ¬í•œ ë¶„ì‚° ì‹œìŠ¤í…œì€ ì‹¤ì œ ìƒíƒœê°€ 무엇ì¸ì§€ í•©ì˜ì— ë„달해야 한다. etcd는 RAFT í•©ì˜ ì•Œê³ ë¦¬ì¦˜ì„ ì‚¬ìš©í•´ ì–´ëŠ ìˆœê°„ì´ë“ ê° ë…¸ë“œ ìƒíƒœê°€ ëŒ€ë‹¤ìˆ˜ì˜ ë…¸ë“œê°€ ë™ì˜í•˜ëŠ” 현재 ìƒíƒœì´ê±°ë‚˜ ì´ì „ì— ë™ì˜ëœ ìƒíƒœ ì¤‘ì— í•˜ë‚˜ìž„ì„ ë³´ìž¥í•œë‹¤. * etcd ì¸ìŠ¤í„´ìŠ¤ë¥¼ ì¼ë°˜ì 으로 홀수로 ë°°í¬í•œë‹¤. ==== API ì„œë²„ì˜ ê¸°ëŠ¥ ==== * p485 * í´ëŸ¬ìŠ¤í„° ìƒíƒœë¥¼ ì¡°íšŒí•˜ê³ ë³€ê²½í•˜ê¸° 위해 RESTful API로 CRUD ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì œê³µí•œë‹¤. ìƒíƒœëŠ” etcd ì•ˆì— ì €ìž¥í•œë‹¤. * 오브ì 트 ìœ íš¨ì„± 검사 ìž‘ì—…ë„ ìˆ˜í–‰í•˜ê¸° ë•Œë¬¸ì— ìž˜ëª» ì„¤ì •ëœ ì˜¤ë¸Œì 트를 ì €ìž¥í• ìˆ˜ 없다. ìœ íš¨ì„± 검사와 함께 낙관ì ìž ê¸ˆë„ ì²˜ë¦¬í•˜ê¸° ë•Œë¬¸ì— ë™ì‹œì— ì—…ë°ì´í„°ê°€ ë°œìƒí•˜ë”ë¼ë„ 다른 í´ë¼ì´ì–¸íŠ¸ì— ì˜í•´ 오브ì íŠ¸ì˜ ë³€ê²½ 사í•ì´ ìž¬ì •ì˜ ë˜ì§€ 않는다. * p486 * ë¨¼ì € API 서버는 ìš”ì²ì„ 보낸 í´ë¼ì´ì–¸íŠ¸ë¥¼ ì¸ì¦í•´ì•¼ 한다. ì´ ìž‘ì—…ì€ API ì„œë²„ì— êµ¬ì„±ëœ í•˜ë‚˜ ì´ìƒì˜ 플러그ì¸ì— ì˜í•´ 수행ëœë‹¤. * API 서버는 ì¸ì¦ í”ŒëŸ¬ê·¸ì¸ ì™¸ì—ë„ í•˜ë‚˜ ì´ìƒì˜ ì¸ê°€ 플러그ì¸ì„ 사용하ë„ë¡ ì„¤ì •ë¼ ìžˆë‹¤. ì´ ìž‘ì—…ì€ ì¸ì¦ëœ 사용ìžê°€ ìš”ì²í•œ ìž‘ì—…ì´ ìš”ì²í•œ 리소스를 대ìƒìœ¼ë¡œ ìˆ˜í–‰í• ìˆ˜ 있는지를 íŒë³„한다. * 리소스를 ìƒì„±, ìˆ˜ì •, ì‚ì œí•˜ë ¤ëŠ” ìš”ì²ì¸ ê²½ìš°ì— í•´ë‹¹ ìš”ì²ì€ 어드미션 컨트롤로 보내진다. * 해당 리소스는 ëª¨ë“ ì–´ë“œë¯¸ì…˜ 컨트롤 플러그ì¸ì„ 통과한다. * https://kubernetes.io/docs/admin/admission-controllers/ì—서 찾아볼 수 있다. * ìš”ì²ì´ ëª¨ë“ ì–´ë“œë¯¸ì…˜ 컨트롤 플러그ì¸ì„ 통과하면, API 서버는 오브ì íŠ¸ì˜ ìœ íš¨ì„±ì„ ê²€ì¦í•˜ê³ etcdì— ì €ìž¥í•œë‹¤. ê·¸ë¦¬ê³ í´ë¼ì´ì–¸íŠ¸ì— ì‘ë‹µì„ ë°˜í™˜í•œë‹¤. ==== API 서버가 리소스 ë³€ê²½ì„ í´ë¼ì´ì–¸íŠ¸ì— í†µë³´í•˜ëŠ” 방법 ì´í•´ ==== * p487 * API서버는 ì´ëŸ° ì»¤íŠ¸ë¡¤ëŸ¬ì— ë¬´ì—‡ì„ í•´ì•¼ 하는지 ì•Œë ¤ì£¼ì§€ 않는다. 단지 컨트롤러와 다른 구성 요소가 ë°°í¬ëœ ë¦¬ì†ŒìŠ¤ì˜ ë³€ê²½ 사í•ì„ ê´€ì°°í• ìˆ˜ 있ë„ë¡ í•˜ë©´ ëœë‹¤. * í´ë¼ì´ì–¸íŠ¸ëŠ” API ì„œë²„ì— http ì—°ê²°ì„ ë§ºê³ ë³€ê²½ 사í•ì„ ê°ì§€í•œë‹¤. ì´ ì—°ê²°ì„ í†µí•´ í´ë¼ì´ì–¸íЏ ê°ì‹œ ëŒ€ìƒ ì˜¤ë¸Œì íŠ¸ì˜ ë³€ê²½ì„ ì•Œ 수 있는 ìŠ¤íŠ¸ë¦¼ì„ ë°›ëŠ”ë‹¤. 오브ì 트가 ê°±ì‹ ë 때마다, 서버는 오브ì 트를 ê°ì‹œí•˜ê³ 있는 ì—°ê²°ëœ ëª¨ë“ í´ë¼ì´ì–¸íЏì—게 오브ì íŠ¸ì˜ ìƒˆë¡œìš´ ë²„ì „ì„ ë³´ë‚¸ë‹¤. ==== 스케줄러 ì´í•´ ==== * p489 * 스케줄러는 ì„ íƒëœ ë…¸ë“œì— íŒŒë“œë¥¼ 실행하ë„ë¡ ì§€ì‹œí•˜ì§€ 않는다. 단지 스케줄러는 API 서버로 파드 ì •ì˜ë¥¼ ê°±ì‹ í•œë‹¤. API 서버는 kubeletì— íŒŒë“œê°€ 스케줄ë§ëœ ê²ƒì„ í†µë³´í•œë‹¤.ëŒ€ìƒ ë…¸ë“œì˜ kubeletì€ íŒŒë“œê°€ 해당 ë…¸ë“œì— ìŠ¤ì¼€ì¤„ë§ëœ ê²ƒì„ í™•ì¸í•˜ìžë§ˆìž íŒŒë“œì˜ ì»¨í…Œì´ë„ˆë¥¼ ìƒì„±í•˜ê³ 실행한다. * p490 * ë…¸ë“œì˜ ì„ íƒì€ 그림 11.5ì—서 보는 것처럼 ë‘ ë¶€ë¶„ìœ¼ë¡œ 나눌 수 있다. * ëª¨ë“ ë…¸ë“œ 중ì—서 파드를 스케줄ë§í• 수 있는 노드 목ë¡ì„ í•„í„°ë§í•œë‹¤. * 수용 가능한 ë…¸ë“œì˜ ìš°ì„ ìˆœìœ„ë¥¼ ì •í•˜ê³ ì 수가 ë†’ì€ ë…¸ë“œë¥¼ ì„ íƒí•œë‹¤. 만약 여러노드가 ê°™ì€ ìµœìƒìœ„ ì 수를 ê°€ì§€ê³ ìžˆë‹¤ë©´, 파드가 ëª¨ë“ ë…¸ë“œì— ê³ ë¥´ê²Œ ë°°í¬ë˜ë„ë¡ ë¼ìš´ë“œ-ë¡œë¹ˆì„ ì‚¬ìš©í•œë‹¤. * 스케줄러는 미리 ì„¤ì •ëœ ì¡°ê±´ 함수 목ë¡ì— ê° ë…¸ë“œë¥¼ ì „ë‹¬í•œë‹¤. ì´ë“¤ 함수는 다ìŒê³¼ ê°™ì€ ë‹¤ì–‘í•œ ì¡°ê±´ì„ í™•ì¸í•œë‹¤. * 노드가 하드웨어 ë¦¬ì†ŒìŠ¤ì— ëŒ€í•œ 파드 ìš”ì²ì„ 충족시킬 수 있는가? * ë…¸ë“œì— ë¦¬ì†ŒìŠ¤ê°€ 부족한가 * 노드가 파드 ì •ì˜ ì•ˆì— ìžˆëŠ” 노드 ì…€ë ‰í„°ì™€ ì¼ì¹˜í•˜ëŠ” ë ˆì´ë¸”ì„ ê°€ì§€ê³ ìžˆëŠ”ê°€? * 파드가 íŠ¹ì • 호스트 í¬íŠ¸ì— í• ë‹¹ë˜ë„ë¡ ìš”ì²í•œ 경우 해당 í¬íŠ¸ê°€ ì´ ë…¸ë“œì—서 ì´ë¯¸ 사용 중ì¸ê°€? * 파드 ìš”ì²ì´ íŠ¹ì •í•œ ìœ í˜•ì˜ ë³¼ë¥¨ì„ ìš”ì²í•˜ëŠ” 경우 ì´ ë…¸ë“œì—서 해당 ë³¼ë¥¨ì„ íŒŒë“œì— ë§ˆìš´íŠ¸ í• ìˆ˜ 있는가. 아니면 ì´ ë…¸ë“œì— ìžˆëŠ” 다른 파드가 ì´ë¯¸ ê°™ì€ ë³¼ë¥¨ì„ ì‚¬ìš©í•˜ê³ ìžˆëŠ”ê°€? * 파드가 ë…¸ë“œì˜ í…Œì¸íŠ¸ë¥¼ 허용하는가? * 파드가 노드와 íŒŒë“œì˜ ì–´í”¼ë‹ˆí‹°, 안티-어피니티 ê·œì¹™ì„ ì§€ì •í–ˆëŠ”ê°€? ë§Œì•½ì— ê·¸ë ‡ë‹¤ë©´ ì´ ë…¸ë“œì— íŒŒë“œë¥¼ 스케줄ë§í•˜ë©´ ì´ëŸ° ê·œì¹™ì„ ì–´ê¸°ê²Œ ë˜ëŠ”ê°€? * p492 * í´ëŸ¬ìŠ¤í„°ì—서 스케줄러를 하나만 실행하는 ëŒ€ì‹ ì—¬ëŸ¬ ê°œì˜ ìŠ¤ì¼€ì¤„ëŸ¬ë¥¼ ì‹¤í–‰í• ìˆ˜ 있다. 그런 다ìŒì— 파드 ì •ì˜ ì•ˆì— schedulerName ì†ì„±ì— 파드를 스케줄ë§í• 때 ì‚¬ìš©í• ìŠ¤ì¼€ì¤„ëŸ¬ë¥¼ ì§€ì •í•œë‹¤. ==== 컨트롤러 ë§¤ë‹ˆì €ì—서 실행ë˜ëŠ” 컨트롤러 소개 ==== * p493 * API 서버로 ë°°í¬ëœ ë¦¬ì†ŒìŠ¤ì— ì§€ì •ëœ ëŒ€ë¡œ ì‹œìŠ¤í…œì„ ì›í•˜ëŠ” ìƒíƒœë¡œ ìˆ˜ë ´ë˜ë„ë¡ í•˜ëŠ” 다른 활성 구성 요소가 필요하다. ì´ëŠ” 컨트롤러 매니지 안ì—서 실행ë˜ëŠ” ì»¨íŠ¸ë¡¤ëŸ¬ì— ì˜í•´ 수행ëœë‹¤. * ì»¨íŠ¸ë¡¤ëŸ¬ì˜ ëª©ë¡ì€ 다ìŒê³¼ 같다. * ë ˆí”Œë¦¬ì¼€ì´ì…˜ ë§¤ë‹ˆì € * ë ˆí”Œë¦¬ì¹´ì…‹, ë°ëª¬ì…‹, ìž¡ 컨트롤러 * 디플로ì´ë¨¼íЏ 컨트롤러 * 스테ì´íŠ¸í’€ì…‹ 컨트롤러 * 노드 컨트롤러 * 서비스 컨트롤러 * 엔드í¬ì¸íЏ 컨트롤러 * 네임스페ì´ìФ 컨트롤러 * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨ 컨트롤러 * ê·¸ ë°–ì˜ ì»¨íŠ¸ë¡¤ëŸ¬ * p494 * 컨트롤러는 다양한 ìž‘ì—…ì„ ìˆ˜í–‰í•˜ì§€ë§Œ ëª¨ë‘ API 서버ì—서 리소스가 변경ë˜ëŠ” ê²ƒì„ ê°ì‹œí•˜ê³ ê° ë³€ê²½ ìž‘ì—…ì„ ìˆ˜í–‰í•œë‹¤. ==== Kubeletì´ í•˜ëŠ” ì¼ ==== * p499 * Kubeletì€ ì›Œì»¤ 노드ì—서 실행하는 ëª¨ë“ ê²ƒì„ ë‹´ë‹¹í•˜ëŠ” 구성 요소다. 첫번째 ìž‘ì—…ì€ Kubeletì´ ì‹¤í–‰ì¤‘ì¸ ë…¸ë“œë¥¼ 노드 리소스로 만들어서 API ì„œë²„ì— ë“±ë¡í•˜ëŠ” 것ì´ë‹¤. 그런 ë‹¤ìŒ API 서버를 ì§€ì†ì 으로 모니터ë§í•´ 해당 ë…¸ë“œì— íŒŒë“œê°€ ìŠ¤ì¼€ì¤„ë§ ë˜ë©´, íŒŒë“œì˜ ì»¨í…Œì´ë„ˆë¥¼ 시작한다.그런 ë‹¤ìŒ ì‹¤í–‰ ì¤‘ì¸ ì»¨í…Œì´ë„ˆë¥¼ ê³„ì† ëª¨ë‹ˆí„°ë§í•˜ë©´ì„œ ìƒíƒœ, ì´ë²¤íЏ, 리소스 ì‚¬ìš©ëŸ‰ì„ API ì„œë²„ì— ë³´ê³ í•œë‹¤. * Kubeletì€ ì»¨í…Œì´ë„ˆ ë¼ì´ë¸Œë‹ˆìФ 프로브를 실행하는 구성 요소ì´ê¸°ë„ 하며, 프로브가 ì‹¤íŒ¨í• ê²½ìš° 컨테ì´ë„ˆë¥¼ 다시 시작한다. 마지막으로 API 서버ì—서 파드가 ì‚ì œë˜ë©´ 컨테ì´ë„ˆë¥¼ ì •ì§€í•˜ê³ íŒŒë“œê°€ ì¢…ë£Œëœ ê²ƒì„ ì„œë²„ì— í†µë³´í•œë‹¤. ==== ì¿ ë²„ë„¤í‹°ìŠ¤ 서비스 프ë¡ì‹œì˜ ì—í• ==== * p501 * kube-proxy는 ì„œë¹„ìŠ¤ì˜ IP와 í¬ì¸íŠ¸ë¡œ 들어온 ì ‘ì†ì„ 서비스를 ì§€ì›í•˜ëŠ” 파드 중 하나와 연결시켜준다. 서비스가 둘 ì´ìƒì˜ 파드ì—서 ì§€ì›ë˜ëŠ” 경우 프ë¡ì‹œëŠ” 파드 ê°„ì— ë¡œë“œ ë°¸ëŸ°ì‹±ì„ ìˆ˜í–‰í•œë‹¤. ==== ì¿ ë²„ë„¤í‹°ìŠ¤ ì• ë“œì˜¨ 소개 ==== * p502 * ì¿ ë²„ë„¤í‹°ìŠ¤ ì„œë¹„ìŠ¤ì˜ DNS 조회, 여러 HTTP 서비스를 ë‹¨ì¼ ì™¸ë¶€ IP 주소로 노출하는 기능, ì¿ ë²„ë„¤í‹°ìŠ¤ 웹 대시보드와 ê°™ì€ ê²ƒë“¤ì´ ìžˆë‹¤. ==== ëª¨ë“ ê²ƒì„ í•¨ê»˜ ê°€ì ¸ì˜¤ê¸° ==== === 컨트롤러가 협업하는 방법 === * p505 * ì „ì²´ 프로세스를 시작하기 ì „ì—ë„ ì»¨íŠ¸ë¡¤ëŸ¬ì™€ 스케줄러 ê·¸ë¦¬ê³ kubeletì€ API 서버ì—서 ê° ë¦¬ì†ŒìŠ¤ ìœ í˜•ì´ ë³€ê²½ë˜ëŠ” ê²ƒì„ ê°ì‹œí•œë‹¤. * p506 * ì´ë²¤íЏ ì²´ì¸ 1. 디플로ì´ë¨¼íЏ 리소스 ìƒì„± 1. ê°ì‹œë¥¼ 통한 통보 1. ë ˆí”Œë¦¬ì¹´ì…‹ ìƒì„± 1. 통보 1. 파드 ìƒì„± 1. ê°ì‹œë¥¼ 통한 통보 1. 파드를 ë…¸ë“œì— í• ë‹¹ 1. ê°ì‹œë¥¼ 통한 통보 1. ë„ì»¤ì— ì»¨í…Œì´ë„ˆ 실행 ìš”ì² 1. 컨테ì´ë„ˆ 실행 * p509 * {{{ $ kubectl get events --watch }}} === 실행 ì¤‘ì¸ íŒŒë“œì— ê´€í•œ ì´í•´ === * p511 * ì´ í¼ì¦ˆ 컨테ì´ë„ˆëŠ” íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆë¥¼ 함께 ë‹´ê³ ìžˆëŠ” 컨테ì´ë„ˆë‹¤. íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆê°€ ë™ì¼í•œ 네트워í¬ì™€ 리눅스 네임스페ì´ìŠ¤ë¥¼ ê³µìœ í•˜ëŠ” ë°©ë²•ì„ ê¸°ì–µí•˜ëŠ”ê°€? í¼ì¦ˆ 컨테ì´ë„ˆëŠ” ì´ëŸ¬í•œ 네임스페ì´ìŠ¤ë¥¼ ëª¨ë‘ ë³´ìœ í•˜ëŠ” 게 ìœ ì¼í•œ 목ì ì¸ ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ 컨테ì´ë„ˆë‹¤. íŒŒë“œì˜ ë‹¤ë¥¸ ì‚¬ìš©ìž ì •ì˜ ì»¨í…Œì´ë„ˆëŠ” 파드 ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ 컨테ì´ë„ˆì˜ 네임스페ì´ìŠ¤ë¥¼ 사용한다. * ë§Œì•½ì— ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ 컨테ì´ë„ˆê°€ ê·¸ ì¤‘ê°„ì— ì¢…ë£Œë˜ë©´, kubeletì´ ì¸í”„ë¼ìŠ¤íŠ¸ëŸì²˜ì™€ íŒŒë“œì˜ ëª¨ë“ ì»¨í…Œì´ë„ˆë¥¼ 다시 ìƒì„±í•œë‹¤. === 파드 ê°„ 네트워킹 === * p512 * 네트워í¬ëŠ” ì¿ ë²„ë„¤í‹°ìŠ¤ ìžã…”ê°€ 아닌, 시스템 ê´€ë¦¬ìž ë˜ëŠ” 컨테ì´ë„ˆ ë„¤íŠ¸ì›Œí¬ ì¸í„°íŽ˜ì´ìФ 플러그ì¸ì— ì˜í•´ ì œê³µëœë‹¤. * 파드 사ì´ì— NATê°€ 없으면 ë‚´ë¶€ì—서 실행 ì¤‘ì¸ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 다른 íŒŒë“œì— ìžë™ìœ¼ë¡œ 등ë¡ë˜ë„ë¡ í• ìˆ˜ 있따. * 파드가 ì¸í„°ë„·ì— 있는 서비스와 í†µì‹ í• ë•ŒëŠ” íŒ¨í‚·ì˜ ì¶œë°œì§€ IP를 변경하는 ê²ƒì´ í•„ìš”í•˜ë‹¤. íŒŒë“œì˜ IP는 사설ì´ê¸° 때문ì´ë‹¤. 외부로 나가는 íŒ¨í‚·ì˜ ì¶œë°œì§€ IP는 호스트 워커 ë…¸ë“œì˜ IP로 변경ëœë‹¤. * p514 * ë…¸ë“œì˜ íŒŒë“œëŠ” ê°€ìƒ ì´ë”ë„· ì¸í„°íŽ˜ì´ìФ ìŒì„ 통해 ê°™ì€ ë¸Œë¦¬ì§€ë¡œ ì—°ê²°ëœë‹¤. * p516 * SDNì„ ì´ìš©í•˜ë©´ 하부 ë„¤íŠ¸ì›Œí¬ í† í´ë¡œì§€ê°€ 아무리 복잡해지ë”ë¼ë„ ë…¸ë“œë“¤ì´ ê°™ì€ ë„¤íŠ¸ì›Œí¬ì— ì—°ê²°ëœ ê²ƒìœ¼ë¡œ ë³¼ 수 있다. 파드ì—서 ì „ì†¡í•œ íŒ¨í‚·ì€ ìº¡ìŠí™” ë¼ ë„¤íŠ¸ì›Œí¬ë¡œ 다른 파드가 실행 ì¤‘ì¸ ë…¸ë“œë¡œ ì „ë‹¬ë˜ê³ , 디캡ìŠí™” 단계를 ê±°ì³ ì›ëž˜ 패킷 형태로 ëŒ€ìƒ íŒŒë“œì— ì „ë‹¬ëœë‹¤. === 서비스 구현 ë°©ì‹ === * p518 * ì„±ëŠ¥ì´ ë” ìš°ìˆ˜í•œ iptables 프ë¡ì‹œ 모드가 ì´ë¥¼ 대체했다. * API 서버ì—서 서비스를 ìƒì„±í•˜ë©´, ê°€ìƒ IP 주소가 바로 í• ë‹¹ëœë‹¤. * ì„œë¹„ìŠ¤ì˜ IP/í¬íЏ ìŒìœ¼ë¡œ 향하는 íŒ¨í‚·ì„ ê°€ë¡œì±„ì„œ, 목ì ì§€ 주소를 변경해 íŒ¨í‚·ì´ ì„œë¹„ìŠ¤ë¥¼ ì§€ì›í•˜ëŠ” 여러 파드 중 하나로 ë¦¬ë””ë ‰ì…˜ë˜ë„ë¡ í•˜ëŠ” 몇 ê°œì˜ iptables ê·œì¹™ì„ ì„¤ì •í•¨ìœ¼ë¡œì¨ ì´ë¤„진다. === ê³ ê°€ìš©ì„± í´ëŸ¬ìŠ¤í„° 실행 === * p520 * ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ ê°€ìš©ì„±ì„ ë†’ì´ë ¤ë©´ 디플로ì´ë¨¼íЏ 리소스로 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ ì‹¤í–‰í•˜ê³ ì ì ˆí•œ ìˆ˜ì˜ ë ˆí”Œë¦¬ì¹´ë¥¼ ì„¤ì •í•˜ê¸°ë§Œ 하면 ë˜ë©°, 나머지는 ì¿ ë²„ë„¤í‹°ìŠ¤ê°€ 처리한다. * ê°€ë™ ì¤‘ë‹¨ ì‹œê°„ì„ ì¤‘ë¦¬ê¸° 위해서는 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 수í‰ìœ¼ë¡œ í™•ìž¥í• ìˆ˜ 있어야 하지만 ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 그런 ê²½ìš°ì— ì†í•˜ì§€ 않ë”ë¼ë„ ë ˆí´ë¦¬ì¹´ 수가 1로 ì§€ì •ëœ ë””í”Œë¡œì´ë¨¼íŠ¸ë¥¼ 사용해야 한다. * 활성 ë³µì œë³¸ê³¼ 함께 비활성 ë³µì œë³¸ì„ ì‹¤í–‰í•´ë‘ê³ ë¹ ë¥¸ 임대 í˜¹ì€ ë¦¬ë” ì„ ì¶œ ë§¤ì»¤ë‹ˆì¦˜ì„ ì´ìš©í•´ 단 하나만 활성화 ìƒíƒœë¡œ 만들어야 한다. * p522 * ì¿ ë²„ë„¤í‹°ìŠ¤ ê°€ìš©ì„±ì„ ë†’ì´ê¸° 위해서는 ë‹¤ìŒ êµ¬ì„± ìš”ì†Œì˜ ì—¬ëŸ¬ ì¸ìŠ¤í„´ìŠ¤ë¥¼ 여러 마스터 노드ì—서 실행해야 한다. * etcd * API 서버 * 컨트롤러 ë§¤ë‹ˆì € * 스케줄러 * p523 * 노드 한 대 ì´ìƒìœ¼ë¡œ ë‚´ê²°í•¨ì„±ì„ ë†’ì´ë ¤ë©´ 5대 í˜¹ì€ 7대로 êµ¬ì„±ëœ etcd 노드가 필요하다. * 여러 APi 서버 ì¸ìŠ¤í„´ìŠ¤ 실행 * API ì„œë²„ì˜ ê°€ìš©ì„±ì„ ë†’ì´ëŠ” ì¼ì€ 훨씬 간단하다. API 서버는 ìƒíƒœë¥¼ ì €ìž¥í•˜ì§€ ì•Šê¸°ë•Œë¬¸ì— í•„ìš”í•œ ë§Œí¼ ë§Žì€ API 서버를 ì‹¤í–‰í• ìˆ˜ ìžˆê³ ì„œë¡œ ì¸ì§€í• í•„ìš”ë„ ì—†ë‹¤. == ì¿ ë²„ë„¤í‹°ìŠ¤ API 서버 보안 == * p527 * 서비스어카운트가 무엇ì¸ì§€ ì•Œì•„ë³´ê³ ì„œë¹„ìŠ¤ì–´ì¹´ìš´íŠ¸ë¿ë§Œ ì•„ë‹ˆë¼ í´ëŸ¬ìŠ¤í„°ë¥¼ 사용하는 다른 ì£¼ì²´ì— ê¶Œí•œì„ ì„¤ì •í•˜ëŠ” ë°©ë²•ì„ í•™ìŠµí•œë‹¤. === ì¸ì¦ ì´í•´ === * p528 * API 서브를 하나 ì´ìƒì˜ ì¸ì¦ 플러그ì¸ìœ¼ë¡œ êµ¬ì„±í• ìˆ˜ ìžˆë‹¤ê³ í–ˆë‹¤. * ì¸ì¦ 플러그ì¸ì€ ë‹¤ìŒ ë°©ë²•ì„ ì‚¬ìš©í•´ í´ë¼ì´ì–¸íŠ¸ì˜ ì•„ì´ë´í‹°í‹°ë¥¼ 얻는다 * í´ë¼ì´ì–¸íŠ¸ì˜ ì¸ì¦ì„œ * HTTP í—¤ë”로 ì „ë‹¬ëœ ì¸ì¦ í† í° * 기본 HTTP ì¸ì¦ * 기타 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” API ì„œë²„ì— ì ‘ì†í•˜ëŠ” ë‘ ì¢…ë¥˜ì˜ í´ë¼ì´ì–¸íŠ¸ë¥¼ 구분한다. * ì‹¤ì œ 사람(사용ìž) * 파드 * 사용ìžëŠ” 싱글 ì‚¬ì¸ ì˜¨ê³¼ ê°™ì€ ì™¸ë¶€ ì‹œìŠ¤í…œì— ì˜í•´ 관리ë¼ì•¼ 하지만 파드는 서비스 어카운트ë¼ëŠ” ë§¤ì»¤ë‹ˆì¦˜ì„ ì‚¬ìš©í•˜ë©°, í´ëŸ¬ìŠ¤í„°ì— ì„œë¹„ìŠ¤ì–´ì¹´ìš´íŠ¸ 리소스로 ìƒì„±ë˜ê³ ì €ìž¥ëœë‹¤. ì´ì™€ëŠ” 대조ì 으로 ì‚¬ìš©ìž ê³„ì •ì„ ë‚˜íƒ€ë‚´ëŠ” ìžì›ì€ 없으며, ì´ëŠ” API 서버를 통해 사용ìžë¥¼ ìƒì„±, ì—…ë°ì´íЏ ë˜ëŠ” ì‚ì œí• ìˆ˜ 없다는 뜻ì´ë‹¤. * ì¸ì¦ 플러그ì¸ì€ ì‚¬ìš©ìž ì´ë¦„ ë° ì‚¬ìš©ìž ID와 함께 ê·¸ë£¹ì„ ë°˜í™˜í•œë‹¤ê³ ë§í–ˆë‹¤. ê·¸ë£¹ì€ ê°œë³„ 사용ìžì—게 ê¶Œí•œì„ ë¶€ì—¬í•˜ì§€ ì•Šê³ í•œ ë²ˆì— ì—¬ëŸ¬ 사용ìžì—게 ê¶Œí•œì„ ë¶€ì—¬í•˜ëŠ” ë° ì‚¬ìš©ëœë‹¤. * p530 * {{{ $ kubectl get sa }}} * ê° íŒŒë“œëŠ” íŒŒë“œì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ì— ìžˆëŠ” í•˜ë‚˜ì˜ ì„œë¹„ìŠ¤ì–´ì¹´ìš´íŠ¸ì™€ 연계ëœë‹¤. * p531 * 사용 가능한 ì¸ê°€ í”ŒëŸ¬ê·¸ì¸ ì¤‘ 하는 ì—í• ê¸°ë°˜ 액세스 ì œì–´ 플러그ì¸ì´ë‹¤. * p532 * ë¦¬ì†ŒìŠ¤ì˜ ë©”íƒ€ë°ì´í„°ë¥¼ 검색해야 하는 파드는 해당 오브ì íŠ¸ì˜ ë©”íƒ€ë°ì´í„°ë§Œ ì½ì–´ì•¼ 한다. ë¦¬ì†ŒìŠ¤ì˜ ë©”íƒ€ë°ì´í„°ë¥¼ 검색해야 하는 파드는 해당 오브ì íŠ¸ì˜ ë©”íƒ€ë°ì´í„°ë§Œ ì½ì„ 수 있는 서비스어카운트로 실행해야 하며, 오브ì 트를 ìˆ˜ì •í•´ì•¼ 하는 파드는 API 오브ì 트를 ìˆ˜ì •í• ìˆ˜ 있는 ê³ ìœ í•œ 서비스 어카운트로 실행해야 한다. * p532 * {{{ $ kubectl create serviceaccount foo }}} * p534 * 서비스어카운트는 ì´ë¯¸ì§€ í’€ 시í¬ë¦¿ 목ë¡ë„ í¬í•¨ í• ìˆ˜ 있다. {{{ imagepullSecrets: - name: my-dockerhub-secret }}} * p535 * {{{ spec : serviceAccountName: foo }}} === ì—í• ê¸°ë°˜ 액세스 ì œì–´ë¡œ í´ëŸ¬ìŠ¤í„° 보안 === * p537 * RBACì€ ê¶Œí•œì´ ì—†ëŠ” 사용ìžê°€ í´ëŸ¬ìŠ¤í„° ìƒíƒœë¥¼ 보거나 ìˆ˜ì •í•˜ì§€ 못하게 한다. * p538 * ì¿ ë²„ë„¤í‹°ìŠ¤ ì•¡ì…˜ì— ê´€í•œ 몇가지 예가 있다. * 파드 ê°€ì ¸ì˜¤ê¸° * 서비스 ìƒì„±í•˜ê¸° * 시í¬ë¦¿ ì—…ë°ì´íЏ * 기타 등등 * p539 * RBAC ì¸ê°€ 플러그ì¸ì€ 사용ìžê°€ ì•¡ì…˜ì„ ìˆ˜í–‰í• ìˆ˜ 있는지 여부를 ê²°ì •í•˜ëŠ” 핵심 요소로 ì‚¬ìš©ìž ë¡¤ì„ ì‚¬ìš©í•œë‹¤. 주체는 하나 ì´ìƒì˜ 롤과 ì—°ê³„ë¼ ìžˆìœ¼ë©° ê° ë¡¤ì€ íŠ¹ì • ë¦¬ì†ŒìŠ¤ì— íŠ¹ì • ë™ì‚¬ë¥¼ ìˆ˜í–‰í• ìˆ˜ 있다. * RBAC ì¸ê°€ ê·œì¹™ì€ ë„¤ ê°œì˜ ë¦¬ì†ŒìŠ¤ë¡œ 구성ë˜ë©° ë‘ ê°œì˜ ê·¸ë£¹ìœ¼ë¡œ ë¶„ë¥˜í• ìˆ˜ 있다. * 롤과 í´ëŸ¬ìŠ¤í„°ë¡¤ : ë¦¬ì†ŒìŠ¤ì— ìˆ˜í–‰í• ìˆ˜ 있는 ë™ì‚¬ë¥¼ ì§€ì •í•œë‹¤. * 롤바ì¸ë”©ê³¼ í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”© : ìœ„ì˜ ë¡¤ì„ íŠ¹ì • 사용ìž, 그룹, ë˜ëŠ” ì„œë¹„ìŠ¤ì–´ì¹´ìš´íŠ¸ì— ë°”ì¸ë”©í•œë‹¤. * ë¡¤ì€ ìˆ˜í–‰í• ìˆ˜ 있는 ìž‘ì—…ì„ ì •ì˜í•˜ê³ , ë°”ì¸ë”©ì€ 누가 ì´ë¥¼ ìˆ˜í–‰í• ìˆ˜ 있는지를 ì •ì˜í•œë‹¤. * p540 * 롤과 í´ëŸ¬ìŠ¤í„°ë¡¤ ë˜ëŠ” 롤바ì¸ë”©ê³¼ í´ëŸ¬ìŠ¤í„°ë¡¤ ë°”ì¸ë”©ì˜ ì°¨ì´ì ì„ ë¡¤ê³¼ 롤바ì¸ë”©ì€ 네임스페ì´ìŠ¤ê°€ ì§€ì •ëœ ë¦¬ì†ŒìŠ¤ì´ê³ í´ëŸ¬ìŠ¤í„°ë¡¤ê³¼ í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”©ì€ 네임스페ì´ìŠ¤ë¥¼ ì§€ì •í•˜ì§€ 않는 í´ëŸ¬ìŠ¤í„° ìˆ˜ì¤€ì˜ ë¦¬ì†ŒìŠ¤ë¼ëŠ” 것ì´ë‹¤. * p552 * í´ëŸ¬ìŠ¤í„° 수준 리소스ì—는 ë™ì¼í•œ ë°©ì‹ì„ ì‚¬ìš©í• ìˆ˜ 없다. í´ëŸ¬ìŠ¤í„° 수준 ë¦¬ì†ŒìŠ¤ì— ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ë¶€ì—¬í•˜ë ¤ë©´ í•ìƒ í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”©ì„ 사용해야 한다. * p561 * íŠ¹ì • 롤과 ë°”ì¸ë”©ì˜ ì¡°í•©ì„ ì‚¬ìš©í•´ì•¼ 하는 경우 * í´ëŸ¬ìŠ¤í„° 수준 리소스 = í´ëŸ¬ìŠ¤í„°ë¡¤ + í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”© * 리소스가 아닌 URL = í´ëŸ¬ìŠ¤í„°ë¡¤ + í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”© * ëª¨ë“ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë¡œ ì§€ì •ëœ ë¦¬ì†ŒìŠ¤ = í´ëŸ¬ìŠ¤í„°ë¡¤ + í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”© * íŠ¹ì • 네임스페ì´ìŠ¤ì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë¡œ ì§€ì •ëœ ë¦¬ì†ŒìŠ¤ = í´ëŸ¬ìŠ¤í„°ë¡¤ + 롤바ì¸ë”© * íŠ¹ì • 네임스페ì´ìŠ¤ì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë¡œ ì§€ì •ëœ ë¦¬ì†ŒìŠ¤ = 롤 + 롤바ì¸ë”© * p562 * ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” API 서버가 시작ë 때마다 ì—…ë°ì´íЏë˜ëŠ” í´ëŸ¬ìŠ¤í„°ë¡¤ê³¼ í´ëŸ¬ìŠ¤í„°ë¡¤ë°”ì¸ë”©ì˜ ë””í´íЏ 세트를 ì œê³µí•œë‹¤. == í´ëŸ¬ìŠ¤í„° 노드와 ë„¤íŠ¸ì›Œí¬ ë³´ì•ˆ == === 파드ì—서 호스트 ë…¸ë“œì˜ ë„¤ìž„ìŠ¤íŽ˜ì´ìФ 사용 === * p568 * ê° íŒŒë“œëŠ” ê³ ìœ í•œ PID 네임스페ì´ìŠ¤ê°€ 있기 ë•Œë¬¸ì— ê³ ìœ í•œ 프로세스 트리가 있으며 ê³ ìœ í•œ IPC 네임스페ì´ìŠ¤ë„ ì‚¬ìš©í•˜ë¯€ë¡œ ë™ì¼í•œ íŒŒë“œì˜ í”„ë¡œì„¸ìŠ¤ ê°„ í†µì‹ ë©”ì»¤ë‹ˆì¦˜ 으로 서로 í†µì‹ í• ìˆ˜ 있다. * íŠ¹ì • 파드는 í˜¸ìŠ¤íŠ¸ì˜ ê¸°ë³¸ 네임스페ì´ìФì—서 ìž‘ë™í•´ì•¼ ë…¸ë“œì˜ ë¦¬ì†ŒìŠ¤ì™€ 장치를 ì½ê³ ì¡°ìž‘í• ìˆ˜ 있다. 예를 들어 파드는 ê°€ìƒ ë„¤íŠ¸ì›Œí¬ ì–´ëŒ‘í„° ëŒ€ì‹ ë…¸ë“œì˜ ì‹¤ì œ ë„¤íŠ¸ì›Œí¬ ì–´ëŒ‘í„°ë¥¼ 사용해야 í• ìˆ˜ë„ ìžˆë‹¤. ì´ëŠ” 파드 스펙ì—서 hostNetwork ì†ì„±ì„ true로 ì„¤ì •í•˜ë©´ ëœë‹¤. * ì´ëŠ” 파드 ìžì²´ê°€ IP 주소를 ê°–ëŠ”ê²ƒì´ ì•„ë‹ˆë¼, í¬íŠ¸ë¥¼ ë°”ì¸ë“œí•˜ëŠ” 프로세스를 ì‹¤í–‰í• ê²½ìš° 해당 프로세스는 ë…¸ë“œì˜ í¬íŠ¸ì— ì§ì ‘ ë°”ì¸ë“œëœë‹¤ëŠ” ì˜ë¯¸ë‹¤. * {{{ spec: hostNetwork: true }}} * p570 * 파드는 hostNetwork 옵션으로 ë…¸ë“œì˜ ê¸°ë³¸ 네임스페ì´ìŠ¤ì˜ í¬íŠ¸ì— ë°”ì¸ë”©í• 수 있지만 ì—¬ì „ížˆ ê³ ìœ í•œ ë„¤íŠ¸ì›Œí¬ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë¥¼ 갖는다. ì´ëŠ” 컨테ì´ë„ˆì˜ í¬íŠ¸ë¥¼ ì •ì˜í•˜ëŠ” sepc.containers.ports 필드 ì•ˆì— hostPort ì†ì„±ì„ 사용해 í• ìˆ˜ 있다. * hostPort는 Nodeport로 ë…¸ì¶œëœ íŒŒë“œì™€ 다르다. - [김준ì„] * {{{ spec: containers: .. ports: - containerPort: 8080 hostPort: 9000 protocol: TCP }}} * p573 * hostNetwork 옵션과 ìœ ì‚¬í•œ 파드 스펙 ì†ì„±ìœ¼ë¡œ hostPID와 hostIPCê°€ 있다. ì´ë¥¼ true로 ì„¤ì •í•˜ë©´ íŒŒë“œì˜ ì»¨í…Œì´ë„ˆëŠ” ë…¸ë“œì˜ PID와 IPC 네임스페ì´ìŠ¤ë¥¼ 사용해 컨테ì´ë„ˆì—서 ì‹¤í–‰ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤ê°€ ë…¸ë“œì˜ ë‹¤ë¥¸ 프로세스를 보거나 IPC로 ì´ë“¤ê³¼ í†µì‹ í• ìˆ˜ 있ë„ë¡ í•œë‹¤. {{{ spec: hostPID: true hostIPC: true }}} === 컨테ì´ë„ˆì˜ 보안 컨í…스트 구성 === * p574 * 파드 컨í…스트 ì•„ëž˜ì˜ ê°œë³„ 컨테ì´ë„ˆ 스펙ì—서 ì§ì ‘ ì§€ì •í• ìˆ˜ 있는 securityContext ì†ì„±ìœ¼ë¡œ 다른 보안 ê´€ë ¨ ê¸°ëŠ¥ì„ íŒŒë“œì™€ íŒŒë“œì˜ ì»¨í…Œì´ë„ˆì— êµ¬ì„±í• ìˆ˜ 있다. * 보안 컨í…스트를 ì„¤ì •í•˜ë©´ 다ìŒê³¼ ê°™ì€ ë‹¤ì–‘í•œ ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ 있다. * 컨테ì´ë„ˆì˜ 프로세스를 ì‹¤í–‰í• ì‚¬ìš©ìžID ì§€ì •í•˜ê¸° * 컨테ì´ë„ˆê°€ 루트로 실행ë˜ëŠ” 것 방지하기 * 컨테ì´ë„ˆë¥¼ 특권 모드ì—서 실행해 ë…¸ë“œì˜ ì»¤ë„ì— ê´€í•œ ëª¨ë“ ì ‘ê·¼ ê¶Œí•œì„ ê°€ì§ * 특권 모드ì—서 컨테ì´ë„ˆë¥¼ 실행해 컨테ì´ë„ˆì— 가능한 ëª¨ë“ ê¶Œí•œì„ ë¶€ì—¬í•˜ëŠ” 것과 달리 ê¸°ëŠ¥ì„ ì¶”ê°€í•˜ê±°ë‚˜ ì‚ì œí•´ ì„¸ë¶„í™”ëœ ê¶Œí•œ 구성하기 * 컨테ì´ë„ˆì˜ 권한 확ì¸ì„ ê°•ë ¥í•˜ê²Œ 하기 위해 SELinux 옵션 ì„¤ì •í•˜ê¸° * 프로세스가 컨테ì´ë„ˆì˜ 파ì¼ì‹œìŠ¤í…œì— ì“°ê¸° 방지하기 * p575 * {{{ $ kubectl exec pod-with-defaults id uid=0(root) gid=0(root) ... }}} * p576 * 컨테ì´ë„ˆ ì´ë¯¸ì§€ì— ì„¤ì •í•œ 것과 다른 ì‚¬ìš©ìž ID로 파드를 ì‹¤í–‰í•˜ë ¤ë©´ íŒŒë“œì˜ securityContext.reunAsUser ì†ì„±ì„ ì„¤ì •í•´ì•¼í•œë‹¤. * {{{ spec : containers: .. securityContext: runAsUser: 405 }}} * p577 * ëŒ€ë¶€ë¶„ì˜ ì»¨í…Œì´ë„ˆëŠ” 호스트 시스템과 ë¶„ë¦¬ë¼ ìžˆì§€ë§Œ 프로세스를 루트로 실행하는 ê²ƒì€ ì—¬ì „ížˆ ë‚˜ìœ ê´€í–‰ì´ë‹¤. * {{{ securityContext: runAsNonRoot: true }}} * p578 * {{{ securityContext: privileged: true }}} * ë…¸ë“œì˜ ì»¤ë„ì˜ ëª¨ë“ ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ì–»ê¸° 위해 íŒŒë“œì˜ ì»¨í…Œì´ë„ˆëŠ” 특권 모드로 실행ëœë‹¤. * p580 * 권한 있는 컨테ì´ë„ˆë¥¼ ë§Œë“¤ê³ ë¬´ì œí•œ ê¶Œí•œì„ ë¶€ì—¬í•˜ëŠ” ëŒ€ì‹ ë³´ì•ˆ ê´€ì ì—서 훨씬 ì•ˆì „í•œ ë°©ë²•ì€ ì‹¤ì œë¡œ 필요한 ì»¤ë„ ê¸°ëŠ¥ë§Œ 액세스하ë„ë¡ í•˜ëŠ”ê²ƒì´ë‹¤. * {{{ securityContext: capabilities: add: - SYS_TIME }}} * p582 * 컨테ì´ë„ˆê°€ ì´ë¥¼ 수행하지 못하게 í•˜ë ¤ë©´ 컨테ì´ë„ˆì˜ securityContext.capabilities.drop ì†ì„± ì•„ëž˜ì— ê¸°ëŠ¥ì„ ì¡°íšŒí•´ ê¸°ëŠ¥ì„ ì‚ì œí•´ì•¼ 한다. * {{{ securityContext: capabilities: drop: - CHown }}} * p583 * 컨테ì´ë„ˆì—서 실행 ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤ê°€ 컨테ì´ë„ˆì˜ 파ì¼ì‹œìŠ¤í…œì— ì“°ì§€ 못하게 í•˜ê³ ë§ˆìš´íŠ¸ëœ ë³¼ë¥¨ì—ë§Œ ì“°ë„ë¡ í• ìˆ˜ 있다. * {{{ // 파ì¼ì‹œìŠ¤í…œì€ ëª»ì“°ì§€ë§Œ 마운트 ë³¼ë¥¨ì€ ì”€ securityContext: readonlyRootFilesystem: true volumeMounts: - name: my-volume mountpath: /volume readOnly: false }}} * p585 * 6장ì—서 íŒŒë“œì˜ ì»¨í…Œì´ë„ˆ ê°„ì— ë°ì´í„°ë¥¼ ê³µìœ í•˜ëŠ” ë° ë³¼ë¥¨ì„ ì‚¬ìš©í•˜ëŠ” ë°©ë²•ì„ ì„¤ëª…í–ˆë‹¤. * ë‘ ì»¨í…Œì´ë„ˆê°€ ëª¨ë‘ ë£¨íŠ¸ë¡œ ì‹¤í–‰ë¼ ë³¼ë¥¨ì˜ ëª¨ë“ íŒŒì¼ì— 대한 ì „ì²´ 액세스 ê¶Œí•œì„ ë¶€ì—¬í–ˆê¸° 때문ì´ë‹¤. * ì¿ ë²„ë„¤í‹°ìŠ¤ë¥¼ 사용하면 컨테ì´ë„ˆì—서 실행 ì¤‘ì¸ ëª¨ë“ íŒŒë“œì˜ supplementalGroups ì†ì„±ì„ ì§€ì •í•´ 실행 ì¤‘ì¸ ì‚¬ìš©ìž IDì— ìƒê´€ì—†ì´ 파ì¼ì„ ê³µìœ í• ìˆ˜ 있따. ì´ëŠ” ë‹¤ìŒ ë‘가지 ì†ì„±ì„ 사용해 수행ëœë‹¤. * fsGroup * supplementalGroups * {{{ securityContext: fsGroup: 555 supplementalGroups: [666, 777] }}} === íŒŒë“œì˜ ë³´ì•ˆ ê´€ë ¨ 기능 사용 ì œí•œ === * p587 * í´ëŸ¬ìŠ¤í„° 관리ìžëŠ” 하나 ì´ìƒì˜ PodSecurityPolicy 리소스를 ìƒì„±í•´ 앞으로 설명한 보안 ê´€ë ¨ ê¸°ëŠ¥ì˜ ì‚¬ìš©ì„ ì œí•œí• ìˆ˜ 있다. * p588 * PodSecuirtyPolicy는 í´ëŸ¬ìŠ¤í„° 수준 리소스로, 사용ìžê°€ 파드ì—서 ì‚¬ìš©í• ìˆ˜ 있거나 ì‚¬ìš©í• ìˆ˜ 없는 보안 ê´€ë ¨ ê¸°ëŠ¥ì„ ì •ì˜í•œë‹¤. * PodSecurityPolicy ë¦¬ì†ŒìŠ¤ì— êµ¬ì„±ëœ ì •ì±…ì„ ìœ ì§€í•˜ëŠ” ìž‘ì—…ì€ API 서버ì—서 실행ë˜ëŠ” PodSecurityPolicy 어드미션 컨트롤 플러그ì¸ìœ¼ë¡œ 수행ëœë‹¤. * p589 * PodSecurityPolicy 리소스는 다ìŒì„ ì •ì˜í•œë‹¤. * 파드가 í˜¸ìŠ¤íŠ¸ì˜ IPC, PID ë˜ëŠ” ë„¤íŠ¸ì›Œí¬ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ë¥¼ ì‚¬ìš©í• ìˆ˜ 있는지 여부 * 파드가 ë°”ì¸ë”©í• 수 있는 í¬íЏ * 컨테ì´ë„ˆê°€ ì‹¤í–‰í• ìˆ˜ 있는 ì‚¬ìš©ìž ID * íŠ¹ê¶Œì„ ê°–ëŠ” 컨테ì´ë„ˆê°€ 있는 파드를 만들 수 있는지 여부 * ì–´ë–¤ ì»¤ë„ ê¸°ëŠ¥ì´ í—ˆìš©ë˜ëŠ”ì§€, ì–´ë–¤ ê¸°ëŠ¥ì´ ê¸°ë³¸ìœ¼ë¡œ 추가ë˜ê±°ë‚˜ í˜¹ì€ í•ìƒ ì‚ì œë˜ëŠ”ì§€ 여부 * 컨테ì´ë„ˆê°€ ì‚¬ìš©í• ìˆ˜ 있는 SELinuxs ë ˆì´ë¸” * 컨테ì´ë„ˆê°€ 쓰기 가능한 루트 파ì¼ì‹œìŠ¤í…œì„ ì‚¬ìš©í• ìˆ˜ 있는지 여부 * 컨테ì´ë„ˆê°€ ì‹¤í–‰í• ìˆ˜ 있는 파ì¼ì‹œìŠ¤í…œ 그룹 * 파드가 ì‚¬ìš©í• ìˆ˜ 있는 볼륨 ìœ í˜• * p591 * í—ˆìš©ëœ ì‚¬ìš©ìž ë˜ëŠ” 그룹 ID 목ë¡ì„ ì œí•œí•˜ë ¤ë©´ MustRunAs ê·œì¹™ì„ ë³€ê²½í•´ í—ˆìš©í• ê·¸ë£¹ ID를 ì§€ì •í• ìˆ˜ 있다. * p593 * runAsUser í•„ë“œì˜ ê²½ìš° MustRunAsNonRootë¼ëŠ” 추가 ê·œì¹™ì„ ì‚¬ìš©í• ìˆ˜ 있다. ì´ë¦„ì—서 알수 ìžˆë“¯ì´ ì‚¬ìš©ìžëŠ” 루트로 실행ë˜ëŠ” 컨테ì´ë„ˆë¥¼ ë°°í¬í• 수 없다. * p594 * ê·¸ë™ì•ˆ ë°°ìš´ 대로 컨테ì´ë„ˆëŠ” 특권 모드ì—서 실행ë 수 있으며 ê° ì»¨í…Œì´ë„ˆì— 리눅스 ì»¤ë„ ê¸°ëŠ¥ì„ ì¶”ê°€í•˜ê±°ë‚˜ ì‚ì œí•´ 좀 ë” ì„¸ë¶„í™”ëœ ê¶Œí•œ êµ¬ì„±ì„ ì •ì˜í• 수 있다. ë‹¤ìŒ í•„ë“œ 세 개는 컨테ì´ë„ˆì˜ ê¸°ëŠ¥ì— ì˜í–¥ì„ 준다. * allowedCapabilities 컨테ì´ë„ˆì— ì–´ë–¤ ê¸°ëŠ¥ì„ ì¶”ê°€í• ì§€ ì§€ì • * defaultAddCapabilities ëª¨ë“ ì»¨í…Œì´ë„ˆì— 기능 추가 * requiredDropCapabilities 컨테ì´ë„ˆì—서 기능 ì œê±° * p596 * PodSecurityPolicy 리소스가 í• ìˆ˜ 있는 마지막 ê¸°ëŠ¥ì€ ì‚¬ìš©ìžê°€ íŒŒë“œì— ì¶”ê°€í• ìˆ˜ 있는 볼륨 ìœ í˜•ì„ ì •ì˜í•˜ëŠ” 것ì´ë‹¤. 최소한 PodSecurityPolicy는 ì ì–´ë„ emptyDir, 컨피그맵, 시í¬ë¦¿, 다운워드API, í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ ë³¼ë¥¨ì„ ì‚¬ìš©ì„ í—ˆìš©í•´ì•¼ 한다. * 다른 사용ìžì—게 다른 ì •ì±…ì„ í• ë‹¹í•˜ëŠ” ê²ƒì€ 12장ì—서 설명한 RBAC 매커니즘으로 수행ëœë‹¤. í´ëŸ¬ìŠ¤í„°ë¡¤ 리소스를 ë§Œë“¤ê³ ì´ë¦„으로 개별 ì •ì±…ì„ ì§€ì •í•´ 필요한 ë§Œí¼ ë§Žì€ ì •ì±…ì„ ìž‘ì„±í•˜ê³ ê°œë³„ ì‚¬ìš©ìž ë˜ëŠ” ê·¸ë£¹ì´ ì‚¬ìš©í• ìˆ˜ 있ë„ë¡ í•˜ëŠ” 것ì´ë‹¤. * p598 * {{{ $ kubectl create clusterrole psp-default --verb=use --resource=podsecuritypolicies --resource-name=default $ kubectl create clusterrole psp-privileged --verb=use --resource=podsecuritypolicies --resource-name=previleged }}} * {{{ $ kubectl create clusterrolebinding psp-all-users --clusterrole=psp-defulat --group=system:authenticated $ kubectl create clusterrolebinding psp-bob --clusterrole=psp-privileged --user=bob }}} === 파드 ë„¤íŠ¸ì›Œí¬ ê²©ë¦¬ === * p601 * NetworkPolicy는 해당 ë ˆì´ë¸” ì…€ë ‰í„°ì™€ ì¼ì¹˜í•˜ëŠ” íŒŒë“œì— ì ìš©ë˜ë©° ì¼ì¹˜í•˜ëŠ” íŒŒë“œì— ì•¡ì„¸ìŠ¤í• ìˆ˜ 있는 소스나 파드ì—서 ì•¡ì„¸ìŠ¤í• ìˆ˜ 있는 대ìƒì„ ì§€ì •í•œë‹¤. ì´ê²ƒì€ ê°ê° ì¸ê·¸ë ˆìŠ¤ì™€ ì´ê·¸ë ˆìФ 규칙으로 구성ëœë‹¤. ë‘ ìœ í˜•ì˜ ê·œì¹™ì€ íŒŒë“œ ì…€ë ‰í„°ì™€ ì¼ì¹˜í•˜ëŠ” 파드나 ë ˆì´ë¸”ì´ ë„¤ìž„ìŠ¤íŽ˜ì´ìФ ì…€ë ‰í„°ì™€ ì¼ì¹˜í•˜ëŠ” 네임스페ì´ìŠ¤ì˜ ëª¨ë“ íŒŒë“œ, ë˜ëŠ” CIDRí‘œê¸°ë²•ì„ ì‚¬ìš©í•´ ì§€ì •ëœ ë„¤íŠ¸ì›Œí¬ IP 대ì—ê³¼ ì¼ì¹˜í•˜ëŠ” íŒŒë“œì— ëŒ€í•´ ì ìš©ëœë‹¤. * p602 * {{{ kind: NetworkPolicy metadata: name: default-deny spec: podSelector: // ëª¨ë‘ ë§¤ì¹ë˜ì–´ ëª¨ë“ ë„¤íŠ¸ì›Œí¬ deny }}} * {{{ kind: NetworkPolicy metadata: name: postgres-netpolicy spec: podSelector: matchLabels: app: database ingress: - from: - podSelector: matchLabels: app: webserver ports: - port: 5432 }}} * {{{ ingress: - from: - namespaceSelector: matchLabels: tenant: manning ports: - port: 80 }}} * p606 * {{{ ingress: - from: - inBlock: cidr: 192.168.1.0/24 }}} * {{{ egress: - to: - podSelector: matchLabels: app: database }}} == íŒŒë“œì˜ ì»´í“¨íŒ… 리소스 관리 == * p609 * ì´ ë‘ ì„¸íŠ¸ì˜ íŒŒë¼ë©”터를 ì„¤ì •í•˜ëŠ” ê²ƒì€ íŒŒë“œê°€ ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„°ê°€ ì œê³µí•˜ëŠ” 리소스를 ê³µí‰í•˜ê²Œ ê³µìœ í•˜ê²Œ í•˜ê³ , í´ëŸ¬ìŠ¤í„° ì „ì²´ì—서 파드가 ìŠ¤ì¼€ì¥´ë§ ë˜ëŠ” ë°©ì‹ì—ë„ ì˜í–¥ì„ 미친다. * CPU 리소스는 어떻게 í• ë‹¹í•˜ëŠ”ê±´ì§€ ê¶ê¸ˆí•˜ë‹¤ - [서지혜] * 커ë„ì˜ ê·¸ê²ƒìž…ë‹ˆë‹¤. OS ì‹œê°„ì— ë°°ì› ë˜ê²ƒì´ìš”. Cgoup으로 ê° groupì˜ ì‚¬ìš©ëŸ‰ì„ ëª¨ë‹ˆí„°ë§ í•˜ê³ ê¸°ì¤€ì‹œê°„ë‚´ì— quota를 다 ì“°ë©´ ë”ì´ìƒ CPU Timeì„ í• ë‹¹í•˜ì§€ 않는 방법으로 ë™ìž‘합니다. - [bluemir] === 파드 컨테ì´ë„ˆì˜ 리소스 ìš”ì² === * p610 * íŒŒë“œì˜ ë¦¬ì†ŒìŠ¤ ìš”ì²ê³¼ ì œí•œì€ ëª¨ë“ ì»¨í…Œì´ë„ˆì˜ 리소스 ìš”ì²ê³¼ ì œí•œì˜ í•©ì´ë‹¤. * 파드 리소스를 컨테ì´ë„ˆë“¤ì´ ë‚˜ëˆ ì“°ëŠ” 것 - [서지혜] * 200 밀리코어는 1/5 CPU * Mi는 ì´ì§„주 ì‹œë°˜ì˜ Mebibyte를 ì˜ë¯¸í•œë‹¤. MB(megabyte)는 ì‹ì§„수 기반으로 ì°¨ì´ê°€ 있다. * p611 * CPU ìš”ì²ì„ ì§€ì •í•˜ì§€ 않으면 ... ìµœì•…ì˜ ê²½ìš° CPU ì‹œê°„ì„ ì „í˜€ í• ë‹¹ë°›ì§€ ëª»í• ìˆ˜ 있다. * request ê°€ 매우 ë‚®ì„경우ì—ë„ ë°œìƒí•©ë‹ˆë‹¤. 10m~50m 으로 ì„¤ì •í–ˆë‹¤ê°€ 1~5ì´ˆ ì •ë„ì˜ delay를 겪ì„ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. * ìš”ì²(request)는 컨테ì´ë„ˆê°€ ì‚¬ìš©í• ìˆ˜ 있는 CPU ì–‘ì„ ì œí•œí•˜ì§€ 않으므로 ì´ëŠ” ì˜ˆê²¬ëœ ì¼ì´ë‹¤. ì œí•œì„ í•˜ë ¤ë©´ CPU ì œí•œ(limits)ì„ ì§€ì •í•´ì•¼ 한다. * request는 최소 í• ë‹¹ 리소스, limits는 최대 í• ë‹¹ 리소스 - [서지혜] * {{{ $ kubectl exec -it requrests-pod top }}} * p612 * 스케줄러는 파드를 ìŠ¤ì¼€ì¤„ë§ í• ë•Œ íŒŒë“œì˜ ë¦¬ì†ŒìŠ¤ ìš”ì² ì‚¬í•ì„ ë§Œì¡±í•˜ëŠ” 충분한 리소스를 가진 ë…¸ë“œë§Œì„ ê³ ë ¤í•œë‹¤. * 스케줄러는 스케줄ë§ì„ 하는 시ì ì— ê° ê°œë³„ 리소스가 얼마나 사용ë˜ëŠ”ì§€ ë³´ì§€ ì•Šê³ , ë…¸ë“œì— ë°°í¬ëœ íŒŒë“œë“¤ì˜ ë¦¬ì†ŒìŠ¤ ìš”ì²ëŸ‰ì˜ ì „ì²´ í•©ë§Œì„ ë³¸ë‹¤ëŠ” 것ì´ë‹¤. * ì‹¤ì œ 파드가 그보다 ì 게 ì‚¬ìš©í•˜ê³ ìžˆì–´ë„ ìš”ì²(request)ë“¤ì˜ ì´ í•©ë§Œ ê³ ë ¤í•˜ë¯€ë¡œ 스케줄 계산 간단해 질 듯. 그래서 ê°€ë” ìš”ì² ê°’ì„ ìµœì í™” 하는 ê²ƒë„ í•„ìš”í•˜ë‹¤ - [서지혜] * p613 * ë‘ ê°œì˜ ìš°ì„ ìˆœìœ„ 함수가 ìš”ì²ëœ 리소스 ì–‘ì— ê¸°ë°˜í•´ ë…¸ë“œì˜ ìˆœìœ„ë¥¼ ì •í•œë‹¤. 바로 LeastRequestedPriority와 MostReqeustedPriorityì´ë‹¤. 첫번째 함수는 ìš”ì²ëœ 리소스가 ë‚®ì€(í• ë‹¹ë˜ì§€ ì•Šì€ ë¦¬ì†ŒìŠ¤ì˜ ì–‘ì´ í°)노드를 ì„ í˜¸í•˜ëŠ” 반면, ë‘ ë²ˆì§¸ 함수는 그와 ì •ë°˜ëŒ€ë¡œ ìš”ì²ëœ 리소스가 가장 ë§Žì€ ë…¸ë“œë¥¼ ì„ í˜¸í•œë‹¤. * 파드를 ì¼ë¶€ ë…¸ë“œì— ë§Žì´ ìŠ¤ì¼€ì¤„ë§í•´ íŠ¹ì • 노드를 비울 수 ìžˆê³ ì œê±°í• ìˆ˜ 있다. ê° ë…¸ë“œë³„ë¡œ ë¹„ìš©ì„ ì§€ë¶ˆí•˜ë¯€ë¡œ ì´ë ‡ê²Œ ë¹„ìš©ì„ ì ˆê°í• 수 있다. * p614 * kubectl describe nodesì˜ ì¶œë ¥ 결과를 ë³´ë©´ ë…¸ë“œì˜ ì‚¬ìš© 가능한 리소스가 ë‘ ì„¸íŠ¸ë¡œ 표시ëœë‹¤. ë…¸ë“œì˜ capacity와 allocatable 리소스다. capacity는 ë…¸ë“œì˜ ì´ ë¦¬ì†ŒìŠ¤ë¥¼ ë‚˜íƒ€ë‚´ê³ íŒŒë“œì—서 ëª¨ë‘ ì‚¬ìš© 가능한 ê²ƒì€ ì•„ë‹ˆë‹¤. íŠ¹ì • 리소스는 ì¿ ë²„ë„¤í‹°ìŠ¤ì™€ 시스템 구성 요소로 스케줄ë§ëœ ê²ƒì¼ ìˆ˜ 있다. 스케줄러는 ì˜¤ì§ allocatable 리소스 ì–‘ì„ ê¸°ì¤€ìœ¼ë¡œ ê²°ì •í•œë‹¤. * p617 * kube-system 네임스페ì´ìŠ¤ì˜ ì„¸ 파드가 명시ì 으로 CPU 리소스를 ìš”ì²í–ˆë‹¤. ì´ ìš”ì²ì´ 노드를 오버커밋 하게 만들기 ë•Œë¬¸ì— ìŠ¤ì¼€ì¤„ëŸ¬ëŠ” ë…¸ë“œì— íŒŒë“œë¥¼ ìŠ¤ì¼€ì¤„ë§ í• ìˆ˜ 없다. * 노드 용량 초과를 overcommitì´ë¼ê³ 하는군 - [서지혜] * p619 * CPU ìš”ì²ì— 기반해 사용ë˜ì§€ ì•Šì€ CPUì‹œê°„ì´ ì»¨í…Œì´ë„ˆì— ë¶„ë°°ëœë‹¤. * ì œí•œì„ ë‘ì§€ ì•Šì€ íŒŒë“œë“¤ì´ ìœ íœ´ìƒíƒœê°€ 아니ë¼ë©´ 남는 CPU ì‹œê°„ì€ íŒŒë“œë“¤ì˜ ìš”ì²ì— 비례해 ë¶„ë°°ëœë‹¤ - [서지혜] * ê²°êµ ì•„ë¬´ë„ ì‚¬ìš©í•˜ì§€ 않는다면 사용 가능한 ëª¨ë“ CPU를 사용하는 ê²ƒì´ ìƒì‹ì´ë‹¤. * ì—시 ê·¸ë ‡êµ° - [서지혜] * ì¿ ë²„ë„¤í‹°ìŠ¤ë¥¼ 사용하면 ì‚¬ìš©ìž ì •ì˜ ë¦¬ì†ŒìŠ¤ë¥¼ ë…¸ë“œì— ì¶”ê°€í•˜ê³ íŒŒë“œì˜ ë¦¬ì†ŒìŠ¤ ìš”ì²ìœ¼ë¡œ ì‚¬ìš©ìž ì •ì˜ ë¦¬ì†ŒìŠ¤ë¥¼ ìš”ì²í• 수 있다. * 리소스 ì´ë¦„ì€ kubernetes.io ë„ë©”ì¸ìœ¼ë¡œ 시작하지 않는 ì´ìƒ example.org/my-resource 와 ê°™ì´ ë¬´ì—‡ì´ë“ ë 수 있다. ìˆ˜ëŸ‰ì€ ë°˜ë“œì‹œ ì •ìˆ˜ì—¬ì•¼ 한다. ì´ê°’ì€ capacity 필드ì—서 allocatable 필드로 ìžë™ìœ¼ë¡œ 복사ëœë‹¤. * ì‚¬ìš©ìž ì •ì˜ ë¦¬ì†ŒìŠ¤ì˜ ì˜ˆë¡œëŠ” ë…¸ë“œì— ì‚¬ìš© 가능한 GPU 단위 수가 있다. === 컨테ì´ë„ˆì— 사용 가능한 리소스 ì œí•œ === * p620 * CPU는 ì••ì¶• 가능한 리소스다. 즉, 컨테ì´ë„ˆì—서 실행 ì¤‘ì¸ í”„ë¡œì„¸ìŠ¤ì— ë¶€ì •ì ì¸ ì˜í–¥ì„ 주지 ì•Šê³ ì»¨í…Œì´ë„ˆê°€ 사용하는 CPU ì–‘ì„ ì¡°ì ˆí• ìˆ˜ 있따. 메모리는 분명 다르다. í”„ë¡œì„¸ìŠ¤ì— ë©”ëª¨ë¦¬ê°€ 주어지면 프로세스가 메모리를 í•´ì œí•˜ì§€ 않는 한 ê°€ì ¸ê°ˆ 수 없다. * p621 * 리소스 ìš”ì²ê³¼ëŠ” 달리 리소스 ì œí•œì€ ë…¸ë“œì˜ í• ë‹¹ 가능한 리소스 양으로 ì œí•œë˜ì§€ 않는다. ëª¨ë“ íŒŒë“œì˜ ë¦¬ì†ŒìŠ¤ ì œí•œ 합계는 노드 ìš©ëŸ‰ì˜ 100%를 ì´ˆê³¼í• ìˆ˜ 있다. * CPU ì‚¬ìš©ë¥ ì€ ì¡°ì ˆë˜ë¯€ë¡œ 컨테ì´ë„ˆì— CPU ì œí•œì´ ì„¤ì •ë¼ ìžˆìœ¼ë©´ 프로세스는 ì„¤ì •ëœ ì œí•œë³´ë‹¤ ë§Žì€ CPU ì‹œê°„ì„ í• ë‹¹ë°›ì„ ìˆ˜ 없다. * 메모리는 CPU와는 다르다. 프로세스가 ì œí•œë³´ë‹¤ ë§Žì€ ë©”ëª¨ë¦¬ë¥¼ í• ë‹¹ë°›ìœ¼ë ¤ 시ë„하면 프로세스는 종료ëœë‹¤(컨테ì´ë„ˆê°€ OOMKilled ëë‹¤ê³ í•œë‹¤. OOMì€ Out Of Memory다) íŒŒë“œì˜ ìž¬ì‹œìž‘ ì •ì±…ì´ Always ë˜ëŠ” OnFailure로 ì„¤ì •ëœ ê²½ìš° 프로세스는 즉시 다시 시작하므로 종료ëìŒì„ 알아차리지 ëª»í• ìˆ˜ 있다. * p625 * top ëª…ë ¹ì€ ì»¨í…Œì´ë„ˆê°€ 실행 ì¤‘ì¸ ì „ì²´ ë…¸ë“œì˜ ë©”ëª¨ë¦¬ ì–‘ì„ í‘œì‹œí•œë‹¤. 컨테ì´ë„ˆì— 사용 가능한 ë©”ëª¨ë¦¬ì˜ ì œí•œì„ ì„¤ì •í•˜ë”ë¼ë„ 컨테ì´ë„ˆëŠ” ì´ ì œí•œì„ ì¸ì‹í•˜ì§€ 못한다. * p626 * 메모리와 마찬가지로 컨테ì´ë„ˆëŠ” 컨테ì´ë„ˆì— ì„¤ì •ëœ CPU ì œí•œê³¼ ìƒê´€ì—†ì´ ë…¸ë“œì˜ ëª¨ë“ CPU를 본다. * ì—¬ëŸ¬ë¶„ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ì´ 시스템ì—서 ë³¼ 수 있는 CPU ìˆ˜ì— ì˜ì¡´í•˜ëŠ” ëŒ€ì‹ Downward APi를 사용해 컨테ì´ë„ˆì˜ CPU ì œí•œì„ ì „ë‹¬í•˜ê³ ì´ë¥¼ ì‚¬ìš©í• ìˆ˜ 있따. ë˜í•œ ë‹¤ìŒ íŒŒì¼ì„ ì½ì–´ cgroup 시스템ì—서 ì§ì ‘ ì„¤ì •ëœ CPU ì œí•œì„ ì–»ì„ ìˆ˜ë„ ìžˆë‹¤. === 파드 QoS í´ëž˜ìФ ì´í•´ === * p627 * ì–´ë–¤ 파드가 ìš°ì„ ìˆœìœ„ë¥¼ 가지는지 ì§€ì •í•˜ëŠ” ë°©ë²•ì´ í•„ìš”í•˜ë‹¤. ì¿ ë²„ë„¤í‹°ìŠ¤ëŠ” 파드를 세가지 서비스 품질 í´ëž˜ìŠ¤ë¡œ 분류한다. * BestEffort (최하위) * Burstable * Guaranteed (최ìƒìœ„) * QoS í´ëž˜ìŠ¤ëŠ” 파드 컨테ì´ë„ˆì˜ 리소스 ìš”ì²ê³¼ ì œí•œì˜ ì¡°í•©ì—서 파ìƒëœë‹¤. * p628 * íŒŒë“œì˜ í´ëž˜ìŠ¤ê°€ Guaranteedì´ë ¤ë©´ ë‹¤ìŒ ì„¸ 가지를 충족해야 한다. * CPU와 ë©”ëª¨ë¦¬ì— ë¦¬ì†ŒìŠ¤ ìš”ì²ê³¼ ì œí•œì´ ëª¨ë‘ ì„¤ì •ë¼ì•¼ 한다. * ê° ì»¨í…Œì´ë„ˆì— ì„¤ì •ë¼ì•¼ 한다. * 리소스 ìš”ì²ê³¼ ì œí•œì´ ë™ì¼í•´ì•¼ 한다. * 컨테ì´ë„ˆì˜ 리소스 ìš”ì²ì´ 명시ì 으로 ì„¤ì •ë˜ì§€ ì•Šì€ ê²½ìš° 기본ì 으로 리소스 ì œí•œê³¼ ë™ì¼í•˜ê²Œ ì„¤ì •ë˜ë¯€ë¡œ ëª¨ë“ ë¦¬ì†ŒìŠ¤ì— ëŒ€í•œ ì œí•œì„ ì§€ì •í•˜ëŠ” 것으로 파드가 Guaranteedê°€ ë˜ê¸° 충분하다. * 컨테ì´ë„ˆì˜ 리소스 ì œí•œì´ ë¦¬ì†ŒìŠ¤ ìš”ì²ê³¼ ì¼ì¹˜í•˜ì§€ ì•Šì€ ë‹¨ì¼ ì»¨í…Œì´ë„ˆ 파드와 ì ì–´ë„ í•œ ê°œì˜ ì»¨í…Œì´ë„ˆê°€ 리소스 ìš”ì²ì„ ì§€ì •í–ˆì§€ë§Œ 리소스 ì œí•œì„ ì„¤ì •í•˜ì§€ ì•Šì€ ëª¨ë“ íŒŒë“œê°€ ì—¬ê¸°ì— ì†í•œë‹¤. * p629 * 리소스 ìš”ì²ê³¼ ì œí•œì— ê¸°ë°˜ìœ¼ë¡œ 한 컨테ì´ë„ˆê°€ í•˜ë‚˜ì¸ íŒŒë“œì˜ QoS í´ëž˜ìФ *|| CPU ìš”ì² ëŒ€ ì œí•œ || 메모리 ìš”ì²ëŒ€ ì œí•œ || 컨테ì´ë„ˆ QoS 리소스 || || ë¯¸ì„¤ì • || ë¯¸ì„¤ì • || BestEffort || || ë¯¸ì„¤ì • || ìš”ì² < ì œí•œ || Burstable || || ë¯¸ì„¤ì • || ìš”ì² = ì œí•œ || Burstable || || ìš”ì² < ì œí•œ || ë¯¸ì„¤ì • || Burstable || || ìš”ì² < ì œí•œ || ìš”ì² < ì œí•œ || Burstable || || ìš”ì² < ì œí•œ || ìš”ì² = ì œí•œ || Burstable || || ìš”ì² = ì œí•œ || ìš”ì² = ì œí•œ || Guaranteed || * p630 * ì ì–´ë„ í•œ 컨테ì´ë„ˆê°€ 다른 í´ëž˜ìŠ¤ë¥¼ 가지면 컨테ì´ë„ˆ í´ëž˜ìŠ¤ê°€ 무엇ì´ë“ ìƒê´€ì—†ì´ íŒŒë“œì˜ QoSí´ëž˜ìŠ¤ëŠ” Burstableì´ë‹¤. * p632 * 실행 ì¤‘ì¸ ê° í”„ë¡œì„¸ìŠ¤ëŠ” OOM ì 수를 갖는다. OOMì 수는 ë‘ ê°€ì§€ 기준으로 계산ëœë‹¤. 프로세스가 소비하는 가용 ë©”ëª¨ë¦¬ì˜ ë¹„ìœ¨ê³¼ 컨테ì´ë„ˆì˜ ìš”ì²ëœ 메모리와 íŒŒë“œì˜ QoS í´ëž˜ìŠ¤ë¥¼ 기반으로 한 ê³ ì •ëœ OOM ì 수 ì¡°ì •ì´ë‹¤. 컨테ì´ë„ˆê°€ í•˜ë‚˜ì¸ íŒŒë“œ ë‘ ê°œê°€ ì¡´ìž¬í•˜ê³ ë‘˜ 다 Burstable í´ëž˜ìŠ¤ì¼ ë•Œ ì‹œìŠ¤í…œì€ ìš”ì²ëœ ë©”ëª¨ë¦¬ì˜ ë¹„ìœ¨ì´ ë‹¤ë¥¸ 것보다 ë†’ì€ ì»¨í…Œì´ë„ˆë¥¼ 종료한다. === 네임스페ì´ìŠ¤ë³„ íŒŒë“œì— ëŒ€í•œ 기본 ìš”ì²ê³¼ ì œí•œ ì„¤ì • === * p633 * LimitRange 리소스는 컨테ì´ë„ˆì˜ê° ë¦¬ì†ŒìŠ¤ì— ìµœì†Œ/최대 ì œí•œì„ ì§€ì •í• ë¿ë§Œ ì•„ë‹ˆë¼ ë¦¬ì†ŒìŠ¤ ìš”ì²ì„ 명시ì 으로 ì§€ì •í•˜ì§€ ì•Šì€ ì»¨í…Œì´ë„ˆì˜ 기본 리소스 ìš”ì²ì„ ì§€ì •í•œë‹¤. * limitrange를 ì 용하면 íŒŒë“œì˜ ì²˜ìŒ ë§ˆì£¼ì¹œ ì˜¤ë¥˜ì˜ ë‚´ìš©ë¿ë§Œ ì•„ë‹ˆë¼ íŒŒë“œê°€ ê±°ë¶€ëœ ëª¨ë“ ì´ìœ 를 보여준다는 ì ì´ë‹¤. * 네임스페ì´ìŠ¤ê°€ 다른 íŒ€ì„ ë¶„ë¦¬í•˜ê±°ë‚˜, ë™ì¼ ì¿ ë²„ë„¤í‹°ìŠ¤ í´ëŸ¬ìŠ¤í„°ì—서 실행하는 개발, QA, 스테ì´ì§•, 프로ë•ì…˜ 파트를 분리하는 경우 ê° ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ì— ë‹¤ë¥¸ LimitRange를 사용하면 í° íŒŒë“œëŠ” íŠ¹ì • 네임스페ì´ìŠ¤ë§Œ ìƒì„±ë˜ëŠ” 반면 나머지 네임스페ì´ìŠ¤ëŠ” ë” ìž‘ì€ íŒŒë“œë¡œ ì œí•œë˜ë„ë¡ ë³´ìž¥í•œë‹¤. === 네임스페ì´ìŠ¤ì˜ ì‚¬ìš© 가능한 ì´ ë¦¬ì†ŒìŠ¤ ì œí•œí•˜ê¸° === * p638 * 앞서 본것처럼 LimitRange는 개별 파드ì—ë§Œ ì ìš©ë˜ì§€ë§Œ í´ëŸ¬ìŠ¤í„° 관리ìžëŠ” 네임스페ì´ìФì—서 사용 가능한 ì´ ë¦¬ì†ŒìŠ¤ ì–‘ì„ ì œí•œí• ìˆ˜ 있는 ë°©ë²•ì´ í•„ìš”í•˜ë‹¤. ì´ê²ƒì€ 리소스쿼터 오브ì 트를 ìƒì„±í•´ ë‹¬ì„±í• ìˆ˜ 있다. * 리소스쿼터는 네임스페ì´ìФì—서 파드가 ì‚¬ìš©í• ìˆ˜ 있는 컴퓨팅 리소스 ì–‘ê³¼ í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ì´ ì‚¬ìš©í• ìˆ˜ 있는 ìŠ¤í† ë¦¬ì§€ ì–‘ì„ ì œí•œí•œë‹¤. * p640 * 리소스쿼터를 ìƒì„±í• 때 주ì˜í• ì ì€ LimitRange 오브ì íŠ¸ë„ í•¨ê»˜ ìƒì„±í•´ì•¼ 한다는 것ì´ë‹¤. * íŠ¹ì • ë¦¬ì†ŒìŠ¤ì— ëŒ€í•œ 쿼터가 ì„¤ì •ëœ ê²½ìš°ì—, 파드ì—는 ë™ì¼í•œ ë¦¬ì†ŒìŠ¤ì— ëŒ€í•œ ìš”ì² ë˜ëŠ” ì œí•œì´ ê°ê° ì„¤ì •ë¼ì•¼ 한다. ê·¸ë ‡ì§€ 않으면 API 서버가 파드를 허용하지 않는다. ê·¸ë ‡ê¸° ë•Œë¬¸ì— ì´ëŸ¬í•œ ë¦¬ì†ŒìŠ¤ì— ëŒ€í•œ ê¸°ë³¸ê°’ì´ ìžˆëŠ” LimitRange를 갖는 ê²ƒì´ íŒŒë“œë¥¼ 만드는 ê²ƒì„ ì¡°ê¸ˆ ë” ì‰½ê²Œ ë§Œë“ ë‹¤. * p643 * 오브ì 트 ìˆ˜ì˜ ì¿¼í„°ëŠ” 현재 ë‹¤ìŒ ì˜¤ë¸Œì íŠ¸ì— ì„¤ì •í• ìˆ˜ 있다. * 파드 * ë ˆí”Œë¦¬ì¼€ì´ì…˜ì»¨íŠ¸ë¡¤ëŸ¬ * 시í¬ë¦¿ * 컨피그맵 * í¼ì‹œìŠ¤í„´íŠ¸ë³¼ë¥¨í´ë ˆìž„ * 서비스, 로드밸런서 서비스와 노드í¬íЏ 서비스와 ê°™ì€ ë‘ ê°€ì§€ ìœ í˜•ì˜ ì„œë¹„ìŠ¤ * p644 * 쿼터는 쿼터 범위로 ì œí•œë 수 있다. 현재 BestEffort, NotBestEffort, Terminating, NotTerminatingì˜ ë„¤ 가지 범위를 ì‚¬ìš©í• ìˆ˜ 있다. * BestEffort ë° NotBestEffort 범위는 쿼터가 BestEffort QoSí´ëž˜ìФ ë˜ëŠ” 다른 ë‘ í´ëž˜ìФ 중 하나 ê°€ 있는 íŒŒë“œì— ì ìš©ë˜ëŠ”ì§€ 여부를 ê²°ì •í•œë‹¤. * Terminatingê³¼ NotTerminatingì€ ì´ë¦„ì—서 알수 ìžˆë“¯ì´ ì¢…ë£Œ ê³¼ì •ì˜ íŒŒë“œì—는 ì ìš©ë˜ì§€ 않는다. ê° íŒŒë“œê°€ 종료ë˜ê³ 실패로 표시ë˜ê¸° ì „ì— ì–¼ë§ˆë‚˜ 오래 ì‹¤í–‰í• ìˆ˜ 있는지 ì§€ì •í• ìˆ˜ 있다. 파드 ìŠ¤íŽ™ì˜ activeDeadlineSeconds필드를 ì„¤ì •í•˜ë©´ ëœë‹¤. ì´ ì†ì„±ì€ 파드가 실패로 í‘œì‹œëœ í›„ 종료ë˜ê¸° ì „ 시작 ì‹œê°„ì„ ê¸°ì¤€ìœ¼ë¡œ 노드ì—서 활성화ë˜ë„ë¡ í—ˆìš©í•˜ëŠ” ì‹œê°„ì„ ì •ì˜í•œë‹¤. Terminating 쿼터 범위는 activeDeadLineSecondsê°€ ì„¤ì •ëœ íŒŒë“œì— ì ìš©ë˜ëŠ” 반면 NotTerminatingì€ ê·¸ë ‡ì§€ ì•Šì€ íŒŒë“œì— ì ìš©ëœë‹¤. === 파드 리소스 사용량 ëª¨ë‹ˆí„°ë§ === * p645 * Kubelet ìžì²´ì—는 ì´ë¯¸ cAdvisorë¼ëŠ” ì—ì´ì „트가 í¬í•¨ë¼ ìžˆëŠ”ë° ì´ ì—ì´ì „트는 노드ì—서 실행ë˜ëŠ” 개별 컨테ì´ë„ˆì™€ 노드 ì „ì²´ì˜ ë¦¬ì†ŒìŠ¤ 사용 ë°ì´í„°ë¥¼ 수집한다. ì „ì²´ í´ëŸ¬ìŠ¤í„°ë¥¼ ì´ëŸ¬í•œ 통계를 중앙세ㅓ ìˆ˜ì§‘í•˜ë ¤ë©´ 힙스터ë¼ëŠ” 추가 구성요소를 실행해야 한다. * 힙스터가 사ë¼ì§€ê³ cAdvisorê°€ 대체ëœê²ƒìœ¼ë¡œ 앎 - [김준ì„] * {{{ $ kubectl top pod --all-namespaces }}} == 파드와 í´ëŸ¬ìŠ¤í„° ë…¸ë“œì˜ ì˜¤í† ìŠ¤ì¼€ì¼ë§ == == ê³ ê¸‰ ìŠ¤ì¼€ì¤„ë§ == == ì• í”Œë¦¬ì¼€ì´ì…˜ ê°œë°œì„ ìœ„í•œ 모범 사례 == == ì¿ ë²„ë„¤í‹°ìŠ¤ì˜ í™•ìž¥ ==