(2024.12.02 수정)
이 포스팅은 docker engine를 container runtime로 설치한 방법으로, 오류가 많이 발생합니다.
오류 해결 방법은 작성 해두었지만 이 설치 방법은 요즘 권장사항에 맞지 않으니
내용으 업데이트한 https://minha0220.tistory.com/203 포스팅 내용을 참고하여 설치하는것을 권장드립니다.
ubuntu에 k8s 설치하는 방법
0. 설치 전 확인사항호환되는 리눅스 머신. 쿠버네티스 프로젝트는 데비안 기반 배포판, 레드햇 기반 배포판, 그리고 패키지 매니저를 사용하지 않는 경우에 대한 일반적인 가이드를 제공한다.2
minha0220.tistory.com
(이하 2024.01 포스팅)
[ Kubeadm으로 k8s 설치하기 ]
https://kubernetes.io/ko/docs/setup/production-environment/tools/
배포 도구로 쿠버네티스 설치하기
운영 수준의 컨테이너 오케스트레이션
kubernetes.io
0. 설치 전 확인사항
- 호환되는 리눅스 머신. 쿠버네티스 프로젝트는 데비안 기반 배포판, 레드햇 기반 배포판, 그리고 패키지 매니저를 사용하지 않는 경우에 대한 일반적인 가이드를 제공한다.
- 2 GB 이상의 램을 장착한 머신. (이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)
- 2 이상의 CPU.
- 클러스터의 모든 머신에 걸친 전체 네트워크 연결. (공용 또는 사설 네트워크면 괜찮음)
- 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid. 자세한 내용은 여기를 참고한다.
- 컴퓨터의 특정 포트들 개방. 자세한 내용은 여기를 참고한다.
- 스왑의 비활성화. kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.
1. 컨테이너 런타임 설치(control plane, worker node 공통 작업)
https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/
컨테이너 런타임
참고: Dockershim은 쿠버네티스 릴리스 1.24부터 쿠버네티스 프로젝트에서 제거되었다. 더 자세한 내용은 Dockershim 제거 FAQ를 참고한다. 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨
kubernetes.io
파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 한다.
<컨테이너 런타임 종류>
- containerd
- CRI-O
- 도커 엔진
- 미란티스 컨테이너 런타임(MCR)
1) 도커 엔진 설치
https://docs.docker.com/engine/install/ubuntu/
Install Docker Engine on Ubuntu
Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.
docs.docker.com
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/
kubeadm 설치하기
이 페이지에서는 kubeadm 툴박스 설치 방법을 보여준다. 이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 kubeadm으로 클러스터 생성하기 페이지를 참고한다.
kubernetes.io
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
[Ubuntu] GPG error 해결
패키지를 설치할 때 나는 GPG error를 해결했다.
velog.io
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B53DC80D13EDEF05
결과: public key 조회 불가
시도한 방법 1-2) 직접 public key를 등록(2)
MIT PGP Key Server
pgp.mit.edu
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
NO_PUBKEY error after the key was successfully added
When I run sudo apt-get update a get the following error: Err:8 https://packages.cloud.google.com/apt kubernetes-xenial InRelease The following signatures couldn't be verified because the public ...
askubuntu.com
--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 > 쿠버네티스' 카테고리의 다른 글
ubuntu에 쿠버네티스 설치하는 방법 (0) | 2024.12.02 |
---|---|
Kubernetes 컨테이너 런타임 추천(containerd, CRI-O, Docker Engine) (0) | 2024.11.20 |
[kubernetes] kubectl 축약 & 명령어 자동완성 (0) | 2024.01.09 |
multi control plane: 클러스터에 여러개의 마스터 노드 구성 (0) | 2024.01.08 |
metrics-server 설치: 쿠버네티스 리소스 모니터링 (0) | 2023.05.30 |