Kubernetes
Kubespray 분석
판다조아
2023. 8. 25. 07:38
Kubespray 란?
- Kubernetes 클러스터를 배포하고 관리하기 위한 오픈 소스 도구
- Ansible을 기반으로 하며, 클라우드 환경이나 온프레미스 환경에서 Kubernetes를 손쉽게 배포하고 설정할 수 있도록 도움
cluster.yaml
Kubernetes 클러스터를 배포하기 위한 설정 파일로 기록된 내용이 순차적으로 실행됨
▶ cluster.yaml
---
- name: Check ansible version
import_playbook: ansible_version.yml
- name: Ensure compatibility with old groups
import_playbook: legacy_groups.yml
- hosts: bastion[0]
gather_facts: False
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: bastion-ssh-config, tags: ["localhost", "bastion"] }
- hosts: k8s_cluster:etcd
strategy: linear
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
gather_facts: false
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: bootstrap-os, tags: bootstrap-os}
- name: Gather facts
tags: always
import_playbook: facts.yml
- 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" }
- hosts: etcd:kube_control_plane
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- role: etcd
tags: etcd
vars:
etcd_cluster_setup: true
etcd_events_cluster_setup: "{{ etcd_events_cluster_enabled }}"
when: etcd_deployment_type != "kubeadm"
- hosts: k8s_cluster
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- role: etcd
tags: etcd
vars:
etcd_cluster_setup: false
etcd_events_cluster_setup: false
when:
- etcd_deployment_type != "kubeadm"
- kube_network_plugin in ["calico", "flannel", "canal", "cilium"] or cilium_deploy_additionally | default(false) | bool
- kube_network_plugin != "calico" or calico_datastore == "etcd"
- 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 }
- 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: master }
- { role: kubernetes/client, tags: client }
- { role: kubernetes-apps/cluster_roles, tags: cluster-roles }
- 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: network_plugin, tags: network }
- hosts: calico_rr
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: network_plugin/calico/rr, tags: ['network', 'calico_rr'] }
- hosts: kube_control_plane[0]
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: win_nodes/kubernetes_patch, tags: ["master", "win_nodes"] }
- 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-apps/external_cloud_controller, tags: external-cloud-controller }
- { role: kubernetes-apps/network_plugin, tags: network }
- { 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
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: kubernetes/preinstall, when: "dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'", tags: resolvconf, dns_late: true }
- name : task의 이름 지정
- hosts : 해당 task가 실행되는 호스트 그룹 지정
- ‘gather_facts: false’ : 사전 정보 수집 비활성화
- 사전 정보가 필요하지 않거나 이미 수집된 사전 정보를 사용하는 경우
- 성능 향상 및 리소스 절약
- any_errors_fatal : 에러 발생 시 플레이북 실행 중단
Kubespray 사용 시 세부 실행 순서
1. Ansible 버전 확인
- name: Check ansible version
import_playbook: ansible_version.yml
- assert 모듈 : 개발자가 만든 코드가 동작하기 전에 데이터나 수식에 대한 검사를 할 수 있는 모듈
- ansible 버전 확인 (minimal ~ maximal 내에 있는지 assert 모듈 사용하여 조건 확인)
- python netaddr 라이브러리 설치 확인
- jinja 버전 확인
2. 호스트 그룹에 노드 추가
- name: Ensure compatibility with old groups
import_playbook: legacy_groups.yml
- kube_control_plane, kube_node, k8s_cluster, calico-rr, no-floating 각 그룹에 속한 노드 추가
3. proxy 설정 및 ssh 구성 관련 작업
- hosts: bastion[0]
gather_facts: False
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: bastion-ssh-config, tags: ["localhost", "bastion"] }
- bastion host : 다른 호스트에 대한 액세스를 중개하는 역할을 하는 호스트 / bastion 호스트를 통해 내부 호스트를 관리
- kubespray-defaults : 변수 설정
- fallback_ips.yml : host의 ip 수집
- no_proxy.yml : proxy 예외 목록(프록시 서버를 통하지 않고 직접 통신) 설정
- bastion-ssh-config : host의 ip,port 정보 설정 및 ssh 설정파일 생성
4. 호스트의 운영 체제를 부트스트랩
- hosts: k8s_cluster:etcd
strategy: linear
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
gather_facts: false
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: bootstrap-os, tags: bootstrap-os}
- strategy: linear : 호스트 그룹 내의 호스트들에게 직렬로 작업 수행
- bootstrap-os : 클러스터 노드의 운영 체제에 따라 필요한 작업(운영 체제별 필요 패키지 설치, 설정 변경 등)을 수행하여 클러스터를 구축하기 위한 사전 조건을 충족
5. 호스트의 사전정보 수집
- name: Gather facts
tags: always
import_playbook: facts.yml
- 최소한의 사전정보 수집 (호스트 이름, IP주소 등)
- 네트워크 관련 사전 정보 수집
- 하드웨어 관련 사전 정보 수집
6. 클러스터 구성을 위한 작업
- 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" }
- preinstall : 쿠버네티스 설치 전 필요한 사전 구성을 수행
- 패키지 설치 (common_required_pkgs 변수에 정의된 공통 패키지)
- SELinux 설정
- 커널 설정
- 시스템 구성 : 네트워크 설정, 파일 시스템 설정, 시간 동기화 설정 등
- 네트워크 설정 : IP포워딩, 네트워크 인터페이스 설정 등
- 컨테이너 런타임 설정
- 기타 사전 구성 작업 : CNI 플러그인 설치 등
- container-engine : Docker, Containerd, CRI-O 등과 같은 컨테이너 엔진을 선택 및 해당 엔진을 설치하고 구성
- 컨테이너 엔진 선택 방법 (기본값 = docker)
- container_manager 부분에 사용할 컨테이너 엔진 명시
- 세부 설정은 roles/container-engine/사용할 엔진 에서 수정
- 컨테이너 엔진 선택 방법 (기본값 = docker)
- download : 파일 및 리소스 다운로드 (skip_downloads = false 인 경우에만 실행)
- kubernetes 바이너리 : kube-apiserver, kube-controller-manager, kube-scheduler, kubelet, kubectl 등
- etcd 바이너리 : etcd 데이터베이스를 구성하는 데 필요한 etcd 바이너리 파일
- 컨테이너 엔진 : docker, containerd, CRI-O 등
- 필요한 도구 및 유틸리티 : helm, kubeadm, kube-proxy, kubelet-plugins 등
- 추가 패키지 및 종속성 : 네트워크 관련 패키지, 보안 관련 패키지, 로깅 및 모니터링 도구 등
7. etcd 클러스터 구성
- hosts: etcd:kube_control_plane
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- role: etcd
tags: etcd
vars:
etcd_cluster_setup: true
etcd_events_cluster_setup: "{{ etcd_events_cluster_enabled }}"
when: etcd_deployment_type != "kubeadm"
- etcd_deployment_type이 kubeadm이 아닌 경우에만 실행
- etcd 데이터베이스 설치 및 구성
- 클러스터의 중앙 제어 시스템을 설정(kube_control_plane) : api-server, scheduler, control-manager, etcd
8. etcd 클러스터 구성2
- hosts: k8s_cluster
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- role: etcd
tags: etcd
vars:
etcd_cluster_setup: false
etcd_events_cluster_setup: false
when:
- etcd_deployment_type != "kubeadm"
- kube_network_plugin in ["calico", "flannel", "canal", "cilium"] or cilium_deploy_additionally | default(false) | bool
- kube_network_plugin != "calico" or calico_datastore == "etcd"
- kube_network_plugin이 calico, flannel, canal, cilium중 하나이거나 cilium_deploy_additionally 변수가 기본값이며 kube_network_plugin이 calico가 아니거나 calico_datastore가 etcd인 경우에만 실행
9. 클러스터 node 구성
- 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 }
- Cgroup driver 확인 및 설정
- kubelet 컨테이너 상태 확인
- nodeport 범위 설정
- br_netfilter 모듈 확인 및 관련 설정
- 리눅스 커널의 네트워크 브리지 모듈
- kube-proxy 컴포넌트가 이 모듈을 사용하여 노드 간 통신 및 로드 밸런싱을 관리
- IPVS 설정
- kubelet
- kubelet 관련 파일 생성 (환경설정 파일, 구성 파일, system init 파일)
- kubelet 서비스 시작, 부팅 시 자동 활성화
- kubelet restart
10. master node 구성
- 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: master }
- { role: kubernetes/client, tags: client }
- { role: kubernetes-apps/cluster_roles, tags: cluster-roles }
- kube-scheduler 구성파일 생성
- 시크릿 관련 구성
- kubectl 바이너리 복사
- kubectl Bash 자동완성 설치 (명령어 및 옵션 자동 완성)
- kubeadm을 사용하여 control_plane 설정
- control_plane의 kubelet, kube-proxy, kube-apiserver, kube-controller-manager, kube-scheduler 등의 구성파일 생성
- 인증서 관리 (cetificate)
- etcd 관련 작업
11. worker node 구성
- 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: network_plugin, tags: network }
- kubeadm을 사용하여 워커 노드를 Kubernetes 클러스터에 가입
- kubeadmn 태그가 지정된 경우에만 워커 노드에서 실행
- 노드 레이블 추가 → 노드 식별 및 구성
- node-label 태그가 지정된 경우에만 실행
- network_plugin 설치 및 구성
- network 태그가 지정된 경우에만 워커 노드에서 실행
12. Calico 네트워크 플러그인의 RR(Route Reflector) 구성
- hosts: calico_rr
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: network_plugin/calico/rr, tags: ['network', 'calico_rr'] }
- calico : Kubernetes 클러스터의 네트워크 정책 및 라우팅을 관리하기 위한 오픈 소스 네트워크 솔루션
- calico_rr : 대규모 Kubernetes 클러스터에서 라우팅 효율성과 확장성을 향상
- Calico 네트워크는 기본적으로 BGP (Border Gateway Protocol) 프로토콜을 사용하여 라우팅 정보를 교환 / 일반적으로 모든 Calico 노드가 BGP 피어로 연결 → 대규모 클러스터에서는 BGP 피어 연결의 복잡성과 관리 부담이 증가
- calico_rr : 클러스터 내의 다른 Calico 노드들과 BGP 피어로 연결되어 클러스터의 라우팅 정보를 수집하고 전파 → 노드 간의 BGP 피어 수를 줄이고, 네트워크 라우팅 관리의 복잡성을 감소
13. kube_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-apps/external_cloud_controller, tags: external-cloud-controller }
- { role: kubernetes-apps/network_plugin, tags: network }
- { 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 }
- 해당 태그 사용하여 선택적 실행
- 네트워크 플러그인
- 정책 컨트롤러
- 인그레스 컨트롤러
- 외부 프로비저너
- 기타 애플리케이션 배포
14. 내부 DNS구성
- name: Apply resolv.conf changes now that cluster DNS is up
hosts: k8s_cluster
gather_facts: False
any_errors_fatal: "{{ any_errors_fatal | default(true) }}"
environment: "{{ proxy_disable_env }}"
roles:
- { role: kubespray-defaults }
- { role: kubernetes/preinstall, when: "dns_mode != 'none' and resolvconf_mode == 'host_resolvconf'", tags: resolvconf, dns_late: true }
- resolv.conf 파일 변경 사항 적용
Reference
- chatgpt