[kubespray] cluster.yaml

진웅·2026년 1월 31일

k8s deploy

목록 보기
13/20
post-thumbnail

이번엔 kubespray에서 k8s를 설치하는 cluster.yaml 동작 중심으로 설치 과정을 재정리


플레이북 호출 구조

/root/kubespray/cluster.yml
    └── playbooks/cluster.yml (import)
            ├── boilerplate.yml
            ├── internal_facts.yml
            ├── install_etcd.yml
            └── 각종 Role 실행
cat /root/kubespray/cluster.yml
---
- name: Install Kubernetes
  ansible.builtin.import_playbook: playbooks/cluster.yml

전체 설치 흐름 요약

cluster.yml은 5개의 논리적 단계(A~E)로 구성되며, 각 단계는 명확한 목적을 가진다.

단계목적핵심 RolePLAY
A초기화 및 정보 수집validate_inventory, bootstrap_os, network_facts1~5
B인프라 및 엔진 준비kubernetes/preinstall, container-engine, download5
C데이터 저장소 및 노드 구성etcd, kubernetes/node6~9
D컨트롤 플레인 및 네트워크kubernetes/control-plane, kubernetes/kubeadm, network_plugin10~11
E부가 서비스 설치kubernetes-apps, metrics_server, helm12~15

cluster.yml 전체 구조와 PLAY 매핑

단계cluster.yml 섹션실행되는 PLAY대상 호스트
Aimport_playbook: boilerplate.ymlPLAY 1~3: Ansible 버전 확인, Inventory 검증, Bastion SSHlocalhost, all
Aimport_playbook: internal_facts.ymlPLAY 4~5: Bootstrap hosts, Gather factsall
BPrepare for etcd install(PLAY 5 계속) preinstall, container-engine, downloadk8s_cluster:etcd
Cimport_playbook: install_etcd.ymlPLAY 6~8: etcd 준비, worker 추가, etcd 설치etcd, k8s_cluster
CInstall Kubernetes nodesPLAY 9: K8s 노드 설치k8s_cluster
DInstall the control planePLAY 10: Control Plane 설치kube_control_plane
DInvoke kubeadm and install a CNIPLAY 11: kubeadm init/join, CNI 설치k8s_cluster
EInstall Calico Route ReflectorPLAY 12: Calico RR (선택)calico_rr
EPatch Kubernetes for WindowsPLAY 13: Windows 패치 (선택)kube_control_plane[0]
EInstall Kubernetes appsPLAY 14: 애드온 설치kube_control_plane
EApply resolv.conf changesPLAY 15: DNS 설정 정리k8s_cluster

PLAY 전체 목록 (14개)

순번PLAY 이름단계설명
1Check Ansible versionAKubespray 지원 Ansible 버전 확인 (2.17.3 <= version < 2.18.0)
2Inventory setup and validationAinventory 정합성 검증: kube_control_plane, etcd 그룹 존재 여부, etcd 홀수 노드, CIDR 유효성
3Install bastion ssh configABastion(점프 호스트) SSH 설정. 미사용 시 skip
4Bootstrap hosts for AnsibleA모든 노드를 Ansible 실행 가능 상태로 준비: Python, sudo, 기본 패키지
5Gather factsAAnsible fact 수집. 이후 조건 분기에 사용
6Prepare for etcd installCetcd user 생성, 디렉터리, 방화벽/포트, 인증서 경로 준비
7Add worker nodes to the etcd play if neededCkube_node + etcd 겸용 노드를 etcd PLAY에 추가
8Install etcdCetcd binary 설치, TLS 인증서 생성, systemd 등록, 클러스터 구성
9Install Kubernetes nodesC모든 노드에 kubelet 등 공통 컴포넌트 설치
10Install the control planeDcontrol-plane 노드 구성: kubeadm init, API server, scheduler
11Invoke kubeadm and install a CNIDkubeadm join, CNI 플러그인 설치
12Install Calico Route ReflectorECalico BGP RR 설정. Calico BGP 미사용 시 skip
13Patch Kubernetes for WindowsEWindows 노드 지원 패치. Linux-only 시 skip
14Install Kubernetes appsECoreDNS, metrics-server, Helm 등 애드온 설치
15Apply resolv.conf changes now that cluster DNS is upE클러스터 DNS 안정화 후 노드 DNS 설정 정리

cluster.yaml 관점 설치 흐름도

각 PLAY별로 각 노드(Master/Worker)와 영역(OS/Network/K8s)에서 변화 과정 추적

각 단계별 Master/Worker 노드의 3개 영역 업데이트 내용:

단계OS 영역Network 영역K8s 영역
APython, 기본 패키지, Facts 수집IP 정보 수집(없음)
Bswap 비활성화, sysctl, containerdip_forward, br_netfilter바이너리 다운로드
Cetcd 사용자, 인증서 디렉터리etcd 포트 2379/2380etcd 클러스터, kubelet, TLS
D/etc/kubernetes, 인증서 갱신 cronAPI Server :6443, CNI, Pod CIDRapiserver, controller, scheduler, kube-proxy
Eresolv.conf → CoreDNS, HelmCoreDNS 서비스, 클러스터 DNSCoreDNS Pod, metrics-server, ClusterRole

A. 초기화 및 정보 수집 (Boilerplate & Facts)

