이번 포스팅은 Ubuntu와 같은 Debian Linux에서 쿠버네티스(kubernetes)를 설치하는 방법입니다.
본 포스팅에서는 kubeadm을 이용해 쿠버네티스를 설치하는 방법을 다룹니다.
또한 설치 버전은 v1.29, v1.28에 호환됩니다.
공식 설치 문서: https://kubernetes.io/docs/setup/production-environment/tools/
사전 작업
먼저 kubernetes를 설치하기 위해서 다음과 같은 요건을 만족해야 합니다.
- Debian 또는 Red Hat 기반의 Linux host가 설치되어있는 상태.
- 2 Core 이상의 CPU & 2GB 이상의 메모리.
- 고유한 hostname, MAC 주소, product_uuid.
- 네트워크가 연결되어있는 상태이자, 특정 port 번호들이 개방되어 있어야 함.
- 메모리 Swap 비활성화.
아래 명령어를 터미널에 입력해 사전 작업을 수행합니다.
# 방화벽 해제(포트 개방)
sudo ufw disable
# 스왑 비활성화
free -h
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
# timezone 설정
sudo timedatectl set-timezone "Asia/Seoul"
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd.service
컨테이너 런타임 설치
파드 내에서 컨테이너를 실행하기 위해서 쿠버네티스는 container runtime을 필요로 합니다.
설치할 수 있는 컨테이너 런타임 목록 다음과 같습니다.
- containerd
- CRI-O
- cri-dockerd
먼저 런타임 설치 전 iptables를 세팅해주어야 합니다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 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
본 포스팅에서 설치하는 컨테이너 런타임은 containerd 입니다.
다른 컨테이너 런타임 설치는 공식 문서를 참조하시거나, 추후에 포스팅하겠습니다.
먼저 containerd github의 설치문서를 참고하면 여러가지 방법으로 설치가 가능합니다.
여기서는 간편하게 apt 패키지 매니저를 통해 도커에서 사용하는 containerd.io 패키지로 설치하겠습니다.
먼저 Docker의 apt repository에 대한 setup을 수행합니다.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
그 다음 도커 패키지를 설치해줍니다. 이 때 containerd.io 패키지만 설치해도 됩니다.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
패키지 설치 후 containerd의 설정파일(/etc/containerd/config.toml)에 cri가 비활성화 되어있기 때문에
cri를 활성화 하고 containerd를 재시작합니다.
sudo sed -i 's/^disabled_plugins/#disabled_plugins/' /etc/containerd/config.toml
sudo systemctl restart containerd
# crictl로 node, container 등 debugging 하기 위해 환경변수 setting
sudo crictl config --set runtime-endpoint=unix:///var/run/containerd/containerd.sock --set image-endpoint=unix:///var/run/containerd/containerd.sock
여기까지 수행하면 컨테이너 런타임 설치가 완료됩니다.
kubeadm, kubelet, kubectl 설치
다음으로 쿠버네티스의 코어인 kubeadm, kubelet, kubectl을 설치합니다.
각 패키지는 다음과 같은 역할을 수행합니다.
- kubeadm: 클러스터를 bootstrap하도록 명령.
- kubelet: 클러스터의 모든 시스템에서 실행되며 pod, container 시작과 같은 작업을 수행.
- kubectl: 클러스터에 명령어를 입력하는 커맨드 라인 유틸리티.
kubeadm을 설치한다고 자동으로 kubelet이나 kubectl을 설치나 관리를 해주지 않기 때문에
kubeadm 버전과 동일한 버전으로 kubelet과 kubectl도 함께 설치해줘야 합니다.
kubernets의 배포 릴리즈는 여기서 확인가능합니다.
아래 명령어들을 실행해 kubeadm, kubelet, kubectl을 설치합니다.
만약 버전을 바꾸고 싶다면 siginig key 다운로드에서 v1.29 -> v1.28 이런식으로 변경하고,
apt package 설치에서 버전 명시도 변경해주면 됩니다.
# apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데
# 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# Kubernetes pacakage repository의 public signing key 다운로드
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 쿠버네티스 apt 리포지터리 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고
# 해당 버전을 고정한다.
sudo apt-get update
sudo apt-get install -y kubelet=1.29.1 kubeadm=1.29.1 kubectl=1.29.1
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm 클러스터 생성
본 포스팅은 워커 노드가 아닌 control-plane 노드를 설치하는 것을 가정하겠습니다.
control-palne 노드는 쿠버네티스에서 관리자 역할을 하는 노드라고 생각하면 됩니다.
멀티 노드 클러스터를 구성하는 방법은 추후에 포스팅하겠습니다.
클러스터 초기화는 kubeadm init 명령어로 수행합니다.
<master-node ip address>만 본인의 IP 주소로 변경해줍니다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address <master-node ip address>
각 플래그에 대한 간단한 설명은 다음과 같습니다.
- --apiserver-advertise-address: API 서버의 수신을 알리는 IP 주소입니다. 현재 서버의 IP 주소를 입력합니다.
- --pod-network-cidr: pod network의 IP 주소 대역을 특정합니다. 이는 CNI Plugin과도 연관이 있는데,
본 포스팅에서는 calico를 사용하기 때문에 192.168.0.0/16 으로 지정합니다. - --cri-socket: 만약 여러개의 container runtime이 설치되어있다면 하나를 지정해줍니다. containerd의 경우
--cri-socket=unix:///var/run/containerd/containerd.sock 플래그를 추가하면 됩니다.
클러스터가 초기화 되면, CNI Plugin을 설치해줍니다. 여기서는 calico를 설치하겠습니다.
calico 설치는 tigera-operator를 통해 설치하는 것과, 단일 menifest로 설치하는 방법 2가지가 있습니다.
둘 중 하나를 선택해서 설치하면 됩니다.
# by tigera-operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/custom-resources.yaml
watch kubectl get pods -n calico-system
# by manifests
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
CNI Plugin 설치가 완료되면, Master node에 Pod를 생성할 수 있도록 설정해주어야 합니다.
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl get nodes -o wide
위와 같이 status가 Ready가 되면 완료입니다.
쿠버네티스 편의 기능 설치
다음은 쿠버네티스를 사용하는데 있어 편리한 기능들을 설치합니다.
- kubectl 자동 완성 기능
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
kubectl get node -> k get node로 간편하게 사용 가능합니다.
- 쿠버네티스 대시보드 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 로그인 생략 옵션 추가
kubectl patch deployment kubernetes-dashboard -n kubernetes-dashboard --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--enable-skip-login"}]'
k apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard2
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
EOF
설치 후 k get svc -n kubernetes-dashboard를 입력하면
위 이미지처럼 대시보드의 서비스에 대한 정보가 나오는데,
kubernetes-dashboard가 30003번 port로 개방되어있다는 내용입니다.
https://<MASTER_IP>:30003 으로 접속하면 안전하지 않은 페이지가 나오는데 그냥 접속하면 되고,
로그인 페이지에서 생략을 누르면 대시보드에 접속할 수 있습니다.
- Metrics Server 설치
만약 아래 cannot validate certificate because it doesn’t contain any IP SANs 에러가 발생하면
아래 patch 명령어도 함께 실행합니다.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl patch deployment metrics-server -n kube-system --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'
'인프라' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 기능 이해하기 - Configmap, Secret (0) | 2024.04.29 |
---|---|
[Kubernetes] 쿠버네티스 기능 이해하기 - Probe (0) | 2024.04.29 |
[Kubernetes] 쿠버네티스 Object 이해하기 (0) | 2024.04.26 |
[Kubernetes] 쿠버네티스가 실무에서 편한 이유 (0) | 2024.04.25 |
[Kubernetes] 쿠버네티스와 컨테이너에 대한 한방 정리 (0) | 2024.04.24 |