[kubespray] Ansible Playbook & Role 분석

진웅·2026년 1월 29일

k8s deploy

목록 보기
12/20

Kubespray Ansible Playbook & Role 분석

  • Kubespray로 Kubernetes 클러스터를 배포할 때 내부적으로 어떤 과정이 진행되는지 분석해본다.
  • 총 14개의 PLAY와 559개의 TASK가 순차적으로 실행되며, 크게 4단계로 구분할 수 있다.

전체 설치 흐름 요약

Kubespray 설치 과정은 다음 4단계로 진행된다.

단계목적주요 작업
1단계사전 준비 및 검증Ansible 버전 확인, inventory 검증, bastion 설정, 노드 부트스트랩, fact 수집
2단계etcd 클러스터 구축etcd 사전 준비, worker 노드 추가, etcd 설치 및 클러스터 구성
3단계Kubernetes 코어 설치노드 컴포넌트 설치, control-plane 구성, kubeadm init/join, CNI 설치
4단계부가 서비스 설치Calico RR, Windows 패치, 애드온(CoreDNS, metrics-server), DNS 설정 정리

1단계: 사전 준비 및 검증

클러스터 배포 전 환경을 검증하고 노드를 준비하는 단계다.

주요 PLAY 목록

PLAY설명
Check Ansible versionKubespray가 지원하는 Ansible 버전인지 확인 (2.17.3 <= version < 2.18.0)
Inventory setup and validationinventory 설정 검증: kube_control_plane, etcd 그룹 존재 여부, etcd 노드 수(홀수 권장), Pod/Service CIDR 유효성
Install bastion ssh configBastion(점프 호스트) 환경 지원. 미사용 시 skip
Bootstrap hosts for Ansible모든 노드를 Ansible 실행 가능 상태로 준비: Python 설치, sudo 권한, 기본 패키지
Gather factsAnsible fact 수집. 이후 조건 분기(예: when: ansible_os_family == "Debian")에 사용

핵심 Role

  • dynamic_groups: 그룹 매칭 및 정의
  • validate_inventory: inventory 정합성 검증
  • bootstrap_os: OS별 초기화 (패키지 설치, hostname 설정)
  • network_facts: 네트워크 정보 수집 (IP, fallback 설정)
  • kubernetes/preinstall: swap 비활성화, 디렉터리 생성, sysctl 설정, NetworkManager 설정

2단계: etcd 클러스터 구축

Kubernetes의 상태 저장소인 etcd를 설치하고 클러스터를 구성하는 단계다.

주요 PLAY 목록

PLAY설명
Prepare for etcd installetcd user 생성, 디렉터리 생성, 방화벽/포트, 인증서 경로 준비
Add worker nodes to etcd playkube_node + etcd 겸용 노드를 etcd PLAY에 추가
Install etcdetcd binary 설치, TLS 인증서 생성, systemd 등록, 클러스터 구성

핵심 Role

  • adduser: etcd 전용 사용자/그룹 생성
  • etcd: 인증서 생성 및 검증, etcd 바이너리 설치, 클러스터 구성
  • etcdctl_etcdutl: etcdctl, etcdutl 바이너리 설치 및 wrapper 스크립트 생성

etcd 인증서 처리 흐름

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


3단계: Kubernetes 코어 설치

kubelet, kubectl, control-plane 컴포넌트를 설치하고 클러스터를 초기화하는 단계다.

주요 PLAY 목록

PLAY설명
Install Kubernetes nodes모든 노드에 공통 K8s 컴포넌트 설치 (kubelet). 클러스터 join은 아직 안 함
Install the control planecontrol-plane 노드 구성: kubeadm init, 인증서, 토큰 생성
Invoke kubeadm and install a CNIkubeadm join 실행, CNI 플러그인 설치