모든 노드에 공통적으로 필요한 설정을 적용하고, 각 서버의 사양 정보를 수집하여 이후 설치 단계에서 변수로 활용한다.

※ 보일러플레이트(Boilerplate)?

  • 컴퓨터 프로그래밍에서 최소한의 변경으로 여러 곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 표준화된 코드 블록

호출 구조

- name: Common tasks for every playbooks
  import_playbook: boilerplate.yml

- name: Gather facts
  import_playbook: internal_facts.yml

PLAY 1: Check Ansible version

순번RoleTASK 이름설명
1-Check 2.17.3 <= Ansible version < 2.18.0Ansible 버전 범위 검증
2-Check that python netaddr is installedPython netaddr 모듈 설치 확인
3-Check that jinja is not too old (install via pip)Jinja2 버전 확인

PLAY 2: Inventory setup and validation

순번RoleTASK 이름설명
4dynamic_groupsMatch needed groups by their old names or definition그룹 매칭 및 정의
5validate_inventoryStop if removed tags are used제거된 태그 사용 시 중지
6validate_inventoryStop if kube_control_plane group is emptycontrol-plane 그룹 비어있으면 중지
7validate_inventoryStop if etcd group is empty in external etcd mode외부 etcd 모드에서 etcd 그룹 비어있으면 중지
8validate_inventoryStop if unsupported version of Kubernetes지원하지 않는 K8s 버전이면 중지
9validate_inventoryStop if known booleans are set as stringsboolean 값이 문자열로 설정되면 중지
10validate_inventoryStop if even number of etcd hostsetcd 호스트가 짝수면 중지 (홀수 권장)
11validate_inventoryGuarantee that enough network address space is available for all podsPod용 네트워크 주소 공간 충분한지 확인
12validate_inventoryCheck that kube_service_addresses is a network rangeService CIDR이 네트워크 범위인지 확인
13validate_inventoryCheck that kube_pods_subnet is a network rangePod CIDR이 네트워크 범위인지 확인
14validate_inventoryCheck that kube_pods_subnet does not collide with kube_service_addressesPod/Service CIDR 충돌 확인
15validate_inventoryCheck that ipv4 IP range is enough for the nodesIPv4 범위가 노드에 충분한지 확인
16validate_inventoryStop if unsupported options selected지원하지 않는 옵션 선택 시 중지
17validate_inventoryEnsure minimum containerd versioncontainerd 최소 버전 확인

PLAY 3: Install bastion ssh config

Bastion(점프 호스트) 미사용 시 대부분 skip된다.

PLAY 4: Bootstrap hosts for Ansible

순번RoleTASK 이름설명
18bootstrap_osFetch /etc/os-releaseOS 릴리즈 정보 가져오기
19bootstrap_osInclude tasksOS별 태스크 포함
20bootstrap_osGather host facts to get ansible_distribution_version배포판 버전 정보 수집
21bootstrap_osAdd proxy to yum.conf or dnf.conf if http_proxy is defined프록시 설정 추가 (RedHat 계열)
22bootstrap_osCheck presence of fastestmirror.conffastestmirror 설정 확인
23system_packagesGather OS informationOS 정보 수집
24system_packagesRemove legacy docker repo file레거시 docker repo 파일 제거
25system_packagesManage packages패키지 관리
26bootstrap_osCreate remote_tmp for it is used by another moduleremote_tmp 디렉터리 생성
27bootstrap_osGather factsfact 수집
28bootstrap_osAssign inventory name to unconfigured hostnameshostname 미설정 시 inventory 이름 할당
29bootstrap_osEnsure bash_completion.d folder existsbash_completion.d 폴더 생성

PLAY 5: Gather facts

순번RoleTASK 이름설명
30network_factsGather ansible_default_ipv4기본 IPv4 정보 수집
31network_factsSet fallback_ipfallback IP 설정
32network_factsGather ansible_default_ipv6기본 IPv6 정보 수집
33network_factsSet fallback_ip6fallback IPv6 설정
34network_factsSet main access ip메인 접근 IP 설정 (IPv4/IPv6 스택 옵션 기반)
35network_factsSet main ip메인 IP 설정
36network_factsSet main access ips (mixed ips for dualstack)듀얼스택용 혼합 IP 설정
37network_factsSet main ips (mixed ips for dualstack)듀얼스택용 메인 IP 설정
38-Gather minimal facts최소 fact 수집
39-Gather necessary facts (network)네트워크 fact 수집
40-Gather necessary facts (hardware)하드웨어 fact 수집
41adduserUser | Create User Group사용자 그룹 생성
42adduserUser | Create User사용자 생성

B. 인프라 및 엔진 준비 (Prepare for etcd & container-engine)

방화벽, 커널 파라미터, Swap 비활성화 등 K8s 설치를 위한 OS 최적화를 수행하고, 컨테이너 런타임과 필요한 바이너리/이미지를 다운로드한다.

호출 구조

- name: Prepare for etcd install
  hosts: k8s_cluster:etcd
  gather_facts: false
  any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
  environment: "{{ proxy_disable_env }}"
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes/preinstall, tags: preinstall }
    - { role: "container-engine", tags: "container-engine", when: deploy_container_engine }
    - { role: download, tags: download, when: "not skip_downloads" }

Role별 주요 기능

