쿠버네티스란 무엇일까요?🤨
한마디로 말해서 "컨테이너를 여러 노드에서 운영할 수 있도록 컨트롤 해주는 오케스트레이션 툴" 입니다.
여기서 말하는 "노드"란, 하나의 컴퓨터/서버를 지칭합니다.
Docker나 Docker Composer는 하나의 노드에서만 사용했었죠,
지금부터는 여러대의 노드를 사용할 예정입니다. :)
여러가지 개념이 막 나오겠지만, 쿠버네티스는 기본적으로 컨테이너 런타임이 설치 되어있어야 합니다.
리눅스 환경에서 사용할 수 있는 쿠버네티스의 컨테이너 런 타임은 containerd, CRI-O, Docker 입니다.
저는 Docker 런타임을 설치하도록 합니다.
여기 를 클릭하여 도커 설치부터 확인할 수 있습니다.
저는 공식문서를 참고하여 Step by Step으로 설치를 보여드리도록 하겠습니다.!
제가 구성할 쿠버네티스 클러스터 구성도입니다. :)
1. 컨테이너 런타임(docker-ce) 설치
이제 컨테이너 런타임으로 Docker-ce를 더이상 사용하지 않습니다.
Containerd를 사용하며, https://github.com/containerd/containerd/blob/main/docs/getting-started.md 여기를 사용해서 Containerd 를 설치할 수 있습니다 :)
각 노드에 Docker-ce를 설치합니다.
모든 노드에 동일하게 작업 해주세요 :)
아래 더보기를 클릭하여 확인하세요🥳
Docker-ce 설치에 필요한 패키지를 설치합니다.
[root@kube-manager /]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
도커 리포지토리를 추가합니다.
[root@kube-manager /]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
이제 OS를 업데이트 하고 필요한 Docker-ce 패키지를 설치합니다.
[root@kube-manager /]# sudo yum update -y && sudo yum install -y containerd.io docker-ce docker-ce-cli
도커 설정파일이 담길 디렉터리를 만들어줍니다.
[root@kube-manager /]# sudo mkdir /etc/docker
그리고 아래 도커 데몬 설정파일을 작성합니다.
[root@kube-manager /]# 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",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
/etc/docker/daemon.json 파일이 잘 작성되었는지 확인합니다.
[root@kube-manager /]# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
자, 이제 모든 준비가 완료되었습니다.
도커를 재시작하고 부팅시 docker 서비스가 시작 되도록 설정합니다!
[root@kube-manager /]# sudo systemctl daemon-reload
[root@kube-manager /]# sudo systemctl restart docker
[root@kube-manager /]# sudo systemctl enable docker
여기까지 완료 되었으면 다음 단계로 넘어갑니다 :)
2. Kubeadm 설치 전 확인
설치하기 전, OS가 Centos 7 버전 이상, RAM 2GB 이상, 스왑 비 활성화를 확인 합니다.
쿠버네티스 설치 조건은 여기에 자세히 나와있으니, 다시한번 점검해보시기를 바랍니다. :)
모든 노드에 동일하게 작업 해주세요 :)
아래 더보기를 클릭하여 확인하세요🥳
2-1) OS 확인
먼저, OS의 버전을 확인합니다.
- Ubuntu 16.04 이상
- Debian 9 이상
- CentOS 7
- RHEL (Red Hat Enterprise Linux) 7
- Fedora 25 이상
- HypriotOS v1.0.1 이상
- Flatcar Container Linux (2512.3.0으로 테스트 됨)
저는 Centos 7 로 조건에 만족 합니다.
[root@kube-manager /]# rpm -qa | grep release
centos-release-7-7.1908.0.el7.centos.x86_64
centos-release-7-9.2009.0.el7.centos.x86_64
2-2) 메모리 확인
이제 RAM을 확인합니다.
[root@kube-manager /]# free -h
total used free shared buff/cache available
Mem: 3.6G 232M 1.5G 16M 1.9G 3.1G
Swap: 0B 0B 0B
그리고 여기에서 한가지 더 주의깊게 봐야할 부분은 swap 부분입니다.
Kubelet은 스왑을 사용하지 않으며, 비활성화 되어있어야 정상적으로 동작합니다.
만약 free 명령어 결과에 Swap 값이 나왔다면 아래 명령어로 스왑을 끄고, fstab에 스왑 부분을 주석 처리 합니다.
[root@kube-manager /]# swapoff -a
[root@kube-manager /]# cat /etc/fstab | grep swap
#/dev/mapper/cl-swap swap swap defaults 0 0
2-3) iptables 설정
iptables 를 설정하기 전에 br_netfilter 모듈이 로드 되었는지 확인합니다.
만약 아래처럼 안되어있다면 #sudo modprobe br_netfilter 명령어를 사용합니다.
[root@kube-manager /]# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
이제 iptables 설정을 넣어줍니다.
[root@kube-manager /]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
설정이 잘 되었는지 확인합니다.
[root@kube-manager /]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
이제, sysctl 명령어로 설정을 로드 합니다.
[root@kube-manager /]# sudo sysctl --system
2-4) SELinux 설정
SELinux를 사용하지 않습니다.
아래 명령어를 입력하여 SELinux를 끄고, 재부팅 되더라도 사용하지 않도록 설정을 변경합니다.
[root@kube-manager /]# sudo setenforce 0
[root@kube-manager /]# sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
설정파일 확인 시 아래 처럼 "SELINUX=permissive"로 나오면 됩니다. :)
[root@kube-manager /]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
이제 이번 단계는 완료 되었습니다.
다음 단계로 넘어갑니다!
3. Kubeadm 설치
각 노드에 dockeradm를 설치합니다.
위와 마찬가지로 모든 노드에 동일하게 작업 해주세요 :)
아래 더보기를 클릭하여 확인하세요🥳
먼저, 레포지토리를 등록합니다.
[root@kube-manager /]# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
잘 등록되었는지 확인해봅니다.
[root@kube-manager /]# cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
이제 진짜 설치해봅시다!
[root@kube-manager /]# sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
설치가 잘 되었는지 rpm명령어로 확인해봅시다. :) 설치가 잘 되었네요!
[root@kube-manager /]# rpm -qa | grep kube
kubeadm-1.19.4-0.x86_64
kubernetes-cni-0.8.7-0.x86_64
kubectl-1.19.4-0.x86_64
kubelet-1.19.4-0.x86_64
자, 이제 kubelet 데몬을 재시작 되더라도 사용할 수 있도록 enable 합니다.
[root@kube-manager /]# sudo systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
여기까지가 Kubenetes 설치 과정이었습니다.
다음 과정에서 컨트롤플레인 구성을 해봅시다!!