RockyLinux(CentOS 8) 에서 Kubernetes 설치하기
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
사전 준비
모든 master/worker node 에 아래 내용이 반영되어 있어야 합니다.
- sudo 계정생성
- 2G 이상의 메모리
- 2 CPU core 이상
- 방화벽 off, 보안그룹 설정(AWS인 경우)
- Swap off (필수)
sudo 계정생성
useradd -d /home/username username
echo "password" | passwd username --stdin
chmod 700 /usr/bin/su
sed -ie '/wheel/s/$/\:username/' /etc/group
방화벽 off
개발서버라면 아래의 방법으로 방화벽을 disable 해주면 된다.
sudo systemctl stop firewalld && sudo systemctl disable firewalld
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
운영서버라면 아래에서 설명하는 방식으로 필요한 포트만 오픈해 준다.
Swap off
sudo swapoff -a
sudo sed -i -e '/swap/d' /etc/fstab
hosts 파일 수정(옵션)
vi /etc/hosts
---------------------------
172.16.0.101 node-01
172.16.0.102 node-02
172.16.0.103 node-03
172.16.0.104 node-04
172.16.0.105 node-05
---------------------------
Docker, containerd 설치 (모든 master, worker node)
Docker 설치
RockyLinux 는 통상적인 CentOS 방식으로 설치가 되지 않고 아래 방식을 설치해야 한다.
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf update
# 충돌나는 패키지를 교체한다.(ex, podman)
sudo dnf install -y docker-ce docker-ce-cli containerd.io --allowerasing
docker --version
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
sudo usermod -aG docker 계정아이디
id 계정아이디
sudo mkdir -p /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 daemon-reload
sudo systemctl restart docker
containerd 설치
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
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=0
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
sudo dnf -y install kubelet kubeadm kubectl --disableexcludes=kubernetes epel-release
sudo systemctl enable --now kubelet
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo vi /etc/containerd/config.toml
---------------------------
......
[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]
SystemdCgroup = true
......
---------------------------
sudo systemctl enable containerd
sudo systemctl restart containerd
Kubernetes 설치
방화벽 오픈
운영서버라면 아래의 방식으로 마스터/워커 노드의 방화벽을 오픈해 준다.
마스터
sudo firewall-cmd --add-port={80,443,6443,2379,2380,10250,10251,10252,30000-32767}/tcp --permanent
sudo firewall-cmd --reload
워커
sudo firewall-cmd --add-port={80,443,10250,30000-32767}/tcp --permanent
sudo firewall-cmd --reload
haproxy 설치(옵션)
1 번 서버에 haproxy 를 설치하고 16443 포트로 들어오는 요청을 1/2/3 번 서버로 분산시켜 줄 수 있다.
sudo dnf -y install haproxy
sudo vi /etc/haproxy/haproxy.cfg
---------------------------
frontend kubernetes-master-lb
bind 0.0.0.0:16443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
option tcplog
server node1 node-01:6443 check
server node2 node-02:6443 check
server node3 node-03:6443 check
---------------------------
sudo firewall-cmd --add-port={80,443,6443,2379,2380,10250,10251,10252,16443,30000-32767}/tcp --permanent
sudo firewall-cmd --reload
sudo systemctl enable haproxy
sudo systemctl restart haproxy
master node 설치
위 명령을 root 로 실행해서 마스터 노드를 추가할 수 있다.
아래 명령을 root 로 실행해서 워커 노드를 추가할 수 있다.
calico network 플러그인을 쓰기 때문에 192.168.0.0/16
는 고정값으로 설정해야 한다.
10.0.0.10
는 마스터 서버 접속 아이피이다.
# --apiserver-advertise-address=172.16.0.101 \
sudo kubeadm init \
--control-plane-endpoint "node-01:16443" \
--pod-network-cidr=192.168.0.0/16 \
--upload-certs
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join node-01:16443 --token qelzz0.dq8fp6bmq3t8ns31 \
--discovery-token-ca-cert-hash sha256:160c9543e023b599d6cb624e15dXXXXXXXXXXXXXXXXXXX \
--control-plane --certificate-key ec722f6286381b4b91f2f8022854XXXXXXXXXXXXX
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join node-01:16443 --token qelzz0.dq8fpXXXXXXXXXXX \
--discovery-token-ca-cert-hash sha256:160c9543e023b599d6cb624XXXXXXXXXXXX
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
vi calico.yaml
---------------------------
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16
---------------------------
kubectl apply -f calico.yaml
kubectl get pods -o wide -A
# calico-kube-controllers 가 Pending 상태이면 아래명령을 수행하자.
sudo systemctl restart containerd
아래 명령을 이용해 추가 마스터 노드를 추가할 수 있다.
sudo kubeadm join node-01:16443 --token qelzz0.dq8fp6bmq3t8ns31 \
--discovery-token-ca-cert-hash sha256:160c9543e023b599d6cb624e15dXXXXXXXXXXXXXXXXXXX \
--control-plane --certificate-key ec722f6286381b4b91f2f8022854XXXXXXXXXXXXX
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
# kubectl get nodes 가 Pending 상태이면 아래명령을 수행하자.
sudo systemctl restart containerd
마스터 노드에도 Pod 를 생성한다면 아래명령을 수행해 준다.
# kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
worker node 설치
아래 명령을 이용해 워커 노드를 추가할 수 있다.
sudo kubeadm join node-01:16443 --token qelzz0.dq8fpXXXXXXXXXXX \
--discovery-token-ca-cert-hash sha256:160c9543e023b599d6cb624XXXXXXXXXXXX
# kubectl get nodes 가 Pending 상태이면 아래명령을 수행하자.
sudo systemctl restart containerd
trouble shoot
토큰 재발급
토큰이 만료되면 아래 명령을 이용해 토큰을 재발급 받을 수 있다.
kubeadm token list
kubeadm token delete 토큰이름
kubeadm token create --print-join-command
다시 설치
sudo systemctl stop kubelet
sudo kubeadm reset
sudo rm -rf /etc/cni/net.d
sudo rm -rf $HOME/.kube/
# crate cluster
kubeadm init –pod-network-cidr=192.168.0.0/16 –cri-socket=/run/containerd/containerd.sock