[ Kubeadm으로 k8s 설치하기 ]
https://kubernetes.io/ko/docs/setup/production-environment/tools/
0. 설치 전 확인사항
- 호환되는 리눅스 머신. 쿠버네티스 프로젝트는 데비안 기반 배포판, 레드햇 기반 배포판, 그리고 패키지 매니저를 사용하지 않는 경우에 대한 일반적인 가이드를 제공한다.
- 2 GB 이상의 램을 장착한 머신. (이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)
- 2 이상의 CPU.
- 클러스터의 모든 머신에 걸친 전체 네트워크 연결. (공용 또는 사설 네트워크면 괜찮음)
- 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid. 자세한 내용은 여기를 참고한다.
- 컴퓨터의 특정 포트들 개방. 자세한 내용은 여기를 참고한다.
- 스왑의 비활성화. kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.
1. 컨테이너 런타임 설치(control plane, worker node 공통 작업)
https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/
파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 한다.
<컨테이너 런타임 종류>
- containerd
- CRI-O
- 도커 엔진
- 미란티스 컨테이너 런타임(MCR)
1) 도커 엔진 설치
https://docs.docker.com/engine/install/ubuntu/
1. docker repository 생성
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
2. docker package 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 설치 확인
2. 필수 요소 설치 및 구성(control plane, worker node 공통 작업)
1) IPv4를 포워딩해서 iptables가 bridged traffic
IPv4를 포워딩해서 iptables가 bridged traffic을 확인하고 제어할 수 있도록 한다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system
2) cgroup 드라이버
cgroup(Control Groups)은 리눅스 커널에서 제공하는 기능으로, 프로세스 그룹을 관리하고 제어할 수 있게 해주는 기술이다.
다양한 리소스 (CPU, 메모리, 디스크 I/O 등)에 대한 프로세스 그룹의 자원 소비를 제한하고 모니터링할 수 있다.
kubelet과 컨테이너 런타임이 control group들과 상호작용하기 위해서는 cgroup 드라이버를 사용해야 한다.
<cgroup 드라이버 종류>
- cgroupfs
- systemd
1. cgroupfs
cgroupfs
드라이버가 권장되지 않는 때가 있는데, systemd가 init 시스템인 경우이다. 이것은 systemd가 시스템에 단 하나의 cgroup 관리자만 있을 것으로 기대하기 때문이다.
cgroup v2를 사용할 경우에도 cgroupfs
대신 systemd
cgroup 드라이버를 사용한다.
2. systemd
systemd
를 cgroup 드라이버로 사용하기 위해서는, [KubeletConfiguration](https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/)
를 수정하여 cgroupDriver
옵션을 systemd
로 지정하는 것이다.
systemd
를 kubelet의 cgroup 드라이버로 구성했다면, 반드시 컨테이너 런타임의 cgroup 드라이버 또한 systemd
로 설정해야 한다.
#cgroupfs를 컨테이너 런타임과 kubelet 에 의해서 제어할 수 있도록 구성한다.
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3. kubeadm, kubelet 및 kubectl 설치(control plane, worker node 공통 작업)
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
GPG error 발생하여, 공식문서와는 다른 코드를 참고(하단 Error1에 내용 정리).
1) apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
2) 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg -o /usr/share/keyrings/kubernetes-archive-keyring.gpg --dearmor
3) 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
4) apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
4. kubeadm을 사용하여 클러스터 생성
1) control plane
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
# 클러스터 초기화
sudo kubeadm init
unknown service runtime.v1.RuntimeService
라는 오류 발생 시 아래 error2 내용 참고.
만약 init이 됐다면:
해당 명령어 실행
# 클러스터 사용하기 위한 작업
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 노드 join
sudo kubeadm join 10.10.10.165:6443 --token 1fpmrb.zg0v218rxp5c7n3k \
--discovery-token-ca-cert-hash sha256:c7252b0d68911ec32ed3113006c25355a9c3ca787d975aeacf30a083fd75a0f5
결과:
2) worker node
# 노드 join
sudo kubeadm join 10.10.10.165:6443 --token 1fpmrb.zg0v218rxp5c7n3k \
--discovery-token-ca-cert-hash sha256:c7252b0d68911ec32ed3113006c25355a9c3ca787d975aeacf30a083fd75a0f5
unknown service runtime.v1.RuntimeService
라는 오류 발생 시 아래 error2 내용 참고.
control plain으로 돌아가서 join이 잘 됐는지 확인:
5. CNI 기반 pod network 설치(control plane 작업)
Pod가 서로 통신할 수 있도록 Container Network Interface (CNI) 기반의 Pod 네트워크 애드온을 배포해야 한다.
클러스터 DNS(CoreDNS)는 네트워크가 설치되기 전에는 시작되지 않는다.
<CNI 종류>
- Calico
- Weave
- Flannel
1) Weave
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
1분 내외로 ready 상태가 된다.
[ Error 해결 과정 ]
1. GPG error
GPG error: https://packages.cloud.google.com/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
public key를 확인할 수 없음
시도한 방법 1-1) 직접 public key를 등록(1)
https://velog.io/@offsujin/Ubuntu-GPG-error-%ED%95%B4%EA%B2%B0
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B53DC80D13EDEF05
결과: public key 조회 불가
시도한 방법 1-2) 직접 public key를 등록(2)
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/13edef05.pub
결과: public key 조회 불가
시도한 방법 2) 유튜브 참고
https://www.youtube.com/watch?v=N7OJkOPXKRU
curl -L https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add
sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list
echo deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main | sudo tee /etc/apt/sources.list.d/kubernetes.list
결과: 같은 에러 발생
시도한 방법 3) ubuntu20.04 → ubuntu22.04 로 변경
결과: 같은 에러 발생
시도한 방법 4) --dearmor
https://askubuntu.com/questions/1462497/no-pubkey-error-after-the-key-was-successfully-added
--dearmor
: 텍스트 형식의 키를 이진 형식으로 변환하는 옵션
구글 클라우드의 공개 사이닝 키를 다운로드
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg -o /usr/share/keyrings/kubernetes-archive-keyring.gpg --dearmor
결과: kubeadm, kubelet, kubectl 설치 단계에서 2번 구글 클라우드의 공개 사이닝 키를 다운로드하는 명령어에 --dearmor
옵션을 추가하니 해결.
2. kubeadm init: unknown service runtime.v1.RuntimeService
해결:
# 컨테이너 런타임 설정파일 삭제 후 재시작
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
control plane에서 오류가 발생했다면 다시 sudo kubeadm init
명령어로 클러스터 초기화를 진행한다.
worker node에서 오류가 발생했다면 다시 kubeadm join ...
명령어로 control plane과 연결한다.
'Docker & Kubernetes > 쿠버네티스' 카테고리의 다른 글
[kubernetes] kubectl 축약 & 명령어 자동완성 (0) | 2024.01.09 |
---|---|
multi control plane: 클러스터에 여러개의 마스터 노드 구성 (0) | 2024.01.08 |
metrics-server 설치: 쿠버네티스 리소스 모니터링 (0) | 2023.05.30 |