[k8s] kubernetes 설치 -1

제이브로·2024년 3월 13일

Kubernetes

목록 보기
2/4
post-thumbnail

1. 설치환경

  • os : ubuntu 22.04.4 LTS
  • master node(vm) : CPU 2 core, RAM 4GB ( 최소 CPU 2 core, RAM 2GB )
  • worker node1(vm) : CPU 2 core, RAM 4GB ( 최소 CPU 1 core, RAM 1GB )
  • worker node2(vm) : CPU 2 core, RAM 4GB ( 최소 CPU 1 core, RAM 1GB )

1.1 OS 정보 확인

# Check core
$ nproc

# Check memory
$ free -h

2. 권장사항

root 계정으로 설치를 진행하길 권장드립니다.

  • $ sudo passwd root 로 root 계정 생성
  • $ su - 로 루트 계정 실행 or 대부분의 명령어 sudo 붙여서 실행
  • 아래 코드에는 sudo가 있지만, 루트 계정일 경우, sudo 없이 실행하시면 됩니다.

3. k8s 설치 준비

3.1 메모리 swap 기능 비활성화

# swap 임시 비활성화
$ sudo swapoff -a 

# swap 영구 비활성화 ( swap 부분을 주석처리 )
$ sudo sed -i '/swap/s/^/#/' /etc/fstab

# 메모리 상태 확인
$ sudo free -m

# swap 메모리 상태 확인, 출력값이 없어야 비활성화
$ sudo swapon -s

3.2 방화벽 비활성화

방화벽을 비활성화하는 방법이 일반적이며, 각 방화벽 포트를 개방하는 방법도 있습니다.

  • 저는 방화벽 비활성화로 진행하겠습니다.
# 방화벽 비활성화 ( master, worker )
$ sudo apt-get install -y firewalld
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

3.2.1 방화벽 상태 확인

# 열린 포트 확인
$ sudo firewall-cmd --list-all

# 열린 포트 확인
$ sudo apt-get install net-tools
$ sudo netstat -tlnp

3.3 네트워크 옵션 설정

# /etc/modules-load.d/k8s.conf 파일 생성
$ sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
 
# /etc/sysctl.d/k8s.conf 파일 생성
$ sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 시스템 재시작 없이 stysctl 파라미터 반영
$ sudo sysctl --system

4. k8s 런타임 설치

4.1 Docker 설치 후 Containerd 패키지 사용

4.1.1 apt update 및 필수 패키지 설치

# apt 업데이트
$ sudo apt-get update

# 필수 패키지 설치
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

4.1.2 공개키 다운로드 및 저장소 등록

#공개키 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 저장소 등록
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4.1.3 Docker 설치

# 저장소 추가로 apt 업데이트
$ sudo apt update

# 도커 설치
$ sudo apt install -y docker.io

# 도커 버전 조회
$ docker --version

4.1.4 Docker 데몬 설정

# /etc/docker 디렉토리 없을 경우 생성
$ sudo mkdir /etc/docker

# daemon.json 파일 추가
$ sudo 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

4.1.5 cgroup(runc) 옵션 적용

# containerd 구성 파일 생성
$ sudo mkdir -p /etc/containerd

# containerd 기본 설정값으로 config.toml 생성
$ sudo containerd config default | sudo tee /etc/containerd/config.toml

# config.toml 파일 수정
$ vim /etc/containerd/config.toml

# vim 편집기에서 편집 : cgroup driver(runc) 사용하기 설정
# 아래 부분 찾아서 true로 수정
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

# 수정사항 적용 및 재실행
$ sudo systemctl restart containerd

4.1.6 Docker 재시작

# 도커 재시작
$ sudo service docker restart

# 도커 상태 조회
$ sudo service docker status

5. k8s 클러스터 설치

5.1 apt 패키지 업데이트 및 필수 패키지 설치

# apt update
$ sudo apt-get update

# 필수 패키지 설치
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

