# swap 여부 확인
$ free -g
# swap이 활성화 되어 있을 경우 해제
$ swapoff -a
3. 컨테이너 런타임
쿠버네티스에서 주로 사용되는 컨테이너 런타임으로는 containerd와 CRI-O가 있습니다. 이번 쿠버네티스 구축 과정에서는 CRI-O를 컨테이너 런타임으로 채택하여 사용했습니다.
CRI-O 설치 및 설정
설치
⚠️ 폐쇄망(Offline) 환경의 경우 apt-get install 을 사용할 수 없기 때문에 온라인 환경(bastion)에서 apt download 와 apt-cache depends -i ~ 명령어를 이용하여 관련 패키지를 모두 받고 폐쇄망 환경으로 다운 받은 패키지를 모두 넘겨 설치하는 방식으로 진행했습니다.
cgroup은 호스트 리소스 자원에 대한 권한을 제한하고 격리시키는 것을 의미하며, cgroup driver는 cgroup을 관리하는 모듈을 의미합니다. cgroupfs driver는 파일 시스템 기반의 접근 방식을 사용하여 cgroup을 관리하며,사용자가 직접적으로 더 많은 제어를 가능하게 합니다. systemd driver는 cgroup과 시스템의 서비스 및 프로세스를함께 관리하며, cgroupfs에 비하여 조금 더통합적이고 자동화된 관리를 제공합니다.
4. 쿠버네티스 필수 패키지 설치
본문에서 쿠버네티스공식문서를 기반으로 이전 cri-o 설치 과정과 동일하게 패키지 다운로드 방식을 대입하여 진행했습니다.
2024년 3월 18일 기준, 공식문서의 방식을 따라서 설치를 진행할 경우 apt-get update시 '리포지터리에 릴리즈가 존재하지 않는다.'는 에러가 발생하고 있습니다. 공식문서에서 구글 클라우드의 공개 사이닝 키를 통한 apt 리포지터리를 추가하는 절차의 내용이 최신 사항으로 업데이트되지 않아 발생하는 문제임으로 링크를 참고하여 설치 진행하시면 됩니다.
Kubelet
노드에 배포되는 에이전트.
마스터의 API서버와 통신을 하며 노드가 수행해야 할 명령을 받아서 수행하고 노드의 상태 등을 마스터로 전달하는 역할을 합니다. (API 서버란 명령을 주고 받기 위해 쿠버네티스의 중심이 되는 서버를 의미합니다.)
Kubeadm
쿠버네티스 클러스터 구축을 위한 기본적인 도구
마스터 노드 생성 및 워커 노드 조인 등 클러스터를 구축하기 위한 기본적인 명령어들을 제공합니다.
Kubectl
구축된 쿠버네티스 클러스터에 대해 명령어를 실행하는 도구
애플리케이션 배포, 클러스터 리소스 검사 및 관리, 로그 조회 등 전반적인 클러스터 관리 작업을 수행하기 위한 명령어들을 제공합니다.
쿠버네티스 클러스터를 구성하는 모든 자원에 상기 패키지들을 복제하여 설치를 진행했습니다.
5. Local Registry 구축
쿠버네티스 클러스터를 구축 시 필요한 Docker image들이 몇가지 있습니다. 온라인 환경에서는 Docker hub와 같은 개방된 레지스트리를 통해 바로 pull 하여 실행 가능하지만 폐쇄망 환경에서는 불가능합니다. 이를 위해 별도의 private registry 구축이 필요하며 이번 설치 과정에서는 podman을 이용한 간단한 Local registry를 구축해보았습니다.
docker를 대신하여 podman을 사용한 이유는 docker가 보유한 기본 기능을 제공하면서 docker와는 다르게 데몬을 이용하지 않아 컨테이너들을 훨씬 더 안정적으로 실행할 수 있기 때문입니다. 자세한 내용 참고
Podman 설치
1. 이전 cri-o 설치 과정과 동일하게 온라인 환경에서 podman 패키지 및 의존 패키지를 다운로드
2. 다운로드 받은 패키지를 모든 마스터 노드에 전송해서 설치
3. 설치 상태 확인
master1:~$ sudo systemctl status podman
4. insecure 설정
모든 자원에 private registry를 실행시킬 마스터의 ip 주소를 insecure 로 설정하여 http 통신을 가능하게 합니다.
# 설정파일 수정
$ sudo vi /etc/containers/registries.conf
.
.
.
# insecure = true
# # Given the above, a pull of example.com/foo/image:latest will try:
# # 1. example-mirror-0.local/mirror-for-foo/image:latest
# # 2. example-mirror-1.local/mirrors/foo/image:latest
# # 3. internal-registry-for-example.net/bar/image:latest
# # in order, and use the first one that exists.[registries.insecure]
[registries.insecure]
registries = ['10.0.27.199:5000']
# registries = ['[내부IP]:[포트번호]']
...
# cri-o 재시작
$ systemctl restart crio