kubeadm
개요
Kubernetes를 설치하는 것을 도와주는 명령어.
클러스터로서 관리되기 위해서는 각종 세팅이 필요하기에 이를 도와주는 다양한 도구가 존재하는데, 이 중 CKA에도 출제되기도 하는 툴이다.
그래서 쿠버네티스 공식 문서에서도 설치하는 방법에 대한 언급이 존재한다.
요구사양
문서에 실제 설치를 위한 요구사항이 적혀있다.[1]
- 2 cpu, 2기가 메모리
- 노드마다 고유한 host이름, MAC 주소, uuid
- 호스트네임이 각 노드를 구분하는 구분자로서 사용되기에 꼭 고유하게 설정해야 한다.
- glibc 라이브러리 설치 필요
- alphine linux 급 아니면 거의 모든 리눅스에 이미 설치되어 있음
- 몇 가지 포트가 오픈되어 있어야 함
- 위의 포트가 오픈되어 있어야 함.
- 엄청 크게 중요하지는 않은 것 같은데, 6443 포트는 꼭 사용되지 않는 것이 권장된다.
- Container Runtime#쿠버네티스에서 제한사항
- 설치는 당연히 돼있어야 한다!
- 도커를 활용하지 못하므로 이를 위한 추가적인 세팅이 필요하다.
init - 클러스터 초기화
kubeadm을 통한 클러스터 구축은 두 가지 과정이 담긴다.
먼저 init을 통해 마스터 노드를 초기화해야 하는데, 이걸 먼저 보자.
초기화 과정은 다음과 같이 이뤄진다.
- preflight - 초기화를 진행하기 이전 노드 상태를 체크한다.
- certs - 각 인증서를 생성한다.
- /ca - 자체 서명된 루트 인증서
- /apiserver - kube-apiserver
- /apiserver-kubelet-client - kubelet과 통신하기 위한 api 서버 인증서(mTLS)
- /front-proxy-ca - 프론트 프록시가 있을 때 이를 위한 루트 인증서
- /front-proxy-client - 프록시 클라이언트를 위한 인증서
- /etcd-ca - etcd를 위한 루트 인증서
- /etcd-server - Etcd
- /etcd-peer - etcd 다중화 시 서로 통신하기 위한 인증서
- /etcd-healthcheck-client - etcd 헬스체크를 하기 위한 liveness probe용 인증서
- /apiserver-etcd-client - etcd와 통신할 때 api서버가 쓰는 인증서
- /sa - 서비스 어카운트를 서명하기 위한 개인, 공개키
- 이 값들은
--cert-dir
로 설정된 곳에 저장되는데, 보통/etc/kubenetes/pki
이다.
- kubeconfig - 컴포넌트 간, 그리고 관리자가 사용할 kubeconfig 파일을 생성한다.
- /admin - 관리자와 kubeadm이 사용할 config
- /super-admin - 슈퍼 관리자가 사용할 config
- /kubelet - 부트스트랩 목적으로만 사용되는 kubelet을 위한 config
- /controller-manager - kube-controller-manager가 사용할 config
- /scheduler - kube-scheduler가 사용할 config
- 이 값들은
/etc/kubernetes
에 conf라는 확장자를 달고 저장된다.- 그래봐야 까보면 흔히 보는 yaml 파일이다.
- super-admin은 RBAC 적용을 받지 않는 루트 유저로, 원격으로 인증인가 세팅하다 조지면 이 놈이라도 써야 한다.
- etcd - 로컬 etcd 정적 파드 양식을 생성한다.
- /local - 기본으로는 로컬 전용 하나만 만들어진다.
- external etcd 관련 설정 인자를 넘기면 이 단계가 스킵된다.
- control-plane - 이외의 모든 컨트롤 플레인 파드 양식을 생성한다.
- /apiserver
- /controller-manager
- /scheduler
- kubelet-start - kubelet 세팅 후 실행시킨다.
- upload-config - kubelet, kubeadm의 설정을 ConfigMap으로 올린다.
- /kubeadm - 클러스터 설정(ClusterConfiguration)
- /kubelet - kubelet 설정
- upload-certs - 인증서들을 kubeadm-certs에 올린다.
- mark-control-plane - 노드를 컨트롤 플레인이라 마크한다.
- 그냥 컨트롤 플레인이라고 라벨, 테인트, 톨러레이션를 남기는 것이다.
- bootstrap-token - 다른 노드가 클러스터에 join할 수 있도록 부트스트랩 토큰을 생성한다.
- kubelet-finalize - TLS 부트스트랩 이후 kubelet의 세팅을 업데이트한다. Updates settings relevant to the kubelet after TLS bootstrap
- /enable-client-cert-rotation - kubelet 클라이언트 인증서 갱신을 활성화시킨다.
- 이건 부트스트랩 토큰과 관련한 세팅인데, CSR과도 연관된다.
- addon - 적합성(Node Ready 여부) 테스트를 위해 필요한 애드온을 설치한다.
- /coredns - Core DNS
- /kube-proxy - kube-proxy
- show-join-command - 다른 노드에서 클러스터에 join할 수 있도록 join 명령어를 출력한다.
처음 보면 장황해보이는데, 막상 하나하나 보면 별 거 없어서 설명을 간단히 적었다.
그냥 인증서 만들고, 통신할 수 있는 파일 만들어준다.
그 다음에 파드 양식을 만들어둔 이후에 kubelet을 작동시키면 kubelet이 정적 파드를 만들어줄 것이고, 본격적으로 클러스터가 가동된다.
그 다음에는 설정 때 사용된 파일들을 클러스터 컨피그맵에 올려주고, 인증서 관리를 위해 kubeadm 자신도 인증서를 가지고 있는다.
그후에는 노드가 ready 상태가 되기 위한 기본 네트워크 관련 애드온들을 설치해주는 것이다.
kubeadm init phase control-plane all --config=config.yaml
kubeadm init phase --skip-phases=ccontrol-plane --config=config.yaml
이렇게 단계가 나눠져 있어서, 이를 단계별로 실행하는 것도 가능하다.
이런 식으로 한다면 중간 단계에서 뭔가 커스텀을 하고 싶은 게 있을 때 관리자가 세밀하게 조작할 수 있다.
(근데 처음부터 설정 파일을 잘 넣던가, 인자를 잘 줘서 하는 게 당연히 베스트다.)
설정 파일 사용
많은 설정을 인자로 미리 넣어줄 수 있지만, 이것들을 처음부터 설정파일로 관리하는 것도 가능하다.
설정 양식도 yaml이고, 4개의 kind를 넘길 수 있다.
- InitConfiguration
- ClusterConfiguration
- KubeProxyConfiguration
- KubeletConfiguration
사실 여기에 Join, Upgrade, Reset 등의 Configuration도 넘길 수 있긴 한데, 어차피 init 단계에서 해당 파일을 넣어봐야 무시된다.
kubeadm config print init-defaults --component-configs KubeProxyConfiguration,KubeletConfiguration
이때 뒤 인자를 넣지 않으면 InitConfiguration, ClusterConfiguration만 나온다.[2]
자세한 설정은 여기에서 볼 수 있다.[3]
기본적으로 넣어주면 좋은 것은 Init, Cluster.
클러스터쪽에는 각 컴포넌트에 대한 설정도 해줄 수 있는데 이런 식으로 해주면 된다.[4]
각 컴포넌트의 넣을 추가 인자를 세팅하는 것이다.[5]
ClusterConfiguration에 featureGates라는 필드가 있길래 모든 컴포넌트에 일일히 안 써도 되는 줄 알았는데, 에러가 오질나게 뜬다.[6]
대체 저 필드는 뭘 넣는 필드인가.. 그리고 정말 피쳐게이트를 일일히 명시해서 넣어야 하나.. 난감하다..
정말 이 방법밖에 없나..?[7]
join - 노드 등록
이후에 join을 통해 워커노드를 마스터 노드에 등록한다.
각 과정은 각 노드에서 이뤄져야만 한다.
명령어
- init
- join
- upgrade
- config
- token
- reset
- certs
- kubeconfig
- version
- alpha
클러스터 구축
kubeadm을 이용해서 클러스터를 구축할 때 kubeadm은 기본적으로 kubelet을 동작시키고 그 위에 핵심 컴포넌트들을 동작시키는 일을 한다.
자세한 사항은 E-쿠버네티스 클러스터 구축를 참조한다.
사실 쿠버네티스를 설치하는 다른 방법은 많다.
심지어 일일히 모든 컴포넌트를 수동으로 만드는 방법도 있다..[8]
그러나 가장 표준적인 방법은 역시 kubeadm이라 할 수 있어 kubeadm을 통한 설치 방식을 해당 문서의 핵심으로 분리하고자 한다.
참고
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin ↩︎
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-config/ ↩︎
https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta4/ ↩︎
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/control-plane-flags/#customizing-kube-proxy ↩︎
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/ ↩︎
https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta4/#kubeadm-k8s-io-v1beta4-ClusterConfiguration ↩︎
https://github.com/kelseyhightower/kubernetes-the-hard-way ↩︎