Role기능주요 작업
kubespray_defaults공통 변수 로드Kubespray 전체에서 사용하는 경로, 버전 등 변수 로드
kubernetes/preinstallOS 최적화방화벽, 커널 파라미터, Swap 비활성화, 디렉터리 생성
container-engine컨테이너 런타임 설치containerd, runc, crictl, nerdctl 설치 및 설정
download바이너리/이미지 다운로드kubeadm, kubectl, kubelet, CNI, 컨테이너 이미지 다운로드

kubernetes/preinstall Role TASK

순번TASK 이름설명
43Check if /etc/fstab exists/etc/fstab 존재 확인
44Remove swapfile from /etc/fstabfstab에서 swap 항목 제거
45Mask swap.target (persist swapoff)swap.target 마스킹으로 swap 영구 비활성화
46Disable swapswap 비활성화
47Check resolvconfresolvconf 확인
48Check existence of /etc/resolvconf/resolv.conf.dresolvconf 디렉터리 존재 확인
49Check status of /etc/resolv.confresolv.conf 상태 확인
50Fetch resolv.confresolv.conf 가져오기
51NetworkManager | Check if host has NetworkManagerNetworkManager 존재 확인
52Check systemd-resolvedsystemd-resolved 확인
53Set default dns if remove_default_searchdomains is false기본 DNS 설정
54Set dns factsDNS fact 설정
55Check if kubelet is configuredkubelet 설정 여부 확인
56Check if early DNS configuration stage초기 DNS 설정 단계 확인
57Target resolv.conf filesresolv.conf 파일 대상 지정
58Check if /etc/dhclient.conf existsdhclient.conf 존재 확인
59Check if /etc/dhcp/dhclient.conf existsdhcp/dhclient.conf 존재 확인
60Target dhclient hook file for Red Hat familyRedHat용 dhclient hook 파일 지정
61Check /usr readonly/usr 읽기전용 확인
62Stop if non systemd OS typesystemd 아닌 OS면 중지
63Stop if the os does not support지원하지 않는 OS면 중지
64Stop if memory is too small for control plane nodescontrol-plane 노드 메모리 부족하면 중지
65Stop if memory is too small for nodes노드 메모리 부족하면 중지
66Stop if cgroups are not enabled on nodescgroups 미활성화면 중지
67Stop if ip var does not match local ipsIP 변수가 로컬 IP와 불일치하면 중지
68Stop if access_ip is not pingableaccess_ip에 ping 불가면 중지
69Stop if bad hostname잘못된 hostname이면 중지
70Stop if /etc/resolv.conf has no configured nameserversnameserver 미설정이면 중지
71Create kubernetes directorieskubernetes 디렉터리 생성
72Create other directories of root ownerroot 소유 기타 디렉터리 생성
73Check if kubernetes kubeadm compat cert dir existskubeadm 호환 인증서 디렉터리 존재 확인
74Create kubernetes kubeadm compat cert dirkubeadm 호환 인증서 디렉터리 생성
75Create cni directoriesCNI 디렉터리 생성
76NetworkManager | Ensure NetworkManager conf.d dirNetworkManager conf.d 디렉터리 확인
77NetworkManager | Prevent NetworkManager from managing K8S interfacesNetworkManager가 K8s 인터페이스 관리 방지
78NetworkManager | Add nameservers to NM configurationNetworkManager에 nameserver 추가
79Set default dns if remove_default_searchdomains is false기본 DNS 설정
80NetworkManager | Add DNS search to NM configurationNetworkManager에 DNS search 추가
81NetworkManager | Add DNS options to NM configurationNetworkManager에 DNS 옵션 추가
82Confirm selinux deployedSELinux 배포 확인
83Set selinux policySELinux 정책 설정
84Clean previously used sysctl file locations이전 sysctl 파일 위치 정리
85Stat sysctl file configurationsysctl 파일 설정 상태 확인
86Change sysctl file path to link source if linked심볼릭 링크면 소스 경로로 변경
87Make sure sysctl file path folder existssysctl 파일 경로 폴더 존재 확인
88Enable ip forwardingIP 포워딩 활성화
89Check if we need to set fs.may_detach_mountsfs.may_detach_mounts 설정 필요 여부 확인
90Ensure kubelet expected parameters are setkubelet 예상 파라미터 설정 확인
91Disable fapolicyd servicefapolicyd 서비스 비활성화
92Check if we are running inside a Azure VMAzure VM 내부 실행 여부 확인

container-engine Role TASK