핵심 Role

  • container-engine: containerd, runc, crictl, nerdctl 설치 및 설정
  • download: 바이너리 및 컨테이너 이미지 다운로드
  • kubernetes/node: kubelet 설치, cgroup driver 설정, br_netfilter 활성화
  • kubernetes/control-plane: kubeadm init/join, kubectl 설치, 인증서 갱신 cron 설정
  • kubernetes/client: kubeconfig 복사, API 서버 대기
  • kubernetes-apps/cluster_roles: ClusterRole, PriorityClass 생성
  • kubernetes/kubeadm: worker 노드 join, kube-proxy 설정
  • network_plugin/cni: CNI 플러그인 복사
  • network_plugin/flannel: Flannel 매니페스트 생성 및 배포

kubeadm 초기화 흐름

  1. 첫 번째 control-plane 노드에서 kubeadm init 실행
  2. join 토큰 생성 (24시간 만료)
  3. 다른 control-plane 노드 join
  4. 인증서 업로드 및 키 파싱
  5. API 서버 대기 후 taint 제거 (필요시)

4단계: 부가 서비스 및 최적화

애드온 설치 및 최종 설정을 정리하는 단계다.

주요 PLAY 목록

PLAY설명
Install Calico Route ReflectorCalico BGP 미사용 환경이면 skip
Patch Kubernetes for WindowsLinux-only 환경이면 skip
Install Kubernetes apps기본 애드온 설치: CoreDNS, metrics-server
Apply resolv.conf changes클러스터 DNS 안정화 후 노드 DNS 설정 최종 정리

핵심 Role

  • kubernetes-apps/ansible: CoreDNS 배포
  • kubernetes-apps/helm: Helm 바이너리 설치 및 completion 설정
  • kubernetes-apps/metrics_server: metrics-server 매니페스트 생성 및 배포
  • win_nodes/kubernetes_patch: kube-proxy daemonset에 nodeSelector 패치
  • kubernetes/preinstall: (재실행) resolv.conf 최종 정리

TASK 통계

# 전체 TASK 수
cat kubespray_install.log | grep -E 'TASK' | wc -l
559

# PLAY 목록 확인
cat kubespray_install.log | grep -E 'PLAY'

주요 Role별 TASK 분포

Role주요 기능
download바이너리/이미지 다운로드 (가장 많은 TASK)
kubernetes/preinstall시스템 사전 설정
container-engine컨테이너 런타임 설치
etcdetcd 클러스터 구성
kubernetes/control-planecontrol-plane 초기화

설치 흐름도

설치 흐름도


Kubespray Ansible PLAY & TASK 전체 상세 분석

Kubespray 설치 로그에서 추출한 모든 PLAY와 TASK를 정리했다. 총 14개 PLAY, 559개 TASK가 순차 실행된다.


PLAY 전체 목록 (14개)

순번PLAY 이름단계설명
1Check Ansible version1단계Kubespray가 지원하는 Ansible 버전인지 확인 (2.17.3 <= version < 2.18.0)
2Inventory setup and validation1단계inventory 설정 정합성 검증. kube_control_plane, etcd 그룹 존재 여부, etcd 노드 수(홀수 권장), Pod CIDR / Service CIDR 유효성, Kubernetes 버전 지원 여부 확인
3Install bastion ssh config1단계Bastion(점프 호스트) 환경 지원. SSH 프록시 설정. bastion 미사용 시 대부분 skip
4Bootstrap hosts for Ansible1단계모든 노드를 Ansible 실행 가능한 상태로 준비. Python 설치, sudo 권한 확보, 기본 패키지 설치, /usr/bin/python 보장
5Gather facts1단계Ansible fact 수집. 이후 TASK들이 when: ansible_os_family == "Debian" 같은 조건 분기에서 사용
6Prepare for etcd install2단계etcd 설치 전 사전 준비. etcd user 생성, 디렉터리 생성, 방화벽/포트 설정, 인증서 경로 준비
7Add worker nodes to the etcd play if needed2단계worker + etcd 겸용 노드 지원. kube_node와 etcd 둘 다 포함된 노드를 etcd PLAY에 추가
8Install etcd2단계etcd 설치 실행. etcd binary 설치, TLS 인증서 생성, systemd 등록, 클러스터 구성
9Install Kubernetes nodes3단계모든 노드에 공통 K8s 컴포넌트 설치. kubelet, container runtime 등. 아직 클러스터 join은 안 함
10Install the control plane3단계kube_control_plane 그룹 대상 control-plane 노드 구성. kubeadm init, API server, scheduler, controller-manager 설정
11Invoke kubeadm and install a CNI3단계kubeadm init/join 실행, 네트워크 플러그인(CNI) 설치. worker 노드 join 포함
12Install Calico Route Reflector4단계Calico BGP Route Reflector 설정. Calico BGP 미사용 환경이면 skip
13Patch Kubernetes for Windows4단계Windows 노드 지원 패치. Linux-only 환경이면 skip
14Install Kubernetes apps4단계기본 애드온 설치. CoreDNS, metrics-server, Helm 등
15Apply resolv.conf changes now that cluster DNS is up4단계CoreDNS 설치 후 노드의 DNS 설정 최종 정리. bootstrap 단계에선 임시 resolv.conf 사용했다가 클러스터 DNS 안정화 후 되돌림

