최근에 회사에서 기회가 닿아서 kubeadm 을 통해서 kubernetes 를 설치하게 되었다.
기존에 많이 사용되는 kubespray 의 경우 장애 발생시 노드 추가 혹은 기존의 클러스터에 노드 추가가 어렵다는 점 그리고 선임분의 말에 의하면 선언적인 설치(?) 때문에 차후에 문제가 될 소지가 충분하기 때문에 kubernetes 에서 공식 지원 해주는 kubeadm 을 통해서 설치를 진행하게 되었다.
설치를 하다가 갑자기 든 의문은
" 그래서 이거는 설치 명령어인 kubeadm init 을 하면 어떤 일이 일어나는데? " 라는 의문이었다.
이러한 의문이 들면 두가지 방안이 있다고 생각 되어지는데
1. 공식 홈페이지 방문
2. 소스 코드 분석
위 두가지 방안이 있다고 생각 되어 진다.
그래서 본 글에서는 소스 코드에 대한 정확한 분석을 하기에는 실력이 부족해서 겉 핥기 라고 제목을 지었다.
바로 소스코드로 가면 무슨 말인지 이해가 안 갈게 분명해서 우선은 공식 홈페이지로 가서 해당 내용에 대해서 조사하기로 결정 했다.
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
kubeadm init
This command initializes a Kubernetes control-plane node. Run this command in order to set up the Kubernetes control plane Synopsis Run this command in order to set up the Kubernetes control plane The "init" command executes the following phases: preflight
kubernetes.io
친절하신 kubernetes 는 당연히 이러한 부분에 대해서 설명을 해두었다.
kubeadm init 은 위와 같은 방식으로 진행되다는 것을 알 수 가 있다.
당연히 이렇게 보면 알기가 어려운거 같다. 무슨 말인지 이해도 안가고 그래서 뭐? 라는 말이 자동으로 나온다.
그래서 내가 주목 하기로 한것은 큰 개요들에 먼저 주목 하기로 했다.
* preflight
* certs
* kubeconfig
* kubelete-start
* controlplane
* etcd
* upload-config
* upload-certs
* mark-control-plane
* bootstrap-token
* kubelet-finalize
* addon
우선 큰 개요를 잡어도 이렇게 많이 주목해야 한다는 사실이 매우 충격적이다. 현재 내가 생각하는 각각의 과정의 역할을 간단히 정리해보면
* preflight - 노드 체크?
* certs - 쿠버네티스 에서 각각의 통신에서 사용되는 인증서, 클러스터 접근을 위한 인증서 등을 발급 해주는 과정?
* kubeconfig - 쿠버네티스를 접근 하기 위한 config file 및 kubelet 이나 스케줄러 등에서 사용하는 설정 파일을 발급 해주는 과정
* kubelet-start - 각 노드의 정보를 보내주는 kubelet 을 실행 시킴
* controlplane - master 노드가 지니는 apiserver, controller-manager, scheduler 등을 설정 해준다.
* etcd - 각 manifest 설정 값들을 key- value 로 저장 해주게 된다.
* upload-config - kubeadm 과 kubelet 의 설정 값을 configmap 으로 저장 해준다
* upload-certs -인증서들을 업로드
* mark-control-plane - 마스터 노드들 지정
* bootstrap-token - 클러스터에 참여할 노드를 위한 토큰 발급
* kubelet-finalize - 잘 모르지만 뭔가 kubelet 에 설정 마무으리
* addon - 실제로 설치 할 때 해당 설정을 하는 것을 옆에서 봐서 ( coredns , kube-proxy 등등 ) 필요한 addon 설치를 지정하는 부분이라고 알고 있다.
이렇게 보고 읽고 해당 부분에 대해서 이해 했다고 생각하기에는 솔직히 아직 모르는 부분이 너무나도 많다.
그렇기에 안타깝지만 2번 옵션을 시작해야 할때가 온거 같다... ( 안돼... 그곳은 지옥이야... )
https://github.com/kubernetes/kubernetes
GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
Production-Grade Container Scheduling and Management - GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
github.com
그 지옥은 위 주소로 가면 볼 수 있다.
위의 말은 조금 과장이다. 실제로 소스 코드로 들어가보면 생각보다 복잡하지 않고 공식 홈페이지의 설명과 엄청 잘 맞는다는 생각을 먼저 하게 되었다.
https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/cmd/init.go
GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
Production-Grade Container Scheduling and Management - GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
github.com
kubeadm init 명령어가 하는 것을 참고 하기 위해서는 위 주소로 다시 한번 들어가주어야 하는데 그곳에서 우리는 우리가 아까전에 봤던 phases 들과 유사한 코드 구조를 볼 수 있다는 것을 알 수 있다.
정말로 공식 홈페이지에서 지원해주는 과정대로 코드가 동작한다는 것을 알 수 있다.
우선 NewPreflightPhase() 로 가서 어떠한 일을 하는지 확인 해보는게 좋을 듯 하다.
1. phases.PreflightPhase()
https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/cmd/phases/init/preflight.go
GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
Production-Grade Container Scheduling and Management - GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
github.com
우선 workflow.Phase 라는 것을 돌려주는 함수 이다. 가만히 보면 cobra cmd 와 매우 유사한 구조라는 것을 알 수 있다.
그렇다면 여기서 저는 감으로 본 Phase 는 결국 runPreflight 를 실행 할 것을 보이는데 바로 아래에 해당 함수가 실행 된다는 것을 알 수 있다.
62, 70 줄에 보면 처음에는 노드를 체크 하고 그 이후 kubeadm 에서 필요한 노드 이미지가 있다면 이미지를 pull 해오는 함수 인 preflight.RunPullImagesCheck 를 실행한다는 것을 알 수 있다.
preflight 에서는 우선적으로 해당 노드에 설치할 수 있는지 ( 포트, 방화벽,http 프록시 , 메모리 , 버전 ) 그리고 설치를 위한 이미지를 체크 해주는지에 대해서 체크 해주는 함수라는 것을 알 수 가 있다.
우선은 길이 길어져서 다음 글에서 이어서 적겠다.
요약
- kubeadm init 으로 kubernetes 설치 가능함.
- 다양한 단계가 있음
- 그중 가장 첫번째 단계인 preflight 은 노드 체크 및 이미지 체크를 담당하고 있다.
'DevOps 잡다구리 > Kubernetes Stuff' 카테고리의 다른 글
[Kubernetes] Kubernetes Elasticsearch operator (0) | 2022.06.06 |
---|---|
[Kubernetes] Kubernetes 위에 Prometheus agent 모드 (2) | 2022.02.20 |
[Kubernetes] Kubernetes 소스 코드 겉핥기 - Kubeadm reset (0) | 2022.01.04 |
[Kubernetes] Volsync rclone replication 을 통한 데이터 백업 (0) | 2021.11.29 |
[Kubernetes] Percona XtraDB Cluster (0) | 2021.11.20 |