순번서브 RoleTASK 이름설명
93validate-container-enginecheck if fedora coreosFedora CoreOS 확인
94validate-container-engineset is_ostreeis_ostree 설정
95validate-container-engineEnsure kubelet systemd unit existskubelet systemd unit 존재 확인
96validate-container-enginePopulate service facts서비스 fact 수집
97validate-container-engineCheck if containerd is installedcontainerd 설치 여부 확인
98validate-container-engineCheck if docker is installeddocker 설치 여부 확인
99validate-container-engineCheck if crio is installedcrio 설치 여부 확인
100containerd-commoncheck if fedora coreosFedora CoreOS 확인
101containerd-commonset is_ostreeis_ostree 설정
102runccheck if fedora coreosFedora CoreOS 확인
103runcset is_ostreeis_ostree 설정
104runcUninstall runc package managed by package manager패키지 관리자로 설치된 runc 제거
105runcDownload runc binaryrunc 바이너리 다운로드
106runcPrep_download | Set a few facts다운로드 준비 fact 설정
107runcDownload_file | Set pathname of cached file캐시 파일 경로 설정
108runcDownload_file | Create dest directory on node노드에 대상 디렉터리 생성
109runcDownload_file | Download item파일 다운로드
110runcDownload_file | Extract file archives파일 아카이브 추출
111runcCopy runc binary from download dir다운로드 디렉터리에서 runc 바이너리 복사
112runcRemove orphaned binary고아 바이너리 제거
113crictlInstall crictlcrictl 설치
114crictlDownload crictlcrictl 다운로드
115crictlPrep_download | Set a few facts다운로드 준비 fact 설정
116crictlDownload_file | Set pathname of cached file캐시 파일 경로 설정
117crictlDownload_file | Create dest directory on node노드에 대상 디렉터리 생성
118crictlDownload_file | Download item파일 다운로드
119crictlDownload_file | Extract file archives파일 아카이브 추출
120crictlExtract_file | Unpacking archive아카이브 압축 해제
121crictlInstall crictl configcrictl 설정 설치
122crictlCopy crictl binary from download dircrictl 바이너리 복사
123nerdctlDownload nerdctlnerdctl 다운로드
124nerdctlPrep_download | Set a few facts다운로드 준비 fact 설정
125nerdctlDownload_file | Set pathname of cached file캐시 파일 경로 설정
126nerdctlDownload_file | Create dest directory on node노드에 대상 디렉터리 생성
127nerdctlDownload_file | Download item파일 다운로드
128nerdctlDownload_file | Extract file archives파일 아카이브 추출
129nerdctlExtract_file | Unpacking archive아카이브 압축 해제
130nerdctlCopy nerdctl binary from download dirnerdctl 바이너리 복사
131nerdctlCreate configuration dirnerdctl 설정 디렉터리 생성
132nerdctlInstall nerdctl configurationnerdctl 설정 설치
133containerdDownload containerdcontainerd 다운로드
134containerdPrep_download | Set a few facts다운로드 준비 fact 설정
135containerdDownload_file | Set pathname of cached file캐시 파일 경로 설정
136containerdDownload_file | Create dest directory on node노드에 대상 디렉터리 생성
137containerdDownload_file | Download item파일 다운로드
138containerdDownload_file | Extract file archives파일 아카이브 추출
139containerdUnpack containerd archivecontainerd 아카이브 압축 해제
140containerdGenerate systemd service for containerdcontainerd.service 생성
141containerdEnsure containerd directories existcontainerd 디렉터리 존재 확인
142containerdGenerate default base_runtime_spec기본 base_runtime_spec 생성
143containerdStore generated default base_runtime_specbase_runtime_spec 저장
144containerdWrite base_runtime_specsbase_runtime_specs 작성
145containerdCopy containerd config filecontainerd config.toml 복사
146containerdCreate registry directories레지스트리 디렉터리 생성
147containerdWrite hosts.toml filehosts.toml 파일 작성
148containerdEnsure containerd is started and enabledcontainerd 시작 및 활성화

download Role TASK (주요 항목)

순번TASK 이름설명
149Prep_download | Set a few facts다운로드 준비 fact 설정
150Prep_download | Register docker images infodocker 이미지 정보 등록
151Prep_download | Create staging directory on remote node스테이징 디렉터리 생성
152Download | Get kubeadm binary and list of required imageskubeadm 및 필요 이미지 목록 가져오기
153Prep_kubeadm_images | Download kubeadm binarykubeadm 바이너리 다운로드
154Prep_kubeadm_images | Copy kubeadm binary to system pathkubeadm 시스템 경로로 복사
155Prep_kubeadm_images | Create kubeadm configkubeadm 설정 생성
156Prep_kubeadm_images | Generate list of required images필요 이미지 목록 생성
157Prep_kubeadm_images | Parse list of images이미지 목록 파싱
158Prep_kubeadm_images | Convert list of images to dict이미지 목록 dict 변환
159Download | Download files / images파일/이미지 다운로드 실행
160~(반복) Download_file / Download_container 시리즈kubectl, kubelet, CNI, helm 등 다운로드

다운로드 대상 바이너리:

바이너리설명
kubeadm클러스터 초기화 도구
kubectlCLI 클라이언트
kubelet노드 에이전트
CNI plugins네트워크 플러그인
calicoctlCalico CLI (Calico 사용 시)
etcdctl, etcdutletcd 관리 도구
helm패키지 매니저
crictlCRI 디버깅 도구

다운로드 대상 컨테이너 이미지:

이미지설명
kube-apiserverAPI 서버
kube-controller-manager컨트롤러 매니저
kube-scheduler스케줄러
kube-proxykube-proxy
pause인프라 컨테이너
coredns클러스터 DNS
flannel / calicoCNI 플러그인
metrics-server메트릭 서버
dns-node-cache노드 로컬 DNS 캐시

C. 데이터 저장소 및 노드 구성 (Etcd & K8s Nodes)

Kubernetes의 상태 정보를 저장하는 etcd 클러스터를 구축하고, 모든 노드에 kubelet 등 기초 컴포넌트를 설치한다.

호출 구조

- name: Install etcd
  vars:
    etcd_cluster_setup: true
    etcd_events_cluster_setup: "{{ etcd_events_cluster_enabled }}"
  import_playbook: install_etcd.yml

- name: Install Kubernetes nodes
  hosts: k8s_cluster
  gather_facts: false
  any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
  environment: "{{ proxy_disable_env }}"
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes/node, tags: node }