TASK 전체 목록 (559개)

1단계: 사전 준비 및 검증

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

Container Engine 설치

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

Download Role (바이너리 및 컨테이너 이미지 다운로드)

순번RoleTASK 이름설명
149downloadPrep_download | Set a few facts다운로드 준비 fact 설정
150downloadPrep_download | Register docker images infodocker 이미지 정보 등록
151downloadPrep_download | Create staging directory on remote node원격 노드에 스테이징 디렉터리 생성
152downloadDownload | Get kubeadm binary and list of required imageskubeadm 바이너리 및 필요 이미지 목록 가져오기
153downloadPrep_kubeadm_images | Download kubeadm binarykubeadm 바이너리 다운로드
154-162downloadPrep_download / Download_file 시리즈파일 다운로드 반복 작업
163downloadPrep_kubeadm_images | Copy kubeadm binary from download dir to system pathkubeadm 바이너리를 시스템 경로로 복사
164downloadPrep_kubeadm_images | Create kubeadm configkubeadm 설정 생성
165downloadPrep_kubeadm_images | Generate list of required images필요 이미지 목록 생성
166downloadPrep_kubeadm_images | Parse list of images이미지 목록 파싱
167downloadPrep_kubeadm_images | Convert list of images to dict for later use이미지 목록을 dict로 변환
168downloadDownload | Download files / images파일/이미지 다운로드
169-250download반복되는 다운로드 TASK들kubectl, kubelet, calicoctl, CNI plugins, cni, helm 등 다운로드

다운로드 대상 바이너리:

  • kubeadm, kubectl, kubelet
  • CNI plugins
  • calicoctl (Calico 사용 시)
  • etcdctl, etcdutl
  • helm
  • cri-tools (crictl)

다운로드 대상 컨테이너 이미지 (기본 구성 기준):

순번이미지설명
1kube-apiserverAPI 서버
2kube-controller-manager컨트롤러 매니저
3kube-scheduler스케줄러
4kube-proxykube-proxy
5pause인프라 컨테이너
6coredns클러스터 DNS
7flannel (또는 calico)CNI 플러그인
8metrics-server메트릭 서버
9dns-node-cache노드 로컬 DNS 캐시
10nginx-ingress-controllerIngress 컨트롤러 (선택)
11etcdetcd (컨테이너 모드 시)

2단계: etcd 클러스터 구축

PLAY 6: Prepare for etcd install

