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/사용할 엔진 에서 수정
  • 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