PLAY 6: Prepare for etcd install

순번RoleTASK 이름설명
251-Gathering Factsfact 수집
252-Check if nodes needs etcd client certs네트워크 플러그인에 따른 etcd 클라이언트 인증서 필요 여부
253adduserUser | Create User Groupetcd 사용자 그룹 생성
254adduserUser | Create Useretcd 사용자 생성

PLAY 7: Add worker nodes to the etcd play if needed

순번RoleTASK 이름설명
255adduserUser | Create User Group사용자 그룹 생성
256adduserUser | Create User사용자 생성

PLAY 8: Install etcd

순번RoleTASK 이름설명
257etcdCheck etcd certsetcd 인증서 확인
258etcdCheck_certs | Register certs on first etcd node첫 번째 etcd 노드에서 기존 인증서 등록
259etcdCheck_certs | Set default value for sync_certs, gen_certssync_certs, gen_certs 기본값 false 설정
260etcdCheck certs | Register ca and etcd admin/member certs on etcd hostsetcd 호스트에 CA 및 admin/member 인증서 등록
261etcdCheck certs | Register ca and etcd node certs on kubernetes hostskubernetes 호스트에 CA 및 노드 인증서 등록
262etcdCheck_certs | Set 'gen_certs' to true (1/2)인증서 없으면 gen_certs=true (1/2)
263etcdCheck_certs | Set 'gen_certs' to true (2/2)인증서 없으면 gen_certs=true (2/2)
264etcdCheckcerts | Set 'gen*_certs' groups인증서 생성 필요 노드 추적용 그룹 설정
265etcdCheck_certs | Set 'etcd_member_requires_sync'CA/member 인증서 없거나 체크섬 불일치 시 동기화 필요
266etcdCheck_certs | Set 'sync_certs' to truesync_certs=true 설정
267etcdGenerate etcd certsetcd 인증서 생성
268etcdGen_certs | create etcd cert diretcd 인증서 디렉터리 생성
269etcdGen_certs | create etcd script diretcd 스크립트 디렉터리 생성
270etcdGen_certs | write openssl configopenssl 설정 작성
271etcdGen_certs | copy certs generation script인증서 생성 스크립트 복사
272etcdGen_certs | run cert generation script for etcd and control planeetcd 및 control-plane용 인증서 생성
273etcdGen_certs | run cert generation script for all clients모든 클라이언트용 인증서 생성
274etcdGen_certs | check certificate permissions인증서 권한 확인
275etcdTrust etcd CAetcd CA 신뢰 설정
276etcdGen_certs | target ca-certificate store fileCA 인증서 저장소 파일 지정
277etcdGen_certs | add CA to trusted CA dir신뢰 CA 디렉터리에 CA 추가
278etcdGen_certs | update ca-certificates (RedHat)ca-certificates 업데이트
279etcdTrust etcd CA on nodes if needed필요시 노드에서 etcd CA 신뢰 설정
280etcdGen_certs | Get etcd certificate serialsetcd 인증서 시리얼 가져오기
281etcdSet etcd_client_cert_serialetcd_client_cert_serial 설정
282etcdctl_etcdutlDownload etcd binaryetcd 바이너리 다운로드
283etcdctl_etcdutlExtract_file | Unpacking archive아카이브 압축 해제
284etcdctl_etcdutlCopy etcd binaryetcd 바이너리 복사
285etcdctl_etcdutlCopy etcdctl and etcdutl binaryetcdctl, etcdutl 바이너리 복사
286etcdctl_etcdutlCreate etcdctl wrapper scriptetcdctl 래퍼 스크립트 생성
287etcdInstall etcdetcd 설치
288etcdGet currently-deployed etcd version현재 etcd 버전 확인
289etcdRestart etcd if necessary필요시 etcd 재시작
290etcdInstall | Copy etcd binary from download diretcd 바이너리 설치
291etcdConfigure etcdetcd 설정
292etcdConfigure | Check if etcd cluster is healthyetcd 클러스터 건강 상태 확인
293etcdConfigure | Refresh etcd configetcd 설정 새로고침
294etcdRefresh config | Create etcd config fileetcd 설정 파일 생성
295etcdConfigure | Copy etcd.service systemd fileetcd.service 파일 복사
296etcdConfigure | reload systemdsystemd 리로드
297etcdConfigure | Ensure etcd is runningetcd 실행 확인
298etcdConfigure | Wait for etcd cluster to be healthyetcd 클러스터 건강 대기
299etcdConfigure | Check if member is in etcd cluster멤버 클러스터 소속 확인
300etcdRefresh etcd configetcd 설정 새로고침
301etcdRefresh etcd config again for idempotency멱등성을 위해 재실행

etcd 인증서 처리 흐름

  1. 첫 번째 etcd 노드에서 인증서 존재 여부 확인
  2. 인증서 없으면 gen_certs 플래그 설정
  3. openssl config 작성 후 인증서 생성 스크립트 실행
  4. 생성 인증서: ca.crt/key, server.crt/key, peer.crt/key, admin.crt/key, member.crt/key
  5. CA 인증서를 신뢰 저장소에 추가
  6. 다른 노드에 동기화 필요 시 sync_certs 플래그 설정

PLAY 9: Install Kubernetes nodes