순번RoleTASK 이름설명
251-Gathering Factsfact 수집
252-Check if nodes needs etcd client certs (depends on network_plugin)네트워크 플러그인에 따른 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 that have already been generated on first etcd node첫 번째 etcd 노드에서 이미 생성된 인증서 등록
259etcdCheck_certs | Set default value for 'sync_certs', 'gen_certs' and 'etcd_secret_changed' to falsesync_certs, gen_certs, etcd_secret_changed 기본값 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 if expected certificates are not on the first etcd node(1/2)첫 번째 etcd 노드에 예상 인증서 없으면 gen_certs=true (1/2)
263etcdCheck_certs | Set 'gen_certs' to true if expected certificates are not on the first etcd node(2/2)첫 번째 etcd 노드에 예상 인증서 없으면 gen_certs=true (2/2)
264etcdCheckcerts | Set 'gen*_certs' groups to track which nodes needs to have certs generated on first etcd node인증서 생성 필요 노드 추적용 그룹 설정
265etcdCheck_certs | Set 'etcd_member_requires_sync' to true if ca or member/admin cert and key don't exist on etcd member or checksum doesn't matchCA 또는 member/admin 인증서가 없거나 체크섬 불일치하면 동기화 필요
266etcdCheck_certs | Set 'sync_certs' to truesync_certs=true 설정
267etcdGenerate etcd certsetcd 인증서 생성
268etcdGen_certs | create etcd cert diretcd 인증서 디렉터리 생성
269etcdGen_certs | create etcd script dir (on k8s-ctr1)etcd 스크립트 디렉터리 생성 (첫 번째 control-plane)
270etcdGen_certs | write openssl configopenssl 설정 작성
271etcdGen_certs | copy certs generation script인증서 생성 스크립트 복사
272etcdGen_certs | run cert generation script for etcd and kube control plane nodesetcd 및 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 업데이트 (RedHat)
279etcdTrust etcd CA on nodes if needed필요시 노드에서 etcd CA 신뢰 설정
280etcdGen_certs | target ca-certificate store fileCA 인증서 저장소 파일 대상 지정
281etcdGen_certs | add CA to trusted CA dir신뢰 CA 디렉터리에 CA 추가
282etcdGen_certs | Get etcd certificate serialsetcd 인증서 시리얼 가져오기
283etcdSet etcd_client_cert_serialetcd_client_cert_serial 설정
284etcdctl_etcdutlDownload etcd binaryetcd 바이너리 다운로드
285-292etcdctl_etcdutlPrep_download / Download_file 시리즈다운로드 관련 작업
293etcdctl_etcdutlExtract_file | Unpacking archive아카이브 압축 해제
294etcdctl_etcdutlCopy etcd binaryetcd 바이너리 복사
295etcdctl_etcdutlCopy etcdctl and etcdutl binary from download diretcdctl, etcdutl 바이너리 복사
296etcdctl_etcdutlCreate etcdctl wrapper scriptetcdctl 래퍼 스크립트 생성
297etcdInstall etcdetcd 설치
298etcdGet currently-deployed etcd version현재 배포된 etcd 버전 가져오기
299etcdRestart etcd if necessary필요시 etcd 재시작
300etcdInstall | Copy etcd binary from download dir다운로드 디렉터리에서 etcd 바이너리 복사
301etcdConfigure etcdetcd 설정
302etcdConfigure | Check if etcd cluster is healthyetcd 클러스터 건강 상태 확인
303etcdConfigure | Refresh etcd configetcd 설정 새로고침
304etcdRefresh config | Create etcd config fileetcd 설정 파일 생성
305etcdConfigure | Copy etcd.service systemd fileetcd.service systemd 파일 복사
306etcdConfigure | reload systemdsystemd 리로드
307etcdConfigure | Ensure etcd is runningetcd 실행 중인지 확인
308etcdConfigure | Wait for etcd cluster to be healthyetcd 클러스터 건강해질 때까지 대기
309etcdConfigure | Check if member is in etcd cluster멤버가 etcd 클러스터에 있는지 확인
310etcdRefresh etcd configetcd 설정 새로고침
311etcdRefresh config | Create etcd config fileetcd 설정 파일 생성
312etcdRefresh etcd config again for idempotency멱등성을 위해 etcd 설정 다시 새로고침
313etcdRefresh config | Create etcd config fileetcd 설정 파일 생성

