๐ค ํ ์คํธ ํ๊ฒฝ
Kubernetes : 1.32v
Master Node : Oracle linux 8.8
Worker Node : Ubuntu 20.04.6 LTS
๐ฅธ ๊ตฌ์ฑ
- ์์ ์์๋๋ก ์ค๋ช ํฉ๋๋ค.
- ๊ฐ ์์ ์์ ์์ธ ์ค๋ช ๋ฐ ์ฃผ์ ์ฌํญ์ ํจ๊ป ์ ๋ฌํฉ๋๋ค.
- ๊ทธ๋๋ก ๋ฐ๋ผ ํ์๋ฉด ํฐ ์ด๋ ค์ ์์ด ์ค์น ๋ฐ ์ฐ๊ฒฐํ ์ ์๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
๐ซก ์ค์ต ์ ์ดํดํ๊ธฐ
0. ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๊ธฐ ์ํด์๋ ์ต์ ๋ ๋์ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค.
1. ์ค์ต ์ ๊ฐ ์๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ์ด์์ฒด์ ์ ๋ํ ์ ๋ณด ํ์ธ์ด ํ์ํฉ๋๋ค.
2. ์ปจํ ์ด๋ ๋ฐํ์์ ์ค์นํด์ผํฉ๋๋ค.
3. kubeadm, kubelet, kubectl๊ณผ ๊ฐ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
- kubeadm์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ ๋๋ค.
- kubelet์ ๊ฐ ๋ ธ๋์ ์์ด์ ํธ์ด๋ฉฐ ๋ ธ๋ ๋ด Pod์ Container ๋ฑ์ ๊ด๋ฆฌํฉ๋๋ค.
- kubectl์ ์ฌ์ฉ์๊ฐ ํด๋ฌ์คํฐ๋ฅผ ์ ์ดํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(CLI) ๋๊ตฌ์ ๋๋ค.
- ์ค์น์ ๋ฐ๋ฅธ ์ด์์ฒด์ ๋ณ ์ค์น ๋ฐ ์ค์ ๋ฐฉ๋ฒ์ด ์์ดํฉ๋๋ค.
4. CNI ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค.
5. Master Node์ Worker Node๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
6. Test Pod๋ฅผ ๋์๋ด ๋๋ค.
[1] ๋ฆฌ๋ ์ค ๊ธฐ๋ณธ ์์
๐ซฅ ๊ฐ ์๋ฒ์ ์ด์ ์ฒด์ ํ์ธํ๊ธฐ
$ cat /etc/os-release
# Master Node ์ฉ ์๋ฒ ์ถ๋ ฅ ๋ด์ฉ
NAME="Oracle Linux Server"
VERSION="8.8"
...
# Worker Node ์ฉ ์๋ฒ ์ถ๋ ฅ ๋ด์ฉ
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
...
- Master Node๋ก ์ค์ ํ ์๋ฒ ์ด์์ฒด์ ๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ฆฌ๋ ์ค ์ด์์ฒด์ ๋ ์คํ ๋ฐ ์ฐ๊ฒฐ๊ณผ๋ ๋ฌด๊ดํ์ง๋ง ์ด์์ฒด์ ์ ์ข ๋ฅ๋ง๋ค ์ค์น ๋ฐฉ๋ฒ์ด ์์ดํ ์ ์์ผ๋ฏ๋ก ๋งจ ์ฒ์์ ํ์ธํ์ฌ ์์งํฉ๋๋ค.
์ค๋ผํด ๋ฆฌ๋ ์ค(Oracle Linux)
- Red Hat Enterprise Linux(RHEL)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฐฐํฌํ์ ๋๋ค.
- RPM ํจํค์ง ๊ด๋ฆฌ ์์คํ ๊ณผ yum/dnf ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐ๋ถํฌ(Ubuntu)
- ๋ฐ๋น์(Debian)์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฐฐํฌํ์ ๋๋ค.
- APT ํจํค์ง ๊ด๋ฆฌ ์์คํ ๊ณผ DEB ํจํค์ง ํฌ๋งท์ ์ฌ์ฉํฉ๋๋ค.
๐ซฅ ๊ฐ ์๋ฒ์ hostname ๋ณ๊ฒฝํ๊ธฐ
# hostname ๋ณ๊ฒฝํ๊ธฐ
$ sudo hostnamectl set-hostname <ํธ์คํธ ๋ค์>
# hostname ์ถ๋ ฅํ๊ธฐ
$ hostname
- hostname์ ๋ณ๊ฒฝํ๋ ์ด์ ๋ kube-api๊ฐ hostname์ ๊ธฐ๋ฐ์ผ๋ก ํต์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- node ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ๋ช ํํ๊ฒ ํ์ํ๊ธฐ ์ํด hostname์ ์ง์ ํด ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ซฅ ๋ฐฉํ๋ฒฝ ์ค์
## Oracle Linux
# ๊ธฐ์กด ๋ฐฉํ๋ฒฝ ๋ฆฌ์คํธ ํ์ธ
sudo firewall-cmd --zone=public --list-all
# ์ ์ฉ
sudo firewall-cmd --reload
## masternode
# kubernetes api server
sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
# etcd server
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
# kubelet api
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
# kube-scheduler
sudo firewall-cmd --permanent --zone=public --add-port=10259/tcp
# kube-controller-manager
sudo firewall-cmd --permanent --zone=public --add-port=10257/tcp
## worker node
# kubelet api
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
# nodeport services
sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
## masternode & worker node ๋ ๋ค
# CNI Plugin flannel
sudo firewall-cmd --permanent --zone=public --add-port=8472/udp
## Ubuntu์ ๊ฒฝ์ฐ ์๋ ๋ช
๋ น์ด ์ฐธ๊ณ
# ๊ธฐ์กด ๋ฐฉํ๋ฒฝ ๋ฆฌ์คํธ ํ์ธ
sudo ufw status
# ํฌํธ๋ฒํธ ์ ์ฐธ๊ณ
sudo ufw allow <port>/tcp
sudo ufw allow <port>:<port>/tcp
# ์ ์ฉ
sudo ufw reload
- ๋ฐฉํ๋ฒฝ์ด ์๋ ํ๊ฒฝ์์๋ ๋ฐ๋ก ํฌํธ๋ฅผ ๊ฐ๋ฐฉํด์ผ ํฉ๋๋ค.
- ๋ฆฌ๋ ์ค ์ด์์ฒด์ ๋ณ ๋ฐฉํ๋ฒฝ ์ค์ ์ด ์์ดํ๋ฏ๋ก ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค.
- ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด ๊ฐ์ ๋คํธ์ํฌ ์ค์ ์์ ํธ๋ํฝ ํ์ฉ์ ์ด์ด์ฃผ์ ์ผ ํฉ๋๋ค.
[2] ์ปจํ ์ด๋ ๋ฐํ์ ์ค์น
๐ซฅ ๋์ปค ์ค์น
https://docs.docker.com/engine/install/
Install
Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.
docs.docker.com
- ํ๋๊ฐ ๋ ธ๋์์ ์คํ๋ ์ ์๋๋ก ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋์ ์ปจํ ์ด๋ ๋ฐํ์์ ์ค์นํด์ผ ํฉ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๋ Containerd, CRI-O ๋ฑ ์ปจํ ์ด๋ ๋ฐํ์์ ์ง์ํฉ๋๋ค.
- ์ ๋ ์ปจํ ์ด๋ ๋ฐํ์์ผ๋ก ๊ฐ์ฅ ํํ๊ฒ ์ฌ์ฉ๋๋ Docker๋ฅผ ์ค์นํ์ต๋๋ค.(์ฌ์ค ์ด๋ฏธ ์ฌ์ฉ ์ค์ ๋๋ค)
- ์ค์น๋ ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ ๊ฐ ์ด์์ฒด์ ์ ๋ง๋ ์ค์น ๊ณผ์ ์ ์งํํ๋ฉด ๋ฉ๋๋ค.
- ์ฐธ๊ณ ๋ก Oracle linux์ ๊ฒฝ์ฐ ์๋์ ์ค์น ๊ณผ์ ์ ๋ณด์๋ฉด ๋ฉ๋๋ค.
- Ubuntu์ ๊ฒฝ์ฐ ์๋์ ์ค์น ๊ณผ์ ์ ๋ณด์๋ฉด ๋ฉ๋๋ค.
๐จ ๊ทธ๋ฐ๋ฐ, ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ด ์์ต๋๋ค.
๐ซฅ CRI
- ์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ ์ด๋ ๋ฐํ์๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํด CRI(Container Runtime Interface)๋ผ๋ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ทธ๋ฐ๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค๋ 1.24 ๋ฒ์ ์ดํ๋ก Docker๋ฅผ ์ง์ ์ง์ํ์ง ์์ต๋๋ค(์ฆ, Docker ์์ฒด๋ Kubernetes์ ํธํ๋์ง ์์ต๋๋ค)
- ์ฟ ๋ฒ๋คํฐ์ค 1.24 ๋ฒ์ ์ด์์์ Docker๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด cri-dockerd๋ผ๋ ์ด๋ํฐ๋ฅผ ์๋ก ์ถ๊ฐํด์ผ๋ง ์ฟ ๋ฒ๋คํฐ์ค์์ ๋์ปค๋ฅผ ๋ฐํ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋, ์ฑ๋ฅ๊ณผ ํธํ์ฑ์์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
- ๋ฐ๋ผ์, contaierd๋ CRI-O๋ฅผ CRI๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ซฅ ๋์ปค ์์ง๊ณผ Containerd
- ์ ์ ๊ฒฝ์ฐ ํ์ฌ์ ์ง์์ ์ด๋ฏธ ๋์ปค๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ ๋ณด๊ณ ๊ณ์ ๋ง์ ๋ถ๋ค ์ญ์ ์ด๋ฏธ ๋์ปค๋ฅผ ์ฌ์ฉ์ค์ผ ๊ฒ์ผ๋ก ์๊ฐ๋ฉ๋๋ค.
- ๋์ปค ์์ง์ ๋ด๋ถ์ ์ผ๋ก containerd๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ์ฆ, ๋์ปค ์์ฒด๊ฐ containerd๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
- ๋ฐ๋ผ์ ๋์ปค๋ฅผ ์ค์นํ๋ฉด containerd๋ ์๋์ผ๋ก ์ค์น๋๊ณ ์คํ๋ฉ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก containerd์ ํธํ๋๋ฏ๋ก, ๋์ปค ์ค์น ํ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ containerd ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๊ด๋ จ ๊ณต์ ๋ฌธ์
Installing kubeadm
This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.32. If
kubernetes.io
๐ซฅ IPv4๋ฅผ ํฌ์๋ฉํ์ฌ iptables๊ฐ ๋ธ๋ฆฌ์ง ๋ ํธ๋ํฝ์ ๋ณด๊ฒ ํ๊ธฐ
# overlay์ br_netfilter ๋ชจ๋ ๋ก๋, ์ฌ๋ถํ
์์๋ ์ค์ ์ ์ฉํ๋ ค๋ฉด ์ค์ ํ์ผ ๋ง๋ค์ด์ผํจ
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# ์ ์ฉ
sudo modprobe overlay
sudo modprobe br_netfilter
# ์ ์ฉ ํ์ธ
sudo lsmod | grep br_netfilter
# ์ถ๋ ฅ
br_netfilter xxxxx 0
# 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
- ์ด ์์ ์ Kubernetes ํด๋ฌ์คํฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฅ์ด ์ ๋๋ก ๋์ํ๋๋ก ํ์ํ ์ปค๋ ๋ชจ๋์ ๋ก๋ํ๊ณ , ์ปค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ์ฌ ๋คํธ์ํฌ ํํฐ๋ง ๋ฐ IP ํฌ์๋ฉ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ์ค์ ์ ๋๋ค.
overlay์ br_netfilter ๋ชจ๋ ๋ก๋
- overlay: Kubernetes์์ ์ปจํ ์ด๋ ๋คํธ์ํน์ ์ํ ๋คํธ์ํฌ ๋๋ผ์ด๋ฒ์ ๋๋ค.
- br_netfilter: ๋ธ๋ฆฌ์ง ๋คํธ์ํฌ์์ iptables ํํฐ๋ง์ ํ์ฑํํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋์ ๋๋ค.
- ์ด ๋ ๋ชจ๋์ /etc/modules-load.d/k8s.conf ํ์ผ์ ์ถ๊ฐํ๊ณ modprobe ๋ช ๋ น์ด๋ก ๋ก๋ํ์ฌ Kubernetes์ ๋คํธ์ํน ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋ํ๊ฒ ๋ง๋ญ๋๋ค.
sysctl ํ๋ผ๋ฏธํฐ ์ค์
- net.bridge.bridge-nf-call-iptables: Kubernetes ๋คํธ์ํน์์ iptables ๊ท์น์ ์ ์ฉํ๊ธฐ ์ํด ์ค์ ํฉ๋๋ค.
- net.bridge.bridge-nf-call-ip6tables: IPv6์ ๊ฒฝ์ฐ๋ ๋์ผํ ๋คํธ์ํฌ ํํฐ๋ง์ ์ ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค.
- net.ipv4.ip_forward: ์ปจํ ์ด๋ ๊ฐ ํต์ ์ ์ํด IP ํฌ์๋ฉ์ ํ์ฑํํฉ๋๋ค.
sysctl --system
- ์์์ ์ค์ ํ ์ปค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฆ์ ์ ์ฉํ๊ธฐ ์ํด sysctl --system ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ ์ปค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ถํ ์์ด ์ฆ์ ์ ์ฉ๋ฉ๋๋ค.
๐ ๊ด๋ จ ๊ณต์ ๋ฌธ์
์ปจํ ์ด๋ ๋ฐํ์
์ฐธ๊ณ : Dockershim์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆด๋ฆฌ์ค 1.24๋ถํฐ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ก์ ํธ์์ ์ ๊ฑฐ๋์๋ค. ๋ ์์ธํ ๋ด์ฉ์ Dockershim ์ ๊ฑฐ FAQ๋ฅผ ์ฐธ๊ณ ํ๋ค. ํ๋๊ฐ ๋ ธ๋์์ ์คํ๋ ์ ์๋๋ก ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋์ ์ปจ
kubernetes.io
๐ซฅ docker daemon.json
$ sudo vi /etc/docker/daemon.json
# ์๋ ๋ด์ฉ ์ ์ฅ
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
# ๋์ปค ์ฌ์์
$ sudo systemctl restart docker
# ํ์ธ
$ sudo docker info
Storage Driver: overlay2
...
Cgroup Driver: systemd
- containerd๋ Docker์ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ Docker ์ค์ ์ ์์ ํ์ฌ Cgroup Driver๋ฅผ systemd๋ก ๋ณ๊ฒฝํ๋ฉด Kubernetes ํ๊ฒฝ์์์ ํธํ์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- systemd๋ Kubernetes 1.20 ์ดํ ๊ถ์ฅ๋๋ ๋ณด๋ค ์์ ์ ์ด๊ณ ์ผ๊ด๋ Cgroup Driver์ ๋๋ค.
- ํ์ฌ ์ค์ ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด sudo docker info ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด, ๋ณ๊ฒฝ ์ ์๋ Cgroup Driver: cgroupfs๋ก ํ์๋ฉ๋๋ค.
- ์ด๋ฅผ systemd๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด Docker์ ์ค์ ํ์ผ์ ์์ ํด์ผ ํ๋ฉฐ, ์ด๊ธฐ์๋ ํด๋น ์ค์ ํ์ผ(`/etc/docker/daemon.json`)์ด ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์, ์ด ํ์ผ์ ์๋ก ์์ฑํ๊ฑฐ๋ ํธ์งํ์ฌ ์๋์ ๊ฐ์ด ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
๐ซฅ containerd systemd cgroup ๋๋ผ์ด๋ฒ ๊ตฌ์ฑ
$ containerd config default | sudo tee /etc/containerd/config.toml
$ sudo vi /etc/containerd/config.toml
# ์ฐพ์์ flase -> true๋ก ๋ณ๊ฒฝ
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# ์ฌ์์
$ sudo systemctl restart containerd
- ์ด ์์ ์ containerd๊ฐ systemd๋ฅผ cgroup driver๋ก ์ฌ์ฉํ๋๋ก ๋ช ์ํ๋ ๊ฒ์ ๋๋ค.
- ์ต์ด์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์งํํ๋ฉด ํด๋ฌ์คํฐ ์ค์น ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ด๊ธฐ ์ค์ ์ ํ๊ณ ํ์ํ ๋ถ๋ถ๋ง ๋ฐ๊ฟ๋๋ค.
[3] ๋ฆฌ๋ ์ค ์ข ๋ฅ๋ณ ์ค์
โผ๏ธ ์๊ฐ์ด ์ง๋ ๊ณต์๋ฌธ์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด ์ค์น ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก ๋ฐ๋์ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค.
๐งค Debian ๊ธฐ๋ฐ(Ubuntu ๋ฑ)
$ sudo apt-get install -y apt-transport-https ca-certificates curl gpg
- ์ด ๋ช ๋ น์ด๋ apt๋ฅผ ํตํด HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ , ํ์ํ ์ธ์ฆ์์ ๋๊ตฌ๋ฅผ ์ค์นํฉ๋๋ค.
- apt-transport-https: HTTPS ํ๋กํ ์ฝ์ ํตํด APT ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๊ฒ ํด ์ค๋๋ค.
- ca-certificates: ์์ ํ HTTPS ์ฐ๊ฒฐ์ ์ํด ํ์ํ ์ธ์ฆ์๋ค์ ์ค์นํฉ๋๋ค.
- curl: URL์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋๊ตฌ์ ๋๋ค.
- gpg: GPG ํค ๊ด๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ๋ก, ํจํค์ง์ ์๋ช ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๐ซฅ Kubernetes ์ ์ฅ์์ GPG ํค ๋ค์ด๋ก๋
## Ubuntu 22.04 ์ด์ ๋ฒ์ ์๋ /etc/apt/keyrings๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ๊ณ ์งํํด์ผํ๋ค.
# sudo mkdir -p -m 755 /etc/apt/keyrings
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- Kubernetes ์ ์ฅ์์ GPG ํค๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์์คํ ์ ์ ์ฅํฉ๋๋ค.
๐ซฅ Kubernetes์ APT ํจํค์ง ์ ์ฅ์ ์ถ๊ฐ
$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
- Kubernetes์ APT ํจํค์ง ์ ์ฅ์๋ฅผ ์์คํ ์ ์ถ๊ฐํฉ๋๋ค.
- ์ด ์ ์ฅ์์์ Kubernetes ๊ด๋ จ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋๋ก /etc/apt/sources.list.d/ ๋๋ ํฐ๋ฆฌ์ kubernetes.list ํ์ผ์ ์์ฑํฉ๋๋ค.
๐ซฅ kubeadm, kubelet, kubectl ์ค์น
# ๋ฆฌ๋
์ค ํจํค์ง๋ฅผ ์
๋ฐ์ดํธ ํฉ๋๋ค.
$ sudo apt-get update
# Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ์ํ 3๊ฐ์ง ์ฃผ์ ํจํค์ง์ธ kubelet, kubeadm, kubectl์ ์ค์นํฉ๋๋ค.
$ sudo apt-get install -y kubelet kubeadm kubectl
# kubelet, kubeadm, kubectl ํจํค์ง๋ค์ ์๋ ์
๋ฐ์ดํธ์์ ์ ์ธ์์ผ, ์
๋ฐ์ดํธ๋ ์
๊ทธ๋ ์ด๋ ์ค์ ํด๋น ํจํค์ง๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํฉ๋๋ค.
$ sudo apt-mark hold kubelet kubeadm kubectl
- kubelet
- ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋์์ ์คํ๋๋ Kubernetes์ ์ฃผ์ ์ปดํฌ๋ํธ์ ๋๋ค.
- Kubernetes์ Pod์ ์คํํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
- kubeadm
- Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ์ค์ ํ๋ ๋๊ตฌ์ ๋๋ค.
- ํด๋ฌ์คํฐ์ Control Plane ๊ตฌ์ฑ, ๋ ธ๋ ์ถ๊ฐ ๋ฑ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- kubectl
- Kubernetes๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ CLI ๋๊ตฌ์ ๋๋ค.
- Kubernetes ํด๋ฌ์คํฐ์ ์ํธ์์ฉํ๋ฉฐ ๋ฆฌ์์ค ๊ด๋ฆฌ, ์ํ ํ์ธ ๋ฑ์ ์ํํฉ๋๋ค.
๐ซฅ kubelet ํ์ฑํ์ ์ค์น ํ์ธ์ผ๋ก ๋์ด๊ฐ์ธ์.
โ๏ธ RedHat ๊ธฐ๋ฐ(Oracle Linux, CentOS ๋ฑ)
๐ซฅ SELinux ๋นํ์ฑํ
$ sudo setenforce 0
$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
SELinux์ ์ปจํ ์ด๋ ๋ฐํ์์ ์ถฉ๋
- SELinux(Security-Enhanced Linux)๋ ํ์ผ, ํ๋ก์ธ์ค, ๋คํธ์ํฌ ๋ฑ์ ๋ํด ๊ฐ๋ ฅํ ์ ๊ทผ ์ ์ด๋ฅผ ์ ๊ณตํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์์ ์ปจํ ์ด๋ ๋ฐํ์์ ์ผ๋ฐ์ ์ผ๋ก ์ปจํ ์ด๋ ๋ด๋ถ์ ์ธ๋ถ ๊ฐ์ ๋ฆฌ์์ค(ํ์ผ ์์คํ , ๋คํธ์ํฌ ๋ฑ)๋ฅผ ๊ณต์ ํฉ๋๋ค.
- SELinux๊ฐ ํ์ฑํ๋์ด ์์ผ๋ฉด, ์ปจํ
์ด๋ ๋ฐํ์์ด ์ด๋ฌํ ๊ณต์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค ํ ๋ ๊ถํ ๊ฑฐ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- Pod์์ ๊ณต์ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ SELinux์ ๋ณด์ ์ปจํ ์คํธ๊ฐ ์ถฉ๋ํ์ฌ ํ์ผ ์์คํ ์ ์ ๊ทผํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ(CNI)์ด๋ kubelet์ด SELinux ์ ์ฑ ์ ์ํด ์ฐจ๋จ๋ ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค.
๐ซฅ ์ค์ ๋นํ์ฑํ
## ์ผ์์ ๋นํ์ฑํํ๊ธฐ(์ด๊ฑด ์ฌ๋ถํ
์ ์ด๊ธฐํ๋๋ฏ๋ก ์๋ ์๋ ๋นํ์ฑํ๋ฅผ ์ฌ์ฉํ์)
# ์ค์ ์ํ ํ์ธ
$ free -h
# ์ค์ ์ผ์์ ๋นํ์ฑํ
$ sudo swapoff -a
# ์ค์ ์ํ ์ฌํ์ธ
$ free -h
# ์ถ๋ ฅ
Swap: 0B 0B 0B
######################################################################
## ์๋ ๋นํ์ฑํ
# ๋ถํ
์ ์๋์ผ๋ก ๋นํ์ฑํํ๋ ๊ฒ์ด ์ข๋ค.
$ sudo vi /etc/fstab
# ์ฃผ์์ฒ๋ฆฌ ํ๊ธฐ
# /.swapfile none swap sw,comment=cloudconfig 0 0
# ์์คํ
์ฌ๋ถํ
$ sudo reboot
# ์ค์ ์ํ ์ฌํ์ธ
$ free -h
# ์ถ๋ ฅ
Swap: 0B 0B 0B
- kubelet์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ธ๋์์ ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ฑํ๋์ด ์๋ ๊ฒฝ์ฐ ์คํ์ ๊ฑฐ๋ถํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
- ์ค์(Swap)์ด๋?
- ์ค์์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ(RAM)๊ฐ ๋ถ์กฑํ ๋ ๋์คํฌ์ ํน์ ๊ณต๊ฐ์ ์์๋ก ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณด์กฐํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
- ํ์ง๋ง Kubernetes๋ ์์ ์ฑ๊ณผ ์ฑ๋ฅ ์ด์ ๋ก ์ค์ ์ฌ์ฉ์ ํ์ฉํ์ง ์์ต๋๋ค. ์ค์์ด ํ์ฑํ๋์ด ์์ผ๋ฉด Kubernetes ํด๋ฌ์คํฐ ์ด๊ธฐํ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ ๊ด๋ จ ๊ณต์ ๋ฌธ์
Installing kubeadm
This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.32. If
kubernetes.io
๐ซฅ kubeadm, kubelet, kubectl ์ค์น
Kubernetes Repository ์ค์
$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
- Kubernetes์ ๊ณต์ ํจํค์ง ์ ์ฅ์๋ฅผ ์ค์ ํฉ๋๋ค.
- Kubernetes ์ค์น์ ๊ด๋ จ๋ ํจํค์ง๋ฅผ ์์คํ ์์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ์ ์ฅ์๋ฅผ ๋ฑ๋กํ๋ ๋จ๊ณ์ ๋๋ค.
- exclude: ํน์ ํจํค์ง๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋์ง ์๋๋ก ์ ์ธํฉ๋๋ค.(์ฌ๊ธฐ์ kubelet, kubeadm, kubectl ๋ฑ ์ ์ธ)
- exclude๋ฅผ ์ค์ ํ๋ ์ด์ ๋
- ์ ์ฅ์ ์ถฉ๋ ๋ฐฉ์ง: ์๋ํ์ง ์์ ์ ์ฅ์๋ ์ค๋๋ ํจํค์ง์์ ์ค์น๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ํต์ : ์๋ ์ ๋ฐ์ดํธ๋ก ์ธํด ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์๋ฐฉํฉ๋๋ค.
- ์๋ ๊ด๋ฆฌ ๊ฐ์ : ๋ช ์์ ์ผ๋ก๋ง ์ค์น/์ ๋ฐ์ดํธํ๋๋ก ๊ด๋ฆฌ์ ๋ช ํ์ฑ์ ์ ๊ณตํฉ๋๋ค.
Kubernetes ๊ตฌ์ฑ ์์ ์ค์น
# ๋ฆฌ๋
์ค ํจํค์ง๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
$ sudo dnf update
$ sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- ์ด ๋จ๊ณ์์ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ํต์ฌ ๊ตฌ์ฑ ์์๋ค์ ์ค์นํฉ๋๋ค.
- kubelet
- ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋์์ ์คํ๋๋ Kubernetes์ ์ฃผ์ ์ปดํฌ๋ํธ์ ๋๋ค.
- Kubernetes์ Pod์ ์คํํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
- kubeadm
- Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ์ค์ ํ๋ ๋๊ตฌ์ ๋๋ค.
- ํด๋ฌ์คํฐ์ Control Plane ๊ตฌ์ฑ, ๋ ธ๋ ์ถ๊ฐ ๋ฑ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- kubectl
- Kubernetes๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ CLI ๋๊ตฌ์ ๋๋ค.
- Kubernetes ํด๋ฌ์คํฐ์ ์ํธ์์ฉํ๋ฉฐ ๋ฆฌ์์ค ๊ด๋ฆฌ, ์ํ ํ์ธ ๋ฑ์ ์ํํฉ๋๋ค.
- --disableexcludes=kubernetes
- exclude ๋ ํจํค์ง๋ฅผ ๊ฐ์ ๋ก ์ค์นํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
- ํน์ ์ ์ฅ์(Kubernetes ๊ณต์ ์ ์ฅ์)์์๋ง ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ฐ์ ํ๋ฉฐ, ๊ด๋ฆฌ์๊ฐ ์๋์ ์ผ๋ก ์์ ์ ์ํํ์์ ๋ณด์ฅํฉ๋๋ค.
[4] kubelet ํ์ฑํ์ ์ค์น ํ์ธ
๐ซฅ kubelet ํ์ฑํ
$ sudo systemctl enable --now kubelet
- kubelet ์๋น์ค๋ฅผ ๋ถํ ์ ์๋ ์์๋๋๋ก ์ค์ ํ๊ณ , ์ฆ์ ์์ํ๋๋ก ํ๋ ๋ช ๋ น์ด์ ๋๋ค.
kubelet ํ์ธ
$ sudo systemctl status kubelet
- ์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด kubelet์ด activiting ์ํ์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์์ง kubeadm์ ์ด๊ธฐํํ์ง ์์ ๊ณ์ ์คํ ์๋ ์ค์ธ ์ํ์ธ ๊ฒ์ ๋๋ค.
[5] master, worker node ์ฐ๊ฒฐ
๐ซฅ master node
kubeadm ์ด๊ธฐํ(CNI ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋ฅธ ์ต์ )
# flannel
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# ์ถ๋ ฅ
$ kubeadm join ***.***.***.***:6443 --token <ํ ํฐ๊ฐ>
# ์๋ ๋ช
๋ น์ด๋ก ๋ฆฌ์
ํ๊ณ ๋ค์ํ ์๋ ์์
$ sudo kubeadm reset
- 10.244.0.0/16์ Flannel CNI(Container Network Interface) ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ๊ธฐ๋ณธ ๊ฐ์
๋๋ค.
- Flannel์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ CNI ํ๋ฌ๊ทธ์ธ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค.
- CNI ํ๋ฌ๊ทธ์ธ์ Kubernetes ํด๋ฌ์คํฐ ๋ด์์ Pod ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ค์ ํ๊ณ , ์ด CIDR ๋ฒ์๋ ๊ฐ Pod์ ํ ๋น๋ IP ์ฃผ์ ๋ฒ์๋ฅผ ์ ์ํฉ๋๋ค.
- ๋งจ ๋ง์ง๋ง์ worker node์ ์ ๋ ฅํ์ฌ ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ ์ ์๋ join ๋ช ๋ น๋ฌธ์ด ๋์ค๋ฏ๋ก ์ด๋ฅผ ๋ณต์ฌํด ๋ก๋๋ค.
kubectl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ณ๊ฒฝ
$ mkdir -p $HOME/.kube
# reset ํ ์ฌ์
๋ ฅํ๋ ๊ฒฝ์ฐ์๋ yes๋ก ์
๋ ฅํ๋ฉด ๋จ
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
## k8s ์นํธ์ํธ
# ํญ์ผ๋ก ์๋ ๊ฒ์ ๋์์ค ์๋ฅผ ๋ค์ด -n kube-system์ k๋ง ์
๋ ฅํ๊ณ tabํ๋ฉด ์๋์ผ๋ก ์ฑ์์ง
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
# kubectl ๋์ k๋ง ์
๋ ฅํด๋ ๋จ
$ echo "alias k=kubectl" >> ~/.bashrc
$ echo "complete -o default -F __start_kubectl k" >> ~/.bashrc
# ์ ์ฉ
$ source ~/.bashrc
# ์ ๋ช
๋ น์ ์ํํ ํ ํ๋๋ฅผ ์กฐํํด๋ณด์.
$ kubectl get po -A or k get po -A
- ์ฑ๊ณต์ ์ผ๋ก ์ค์น๋์๋ค๋ฉด ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ํ ํ๋๋ฅผ ์กฐํ์ ์ ์์ ์ผ๋ก ์กฐํ๋ ๊ฒ์ ๋๋ค.
$ k get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-xxxxxxxxx-xxxxxx 0/1 Pending 0 4m19s
kube-system coredns-xxxxxxxxx-xxxxxx 0/1 Pending 0 4m19s
kube-system etcd-host-name 1/1 Running 0 4m26s
kube-system kube-apiserver-host-name 1/1 Running 0 4m26s
kube-system kube-controller-manager-host-name 1/1 Running 0 4m26s
kube-system kube-proxy-xxxxx 1/1 Running 0 4m19s
kube-system kube-scheduler-host-name 1/1 Running 0 4m26s
- coredns์ ๊ฒฝ์ฐ CNI ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผ Pending์์ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
CNI ํ๋ฌ๊ทธ์ธ(flannel) ์ค์น
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- flannel์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ถฉ์คํ ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌ์กฐ์ ๋๋ค.
๐ซฅ worker node
masternode์ ์ฐ๊ฒฐ
# ๋ง์คํฐ ๋
ธ๋์์ kubeadm init์ ํตํด ๋์จ join ๋ช
๋ น๋ฌธ์ ๋ณต์ฌํด์ ์คํ
kubeadm join ***.***.***.***:6443 --token <ํ ํฐ๊ฐ>
- ์ด๋ ์ฐ๊ฒฐ์ด ๋์ง ์๋๋ค๋ฉด ๋ฐฉํ๋ฒฝ์, ํด๋ผ์ฐ๋์ ๊ฒฝ์ฐ ๊ฐ์ ๋คํธ์ํฌ ์ค์ ๊น์ง ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ จ ํฌํธ๊ฐ ์ด๋ ค์๋์ง ํ์ธํด ๋ด ๋๋ค.
masternode์์ ์ฐ๊ฒฐ ํ์ธ
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2m11s v1.32.0
worker Ready <none> 20s v1.32.0
[6] testPod ๋์๋ณด๊ธฐ
$ kubectl run testpod --image=nginx
pod/testpod created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 8s
์ฐธ๊ณ
https://github.com/kubernetes/website/commit/f73647531dcdade2327412253a5f839781d57897/
https://diamond-goose.tistory.com/65
https://nginxstore.com/blog/kubernetes/์ฟ ๋ฒ๋คํฐ์ค-์ค์น-๋ฐฉ๋ฒ-vm-ํ๊ฒฝ-ํํ ๋ฆฌ์ผ/#2-4
https://yes-admit.tistory.com/123
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
'[DevOps] > Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Docker image -> Containerd image๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ (2) | 2025.01.07 |
---|---|
์ธ๋ถ์์ HTTP๋ก Kubernetes API ์์ฒญํ๊ธฐ(1.24v ์ด์) (0) | 2024.12.30 |
CKA ๊ธฐ์ถ ๋ฌธ์ ๋ณต๊ธฐ ๋ฐ ์ ๊ทผ๋ฒ ์ ๋ฆฌ[24.11.24 ์์] (0) | 2024.11.27 |
CKA ์ํ ์ ์ -> ์์ -> ํฉ๊ฒฉ ํ๊ธฐ(1ํธ ํฉ๊ฒฉ) (9) | 2024.11.26 |
kubernetes - Node Update(drain, cordon, uncordon) (0) | 2024.01.20 |