순번RoleTASK 이름설명
302kubernetes/nodeSet kubelet_cgroup_driver_detected fact for containerdcontainerd용 cgroup driver 감지
303kubernetes/nodeSet kubelet_cgroup_driverkubelet cgroup driver 설정
304kubernetes/nodeEnsure /var/lib/cni exists/var/lib/cni 존재 확인
305kubernetes/nodeInstall | Copy kubelet binary from download dirkubelet 바이너리 설치
306kubernetes/nodeEnsure nodePort range is reservednodePort 범위 예약 확인
307kubernetes/nodeVerify if br_netfilter module existsbr_netfilter 모듈 존재 확인
308kubernetes/nodeVerify br_netfilter module path existsbr_netfilter 모듈 경로 확인
309kubernetes/nodeEnable br_netfilter modulebr_netfilter 모듈 활성화
310kubernetes/nodePersist br_netfilter modulebr_netfilter 부팅 시 자동 로드
311kubernetes/nodeCheck if bridge-nf-call-iptables key existsbridge-nf-call-iptables 키 확인
312kubernetes/nodeEnable bridge-nf-call tablesbridge-nf-call 테이블 활성화
313kubernetes/nodeSet kubelet api version to v1beta1kubelet API 버전 설정
314kubernetes/nodeWrite kubelet environment config file (kubeadm)kubelet 환경 설정 파일 작성
315kubernetes/nodeWrite kubelet config filekubelet 설정 파일 작성
316kubernetes/nodeWrite kubelet systemd init filekubelet.service 파일 작성
317kubernetes/nodeEnable kubeletkubelet 서비스 활성화

D. 컨트롤 플레인 및 네트워크 (Control Plane & CNI)

마스터 노드에 API 서버, 스케줄러 등을 설정하고, kubeadm으로 클러스터를 구성하며, CNI를 설치하여 파드 간 통신을 가능하게 한다.

호출 구조

- name: Install the control plane
  hosts: kube_control_plane
  gather_facts: false
  any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
  environment: "{{ proxy_disable_env }}"
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes/control-plane, tags: control-plane }
    - { role: kubernetes/client, tags: client }
    - { role: kubernetes-apps/cluster_roles, tags: cluster-roles }

- name: Invoke kubeadm and install a CNI
  hosts: k8s_cluster
  gather_facts: false
  any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
  environment: "{{ proxy_disable_env }}"
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes/kubeadm, tags: kubeadm }
    - { role: kubernetes/node-label, tags: node-label }
    - { role: kubernetes/node-taint, tags: node-taint }
    - { role: kubernetes-apps/common_crds }
    - { role: network_plugin, tags: network }

PLAY 10: Install the control plane

순번RoleTASK 이름설명
318kubernetes/control-planePre-upgrade | Delete control plane manifests if etcd secrets changedetcd 시크릿 변경 시 매니페스트 삭제
319kubernetes/control-planeCreate kube-scheduler configkube-scheduler 설정 생성
320kubernetes/control-planeInstall | Copy kubectl binary from download dirkubectl 설치
321kubernetes/control-planeInstall kubectl bash completionkubectl 자동완성 설치
322kubernetes/control-planeSet kubectl bash completion file permissions파일 권한 설정
323kubernetes/control-planeCheck which kube-control nodes are already members기존 클러스터 멤버 확인
324kubernetes/control-planeSet fact first_kube_control_plane첫 번째 control-plane 노드 설정
325kubernetes/control-planeKubeadm | Check if kubeadm has already runkubeadm 실행 여부 확인
326kubernetes/control-planeKubeadm | aggregate all SANs인증서 SAN 목록 집계
327kubernetes/control-planeKubeadm | Create kubeadm configkubeadm 설정 파일 생성
328kubernetes/control-planeKubeadm | Initialize first control plane node (1st try)kubeadm init 실행
329kubernetes/control-planeCreate kubeadm token for joining nodes with 24h expirationjoin 토큰 생성 (24시간 만료)
330kubernetes/control-planeSet kubeadm_tokenkubeadm_token 설정
331kubernetes/control-planeKubeadm | Join other control plane nodes다른 control-plane 노드 join
332kubernetes/control-planeSet kubeadm_discovery_addresskubeadm_discovery_address 설정
333kubernetes/control-planeUpload certificates so they are fresh and not expired인증서 업로드
334kubernetes/control-planeParse certificate key if not set인증서 키 파싱
335kubernetes/control-planeWait for k8s apiserverAPI 서버 대기
336kubernetes/control-planeCheck already run실행 완료 확인
337kubernetes/control-planeKubeadm | Remove taint for control plane node with node roletaint 제거 (필요시)
338kubernetes/control-planeInclude kubeadm secondary server apiserver fixes보조 서버 apiserver 수정
339kubernetes/control-planeUpdate server field in component kubeconfigs컴포넌트 kubeconfig server 필드 업데이트
340kubernetes/control-planeInclude kubelet client cert rotation fixeskubelet 인증서 rotation 수정
341kubernetes/control-planeFixup kubelet client cert rotation 1/2rotation 수정 1/2
342kubernetes/control-planeFixup kubelet client cert rotation 2/2rotation 수정 2/2
343kubernetes/control-planeInstall script to renew K8S control plane certificates인증서 갱신 스크립트 설치
344kubernetes/control-planeRenew K8S control plane certificates monthly 1/2월간 인증서 갱신 1/2
345kubernetes/control-planeRenew K8S control plane certificates monthly 2/2월간 인증서 갱신 2/2
346kubernetes/clientSet external kube-apiserver endpoint외부 API 서버 엔드포인트 설정
347kubernetes/clientCreate kube config dir~/.kube 디렉터리 생성
348kubernetes/clientCopy admin kubeconfig to user homeadmin.conf를 ~/.kube/config로 복사
349kubernetes/clientWait for k8s apiserverAPI 서버 대기
350kubernetes-apps/cluster_rolesKubernetes Apps | Wait for kube-apiserverAPI 서버 대기
351kubernetes-apps/cluster_rolesAdd ClusterRoleBinding to admit nodes노드 승인용 ClusterRoleBinding 추가
352kubernetes-apps/cluster_rolesApply workaround to allow all nodes with cert O=system:nodes노드 등록 워크어라운드
353kubernetes-apps/cluster_rolesRemove old webhook ClusterRole이전 webhook ClusterRole 제거
354kubernetes-apps/cluster_rolesRemove old webhook ClusterRoleBinding이전 webhook ClusterRoleBinding 제거
355kubernetes-apps/cluster_rolesPriorityClass | Copy k8s-cluster-critical-pc.ymlPriorityClass 파일 복사
356kubernetes-apps/cluster_rolesPriorityClass | Create k8s-cluster-criticalPriorityClass 생성