5.2 구글 클라우드 공개 키 다운로드 및 쿠버네티스 레포지토리 추가

# 공개 키 다운로드
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg

# apt 저장소에 쿠버네티스 저장소 추가
sudo echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

5.3 쿠버네티스 패키지 설치

# 저장소 추가되었기 때문에 apt 업데이트
$ sudo apt-get update

# 쿠버네티스 패키지 설치
$ sudo apt-get install -y kubelet kubeadm kubectl

# 쿠버네티스 패키지 버전 고정
$ sudo apt-mark hold kubelet kubeadm kubectl

# 쿠버네티스 설치 버전 조회
$ kubelet --version
$ kubeadm version
$ kubectl version

# kubelet service 확인
$ sudo systemctl status kubelet.service

5.3.1 오류해결 unable to locate package

apt-get install kubelet kubeadm kubectl 설치하는 과정에서 unable to locate 발생

  • k8s docs 에서 나오는 가이드대로 설치
# 1. update & upgrade system ( 오류가 나도 무시 )
$ sudo apt update && sudo apt upgrade -y

# 2. docker 설치 ( 이미 설치되어 있다고 나옵니다. )
$ sudo apt install -y docker.io
$ sudo docker --version

# 3. Kubernetes Components 설치
$ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
$ sudo apt update
$ sudo apt install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

6. Master node 구성

6.1 Control-Plane 구성

kubeadm init을 하면, 출력창에 join 토큰이 나옵니다. 해당 부분을 복사해서 저장해두세요!!

# 쿠버네티스 클러스터를 초기화하여 새로운 마스터 노드를 생성하는 명령어
# 뒤에 cidr을 별도로 지정하지 않으면 디폴트값 사용
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 확인
$ kubectl get nodes

ex) join 토큰 저장

kubeadm join 192.168.111.123:6443 --token 57z3wr.olafcjal4e7j8tp9 \
        --discovery-token-ca-cert-hash sha256:39d9b89986fe769bd7aeb166c61eb407274a49dd8058fd16a416c768d0ada738

6.2 kubectl 설정

root 계정이 아닌 계정에서도 sudo를 붙이지 않고 kubectl을 사용하기 위함

  • root 계정이 아닌 계정에서 실행해야 합니다.
sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

6.3 CNI(Container Network Interface) 설정

다양한 CNI가 있으며, 저는 calico를 사용하겠습니다.

  • calico는 기본 cidr이 192.168.0.0/16이므로, 위에 init에서 cidr을 별도로 설정했을 경우, 수정이 필요합니다.
# Tigera Calico 연산자와 사용자 정의 리소스 정의를 설치
$ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml

# 필요한 사용자 정의 리소스를 생성하여 Calico를 설치
$ wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml

# 원래 기본대역대는 192.168.0.0/16 이라서 설정한 값 10.244.0.0/16으로 변경
$ sed -i 's/192\.168\.0\.0\/16/10.244.0.0\/16/g' custom-resources.yaml

# kubectl 적용
$ kubectl apply -f custom-resources.yaml

# 확인 (시간이 좀 걸린다. 시간이 지나면 STATUS가 Ready로 변한다.)
$ kubectl get nodes

7. Worker node 구성

7.1 Worker node 클러스터 가입

Master node에서 kubeadm init을 통해 생성한 join을 이용하여 worker node 등록

  • worker node1, worker node2 둘다 적용
kubeadm join 192.168.111.123:6443 --token 57z3wr.olafcjal4e7j8tp9 \
        --discovery-token-ca-cert-hash sha256:39d9b89986fe769bd7aeb166c61eb407274a49dd8058fd16a416c768d0ada738

8. 최종확인

8.1 Master node에서 상태 확인

# Master node1과 worker node1과 worker node2: 총 3대
$ sudo kubectl get node

9. References

  1. jbground blog
  2. majjangjjang blog
  3. inflearn q&a
  4. k8s docs
profile
기록하지 않으면 기록되지 않는다.

0개의 댓글