3단계: Kubernetes 코어 설치

PLAY 9: Install Kubernetes nodes

순번RoleTASK 이름설명
314kubernetes/nodeSet kubelet_cgroup_driver_detected fact for containerdcontainerd용 kubelet cgroup driver fact 설정
315kubernetes/nodeSet kubelet_cgroup_driverkubelet cgroup driver 설정
316kubernetes/nodeEnsure /var/lib/cni exists/var/lib/cni 존재 확인
317kubernetes/nodeInstall | Copy kubelet binary from download dir다운로드 디렉터리에서 kubelet 바이너리 복사
318kubernetes/nodeEnsure nodePort range is reservednodePort 범위 예약 확인
319kubernetes/nodeVerify if br_netfilter module existsbr_netfilter 모듈 존재 확인
320kubernetes/nodeVerify br_netfilter module path existsbr_netfilter 모듈 경로 존재 확인
321kubernetes/nodeEnable br_netfilter modulebr_netfilter 모듈 활성화
322kubernetes/nodePersist br_netfilter modulebr_netfilter 모듈 영구 설정
323kubernetes/nodeCheck if bridge-nf-call-iptables key existsbridge-nf-call-iptables 키 존재 확인
324kubernetes/nodeEnable bridge-nf-call tablesbridge-nf-call 테이블 활성화
325kubernetes/nodeSet kubelet api version to v1beta1kubelet API 버전 v1beta1 설정
326kubernetes/nodeWrite kubelet environment config file (kubeadm)kubelet 환경 설정 파일 작성 (kubeadm)
327kubernetes/nodeWrite kubelet config filekubelet 설정 파일 작성
328kubernetes/nodeWrite kubelet systemd init filekubelet systemd init 파일 작성
329kubernetes/nodeEnable kubeletkubelet 활성화

PLAY 10: Install the control plane

순번RoleTASK 이름설명
330kubernetes/control-planePre-upgrade | Delete control plane manifests if etcd secrets changedetcd 시크릿 변경 시 control-plane 매니페스트 삭제
331kubernetes/control-planeCreate kube-scheduler configkube-scheduler 설정 생성
332kubernetes/control-planeInstall | Copy kubectl binary from download dir다운로드 디렉터리에서 kubectl 바이너리 복사
333kubernetes/control-planeInstall kubectl bash completionkubectl bash completion 설치
334kubernetes/control-planeSet kubectl bash completion file permissionskubectl bash completion 파일 권한 설정
335kubernetes/control-planeCheck which kube-control nodes are already members of the cluster이미 클러스터 멤버인 kube-control 노드 확인
336kubernetes/control-planeSet fact first_kube_control_planefirst_kube_control_plane fact 설정
337kubernetes/control-planeKubeadm | Check if kubeadm has already runkubeadm 이미 실행됐는지 확인
338kubernetes/control-planeKubeadm | aggregate all SANs모든 SAN 집계
339kubernetes/control-planeKubeadm | Create kubeadm configkubeadm 설정 생성
340kubernetes/control-planeKubeadm | Initialize first control plane node (1st try)첫 번째 control-plane 노드 초기화 (1차 시도)
341kubernetes/control-planeCreate kubeadm token for joining nodes with 24h expiration (default)노드 join용 kubeadm 토큰 생성 (24시간 만료)
342kubernetes/control-planeSet kubeadm_tokenkubeadm_token 설정
343kubernetes/control-planeKubeadm | Join other control plane nodes다른 control-plane 노드 join
344kubernetes/control-planeSet kubeadm_discovery_addresskubeadm_discovery_address 설정
345kubernetes/control-planeUpload certificates so they are fresh and not expired인증서 업로드 (만료되지 않도록)
346kubernetes/control-planeParse certificate key if not set설정되지 않은 경우 인증서 키 파싱
347kubernetes/control-planeWait for k8s apiserverk8s apiserver 대기
348kubernetes/control-planeCheck already run이미 실행됐는지 확인
349kubernetes/control-planeKubeadm | Remove taint for control plane node with node role노드 역할 있는 control-plane 노드의 taint 제거
350kubernetes/control-planeInclude kubeadm secondary server apiserver fixeskubeadm 보조 서버 apiserver 수정 포함
351kubernetes/control-planeUpdate server field in component kubeconfigs컴포넌트 kubeconfig의 server 필드 업데이트
352kubernetes/control-planeInclude kubelet client cert rotation fixeskubelet 클라이언트 인증서 rotation 수정 포함
353kubernetes/control-planeFixup kubelet client cert rotation 1/2kubelet 클라이언트 인증서 rotation 수정 1/2
354kubernetes/control-planeFixup kubelet client cert rotation 2/2kubelet 클라이언트 인증서 rotation 수정 2/2
355kubernetes/control-planeInstall script to renew K8S control plane certificatesK8s control-plane 인증서 갱신 스크립트 설치
356kubernetes/control-planeRenew K8S control plane certificates monthly 1/2K8s control-plane 인증서 월간 갱신 1/2
357kubernetes/control-planeRenew K8S control plane certificates monthly 2/2K8s control-plane 인증서 월간 갱신 2/2