PLAY 11: Invoke kubeadm and install a CNI

순번RoleTASK 이름설명
357kubernetes/kubeadmSet kubeadm_discovery_addressdiscovery 주소 설정
358kubernetes/kubeadmCheck if kubelet.conf existskubelet.conf 존재 확인
359kubernetes/kubeadmCheck if kubeadm CA cert is accessiblekubeadm CA 인증서 접근 확인
360kubernetes/kubeadmFetch CA certificate from control plane nodeCA 인증서 가져오기
361kubernetes/kubeadmCheck if discovery kubeconfig existsdiscovery kubeconfig 존재 확인
362kubernetes/kubeadmGet current resourceVersion of kube-proxy configmapkube-proxy configmap resourceVersion
363kubernetes/kubeadmUpdate server field in kube-proxy kubeconfigkube-proxy kubeconfig server 필드 업데이트
364kubernetes/kubeadmGet new resourceVersion of kube-proxy configmap새 resourceVersion 확인
365kubernetes/kubeadmSet ca.crt file permissionca.crt 파일 권한 설정
366kubernetes/kubeadmRestart all kube-proxy podskube-proxy pod 재시작
367kubernetes/node-labelKubernetes Apps | Wait for kube-apiserverAPI 서버 대기
368kubernetes/node-labelSet role node label to empty listrole 노드 레이블 초기화
369kubernetes/node-labelSet inventory node label to empty listinventory 노드 레이블 초기화
370kubernetes/node-taintSet role and inventory node taint to empty listtaint 초기화
371network_plugin/cniCNI | make sure /opt/cni/bin exists/opt/cni/bin 존재 확인
372network_plugin/cniCNI | Copy cni pluginsCNI 플러그인 복사
373network_plugin/flannelFlannel | Create Flannel manifestsFlannel 매니페스트 생성
374network_plugin/flannelFlannel | Start ResourcesFlannel DaemonSet 배포
375network_plugin/flannelFlannel | Wait for flannel subnet.env file presencesubnet.env 파일 대기

E. 부가 서비스 설치 (Apps & DNS)

Ingress Controller, Storage Provisioner 등 클러스터 운영에 필요한 앱들을 배포하고, 최종적으로 노드의 DNS가 클러스터 내부 DNS를 바라보도록 수정한다.

호출 구조

- name: Install Calico Route Reflector
  hosts: calico_rr
  roles:
    - { role: network_plugin/calico/rr, tags: ['network', 'calico_rr'] }

- name: Patch Kubernetes for Windows
  hosts: kube_control_plane[0]
  roles:
    - { role: win_nodes/kubernetes_patch, tags: ["control-plane", "win_nodes"] }

- name: Install Kubernetes apps
  hosts: kube_control_plane
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes-apps/external_cloud_controller, tags: external-cloud-controller }
    - { role: kubernetes-apps/policy_controller, tags: policy-controller }
    - { role: kubernetes-apps/ingress_controller, tags: ingress-controller }
    - { role: kubernetes-apps/external_provisioner, tags: external-provisioner }
    - { role: kubernetes-apps, tags: apps }

- name: Apply resolv.conf changes now that cluster DNS is up
  hosts: k8s_cluster
  roles:
    - { role: kubespray_defaults }
    - { role: kubernetes/preinstall, when: "dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'", tags: resolvconf, dns_late: true }

PLAY 12: Install Calico Route Reflector

Calico BGP 미사용 환경이면 skip된다.

PLAY 13: Patch Kubernetes for Windows

순번RoleTASK 이름설명
376win_nodes/kubernetes_patchEnsure that user manifests directory exists사용자 매니페스트 디렉터리 확인
377win_nodes/kubernetes_patchCheck current nodeselector for kube-proxy daemonsetkube-proxy nodeselector 확인
378win_nodes/kubernetes_patchApply nodeselector patch for kube-proxy daemonsetnodeselector 패치 적용

Linux-only 환경이면 skip된다.

PLAY 14: Install Kubernetes apps