PLAY 11: Invoke kubeadm and install a CNI

순번RoleTASK 이름설명
358kubernetes/clientSet external kube-apiserver endpoint외부 kube-apiserver 엔드포인트 설정
359kubernetes/clientCreate kube config dir for current/ansible become user home현재/ansible become 사용자 홈에 kube config 디렉터리 생성
360kubernetes/clientCopy admin kubeconfig to current/ansible become user homeadmin kubeconfig를 사용자 홈에 복사
361kubernetes/clientWait for k8s apiserverk8s apiserver 대기
362kubernetes-apps/cluster_rolesKubernetes Apps | Wait for kube-apiserverkube-apiserver 대기
363kubernetes-apps/cluster_rolesKubernetes Apps | Add ClusterRoleBinding to admit nodes노드 승인용 ClusterRoleBinding 추가
364kubernetes-apps/cluster_rolesApply workaround to allow all nodes with cert O=system:nodes to registerO=system:nodes 인증서를 가진 모든 노드 등록 허용 워크어라운드 적용
365kubernetes-apps/cluster_rolesKubernetes Apps | Remove old webhook ClusterRole이전 webhook ClusterRole 제거
366kubernetes-apps/cluster_rolesKubernetes Apps | Remove old webhook ClusterRoleBinding이전 webhook ClusterRoleBinding 제거
367kubernetes-apps/cluster_rolesPriorityClass | Copy k8s-cluster-critical-pc.yml filek8s-cluster-critical PriorityClass 파일 복사
368kubernetes-apps/cluster_rolesPriorityClass | Create k8s-cluster-criticalk8s-cluster-critical PriorityClass 생성
369kubernetes/kubeadmSet kubeadm_discovery_addresskubeadm_discovery_address 설정
370kubernetes/kubeadmCheck if kubelet.conf existskubelet.conf 존재 확인
371kubernetes/kubeadmCheck if kubeadm CA cert is accessiblekubeadm CA 인증서 접근 가능 확인
372kubernetes/kubeadmFetch CA certificate from control plane nodecontrol-plane 노드에서 CA 인증서 가져오기
373kubernetes/kubeadmCheck if discovery kubeconfig existsdiscovery kubeconfig 존재 확인
374kubernetes/kubeadmGet current resourceVersion of kube-proxy configmapkube-proxy configmap의 현재 resourceVersion 가져오기
375kubernetes/kubeadmUpdate server field in kube-proxy kubeconfigkube-proxy kubeconfig의 server 필드 업데이트
376kubernetes/kubeadmGet new resourceVersion of kube-proxy configmapkube-proxy configmap의 새 resourceVersion 가져오기
377kubernetes/kubeadmSet ca.crt file permissionca.crt 파일 권한 설정
378kubernetes/kubeadmRestart all kube-proxy pods to ensure that they load the new configmap새 configmap 로드를 위해 모든 kube-proxy pod 재시작
379kubernetes/node-labelKubernetes Apps | Wait for kube-apiserverkube-apiserver 대기
380kubernetes/node-labelSet role node label to empty listrole 노드 레이블을 빈 리스트로 설정
381kubernetes/node-labelSet inventory node label to empty listinventory 노드 레이블을 빈 리스트로 설정
382kubernetes/node-labeldebug디버그
383kubernetes/node-labeldebug디버그
384kubernetes/node-taintSet role and inventory node taint to empty listrole 및 inventory 노드 taint를 빈 리스트로 설정
385kubernetes/node-taintdebug디버그
386kubernetes/node-taintdebug디버그
387network_plugin/cniCNI | make sure /opt/cni/bin exists/opt/cni/bin 존재 확인
388network_plugin/cniCNI | Copy cni pluginsCNI 플러그인 복사
389network_plugin/cniCNI | make sure /opt/cni/bin exists/opt/cni/bin 존재 확인
390network_plugin/cniCNI | Copy cni pluginsCNI 플러그인 복사
391network_plugin/flannelFlannel | Create Flannel manifestsFlannel 매니페스트 생성
392network_plugin/flannelFlannel | Start ResourcesFlannel 리소스 시작
393network_plugin/flannelFlannel | Wait for flannel subnet.env file presenceflannel subnet.env 파일 존재 대기

4단계: 부가 서비스 및 최적화

PLAY 12: Install Calico Route Reflector (Calico BGP 미사용 시 skip)

PLAY 13: Patch Kubernetes for Windows

순번RoleTASK 이름설명
394win_nodes/kubernetes_patchEnsure that user manifests directory exists사용자 매니페스트 디렉터리 존재 확인
395win_nodes/kubernetes_patchCheck current nodeselector for kube-proxy daemonsetkube-proxy daemonset의 현재 nodeselector 확인
396win_nodes/kubernetes_patchApply nodeselector patch for kube-proxy daemonsetkube-proxy daemonset에 nodeselector 패치 적용
397win_nodes/kubernetes_patchdebug디버그
398win_nodes/kubernetes_patchdebug디버그

PLAY 14: Install Kubernetes apps

순번RoleTASK 이름설명
399kubernetes-apps/ansibleKubernetes Apps | Wait for kube-apiserverkube-apiserver 대기
400kubernetes-apps/ansibleKubernetes Apps | CoreDNSCoreDNS 설치
401kubernetes-apps/helmHelm | Gather os specific variablesOS별 변수 수집
402kubernetes-apps/helmHelm | Install PyYamlPyYaml 설치
403kubernetes-apps/helmHelm | Download helmhelm 다운로드
404-411kubernetes-apps/helmPrep_download / Download_file 시리즈helm 다운로드 관련 작업
412kubernetes-apps/helmExtract_file | Unpacking archive아카이브 압축 해제
413kubernetes-apps/helmHelm | Copy helm binary from download dir다운로드 디렉터리에서 helm 바이너리 복사
414kubernetes-apps/helmHelm | Get helm completionhelm completion 가져오기
415kubernetes-apps/helmHelm | Install helm completionhelm completion 설치
416kubernetes-apps/metrics_serverMetrics Server | Delete addon dir애드온 디렉터리 삭제
417kubernetes-apps/metrics_serverMetrics Server | Create addon dir애드온 디렉터리 생성
418kubernetes-apps/metrics_serverMetrics Server | Templates list템플릿 목록
419kubernetes-apps/metrics_serverMetrics Server | Create manifests매니페스트 생성
420kubernetes-apps/metrics_serverMetrics Server | Apply manifests매니페스트 적용

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