순번RoleTASK 이름설명
379kubernetes-apps/ansibleKubernetes Apps | Wait for kube-apiserverAPI 서버 대기
380kubernetes-apps/ansibleKubernetes Apps | CoreDNSCoreDNS 배포
381kubernetes-apps/helmHelm | Gather os specific variablesOS별 변수 수집
382kubernetes-apps/helmHelm | Install PyYamlPyYaml 설치
383kubernetes-apps/helmHelm | Download helmhelm 다운로드
384kubernetes-apps/helmPrep_download | Set a few facts다운로드 준비
385kubernetes-apps/helmDownload_file | Download itemhelm 다운로드
386kubernetes-apps/helmExtract_file | Unpacking archive아카이브 압축 해제
387kubernetes-apps/helmHelm | Copy helm binary from download dirhelm 설치
388kubernetes-apps/helmHelm | Get helm completionhelm completion 가져오기
389kubernetes-apps/helmHelm | Install helm completionhelm 자동완성 설치
390kubernetes-apps/metrics_serverMetrics Server | Delete addon dir애드온 디렉터리 삭제
391kubernetes-apps/metrics_serverMetrics Server | Create addon dir애드온 디렉터리 생성
392kubernetes-apps/metrics_serverMetrics Server | Templates list템플릿 목록
393kubernetes-apps/metrics_serverMetrics Server | Create manifests매니페스트 생성
394kubernetes-apps/metrics_serverMetrics Server | Apply manifestsmetrics-server 배포

kubernetes-apps Role별 기능

Role기능설명
external_cloud_controller클라우드 컨트롤러cloud-controller-manager 외부 실행 (베어메탈은 비활성)
policy_controller정책 컨트롤러PodSecurity Admission, OPA/Gatekeeper 연계
ingress_controllerIngress 컨트롤러NGINX Ingress, HAProxy Ingress, Traefik 등
external_provisioner스토리지 프로비저너CSI provisioner, NFS provisioner, Ceph 등
kubernetes-apps핵심 앱CoreDNS, Metrics Server, Local Path Provisioner, Helm

PLAY 15: Apply resolv.conf changes now that cluster DNS is up

순번RoleTASK 이름설명
395adduserUser | Create User Group사용자 그룹 생성
396adduserUser | Create User사용자 생성
397kubernetes/preinstallCheck resolvconfresolvconf 확인
398kubernetes/preinstallCheck existence of /etc/resolvconf/resolv.conf.d디렉터리 존재 확인
399kubernetes/preinstallCheck status of /etc/resolv.confresolv.conf 상태 확인
400kubernetes/preinstallFetch resolv.confresolv.conf 가져오기
401kubernetes/preinstallNetworkManager | Check if host has NetworkManagerNetworkManager 확인
402kubernetes/preinstallCheck systemd-resolvedsystemd-resolved 확인
403kubernetes/preinstallSet default dns기본 DNS 설정
404kubernetes/preinstallSet dns factsDNS fact 설정
405kubernetes/preinstallCheck if kubelet is configuredkubelet 설정 확인
406kubernetes/preinstallCheck if early DNS configuration stageDNS 설정 단계 확인
407kubernetes/preinstallTarget resolv.conf filesresolv.conf 대상 지정
408kubernetes/preinstallNetworkManager | Ensure NetworkManager conf.d dirconf.d 디렉터리 확인
409kubernetes/preinstallNetworkManager | Prevent NetworkManager from managing K8S interfacesK8s 인터페이스 관리 방지
410kubernetes/preinstallNetworkManager | Add nameservers to NM configurationCoreDNS IP를 nameserver로 추가
411kubernetes/preinstallNetworkManager | Add DNS search to NM configuration클러스터 도메인을 search에 추가
412kubernetes/preinstallNetworkManager | Add DNS options to NM configurationDNS 옵션 추가

Role별 TASK 수 분포

RoleTASK 수 (대략)단계주요 기능
download~150B바이너리/이미지 다운로드 (가장 많음)
kubernetes/preinstall~50A, B, E시스템 사전 설정, swap, sysctl
container-engine/*~55Bcontainerd, runc, crictl, nerdctl
etcd~55Cetcd 인증서 생성, 클러스터 구성
kubernetes/control-plane~30Dkubeadm init, control-plane 구성
kubernetes/node~15Ckubelet 설치, br_netfilter
kubernetes/kubeadm~12Dworker join, kube-proxy 설정
network_plugin/*~8DCNI 플러그인 (Flannel/Calico)
kubernetes-apps/*~20ECoreDNS, metrics-server, Helm
validate_inventory~13Ainventory 검증
bootstrap_os~12AOS 부트스트랩
adduser~8A, C, E사용자/그룹 생성

정리

Kubespray는 559개의 TASK를 14개 PLAY로 구조화하여 실행한다.

핵심 포인트:

  1. download Role이 가장 많은 TASK 차지 - 바이너리와 컨테이너 이미지 다운로드가 핵심
  2. 검증 TASK가 많음 - 설치 실패를 사전에 방지하기 위한 철저한 검증
  3. 멱등성 보장 - 동일 TASK 반복 실행해도 결과 동일하도록 설계
  4. 조건부 실행 - bastion, Windows, Calico 등 환경에 따라 skip 처리

각 단계의 Role과 TASK를 이해하면 설치 실패 시 로그에서 문제 지점을 빠르게 파악할 수 있다.

profile
bytebliss

0개의 댓글