순번RoleTASK 이름설명
421adduserUser | Create User Group사용자 그룹 생성
422adduserUser | Create User사용자 생성
423kubernetes/preinstallCheck resolvconfresolvconf 확인
424kubernetes/preinstallCheck existence of /etc/resolvconf/resolv.conf.dresolvconf 디렉터리 존재 확인
425kubernetes/preinstallCheck status of /etc/resolv.confresolv.conf 상태 확인
426kubernetes/preinstallFetch resolv.confresolv.conf 가져오기
427kubernetes/preinstallNetworkManager | Check if host has NetworkManagerNetworkManager 존재 확인
428kubernetes/preinstallCheck systemd-resolvedsystemd-resolved 확인
429kubernetes/preinstallSet default dns if remove_default_searchdomains is false기본 DNS 설정
430kubernetes/preinstallSet dns factsDNS fact 설정
431kubernetes/preinstallCheck if kubelet is configuredkubelet 설정 여부 확인
432kubernetes/preinstallCheck if early DNS configuration stage초기 DNS 설정 단계 확인
433kubernetes/preinstallTarget resolv.conf filesresolv.conf 파일 대상 지정
434kubernetes/preinstallCheck if /etc/dhclient.conf existsdhclient.conf 존재 확인
435kubernetes/preinstallCheck if /etc/dhcp/dhclient.conf existsdhcp/dhclient.conf 존재 확인
436kubernetes/preinstallTarget dhclient hook file for Red Hat familyRedHat용 dhclient hook 파일 지정
437kubernetes/preinstallCheck /usr readonly/usr 읽기전용 확인
438kubernetes/preinstallNetworkManager | Ensure NetworkManager conf.d dirNetworkManager conf.d 디렉터리 확인
439kubernetes/preinstallNetworkManager | Prevent NetworkManager from managing K8S interfacesNetworkManager가 K8s 인터페이스 관리 방지
440kubernetes/preinstallNetworkManager | Add nameservers to NM configurationNetworkManager에 nameserver 추가
441kubernetes/preinstallSet default dns if remove_default_searchdomains is false기본 DNS 설정
442kubernetes/preinstallNetworkManager | Add DNS search to NM configurationNetworkManager에 DNS search 추가
443kubernetes/preinstallNetworkManager | Add DNS options to NM configurationNetworkManager에 DNS 옵션 추가

Role별 TASK 수 요약

RoleTASK 수 (대략)주요 기능
download~150바이너리/이미지 다운로드 (가장 많음)
kubernetes/preinstall~50시스템 사전 설정, swap 비활성화, sysctl
container-engine/*~55containerd, runc, crictl, nerdctl 설치
etcd~55etcd 인증서 생성, 클러스터 구성
kubernetes/control-plane~30kubeadm init, control-plane 구성
kubernetes/node~15kubelet 설치, br_netfilter 설정
kubernetes/kubeadm~12worker join, kube-proxy 설정
network_plugin/*~8CNI 플러그인 설치 (Flannel/Calico)
kubernetes-apps/*~20CoreDNS, metrics-server, Helm
validate_inventory~13inventory 검증
bootstrap_os~12OS 부트스트랩
adduser~8사용자/그룹 생성

정리

Kubespray는 복잡한 Kubernetes 클러스터 배포를 자동화하지만, 내부적으로는 체계적인 단계를 거친다.

  1. 사전 검증으로 환경 문제를 미리 차단
  2. etcd 우선 구축으로 상태 저장소 확보
  3. kubeadm 기반 초기화로 표준 방식 준수
  4. 애드온 자동 설치로 운영 준비 완료
  5. download Role이 가장 많은 TASK 차지 - 바이너리와 컨테이너 이미지 다운로드가 핵심
  6. 검증 TASK가 많음 - 설치 실패를 사전에 방지하기 위한 철저한 검증
  7. 멱등성 보장 - 동일 TASK 반복 실행해도 결과 동일하도록 설계
  8. 조건부 실행 - bastion, Windows, Calico 등 환경에 따라 skip 처리
profile
bytebliss

0개의 댓글