K8s Cluster를 On-Premise에 구축하기

GisangLee·2024년 3월 9일
0

k8d

목록 보기
20/29

1. 환경구성 for k8s

A) 방화벽 disable

k8s가 사용하는 포트영역이 30개 정도 돼서 disable하고
환경 구성한다.

sudo ufw disable
sudo ufw status

B) Swap 해제

가상메모리는 메모리가 아니다.
idle 상태의 process가 대기하는 것을 말한다.
-> container(process)가 swap에 가지못하게 해야한다.
----> 애플리케이션 성능 유지를 위해 해제를 해야한다.

sudo swapoff -a # 현재 부팅 중인 상태에서만 off 되는 것
# 리부팅 하면 다시 켜짐
free
--------------------------------------------------

# 리부팅 해도 꺼지도록하는 세팅
sudo vi /etc/fstab

# 밑에 부분 주석 처리
# UUID=26ab4f8e-7855-46d1-8cc9-917f05bc13f8 none swap sw  0       0 

C) NTP

# 클러스터 서버간의 시간 동기화 필수
sudo apt -y install ntp
sudo systemctl enable ntp
sudo systemctl restart ntp
sudo systemctl status ntp
sudo ntpq -p

D) Packet Forwaring -> IP forwarding enable

sudo -i
cat /proc/sys/net/ipv4/ip_forward
>>> 0

echo "1" > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
>>> 1

E) containerd 환경 설정

sudo vi /etc/modules-load.d/containerd.conf

overlay
br_netfilter # iptable이 사용하는 원천 기술

작성 후 저장하고 나오기

sudo modprobe overlay
sudo modprobe br_netfilter

F) Node간 통신을 위한 iptables에 bridge 설정

sudo vi /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

작성 후 저장하고 나오기

sudo vi /etc/modules-load.d/k8s.conf

br_netfilter

작성 후 저장하고 나오기

sudo vi /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1

작성 후 저장하고 나오기

2. Container RunTime - Containerd

기본 설치

sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2

A) docker

공식사이트

위 사이트에서 1번과 2번 과정만 수행한다.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

B) 세팅

sudo sh -c "containerd config default > /etc/containerd/config.toml"

vi /etc/containerd/config.toml


1   disabled_plugins = []
125 SystemdCgroup = false

위로 세팅

sudo systemctl restart containerd.service
sudo systemctl status containerd.service
sudo vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo usermod -aG docker student
sudo systemctl restart daemon-reload
sudo systemctl enable docker
sudo systemctl restart docker
sudo systemctl status docker
sudo reboot

3. k8s 설치 (마스터)

기본 설치 (레포지토리 추가)

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update

A) 툴 설치

kubeadm & kubelet & kubectl

kubeadm > 클러스터 초기화, 노드 연결, 버전 변경
kubectl > CLI
kubelete (daemon) > 노드간 통신, master 노드로부터 명령 지시를 받는 프로세스

sudo apt-cache policy kubeadm
>>>
kubeadm:
  Installed: (none)
  Candidate: 1.29.2-1.1
  Version table:
     1.29.2-1.1 500
        500 https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
     1.29.1-1.1 500
        500 https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages
     1.29.0-1.1 500
        500 https://pkgs.k8s.io/core:/stable:/v1.29/deb  Packages

#### 최신 버전
sudo apt -y install kubeadm kubectl kubelet

#### 버전 지정
sudo apt -y install kubeadm=1.29.0-1.1 kubectl=1.29.0-1.1 kubelet=1.29.0-1.1

#### 설치 후 버전 확인
kubeadm version
kubectl version
kubelet --version

이 때, sudo apt update를 하면
kubeadm, kubectl, kubelet 버전도 같이 올라가기 때문에,
버전 홀드를 해주어야한다.

sudo apt-mark hold kubeadm kubectl kubelet

kubelet 데몬 등록 실행

sudo systemctl daemon-reload
sudo systemctl enable --now kubelet

hosts 등록

sudo vi /etc/hosts

192.168.56.100  k8s-master
192.168.56.101  k8s-node1
192.168.56.102  k8s-node2

3-1. 노드 복제 (워커1, 2)

A) 호스트 명 바꾸기

sudo hostnamectl set-hostname k8s-node1
sudo hostnamectl set-hostname k8s-node2

sudo vi /etc/hosts
127.0.0.1 <hostname>

B) 클러스터 초기화 및 node 연결

kubeadm init # control-plane 영역의 주요 구성요소 설치하는 작업
############### ETCD
############### api-server
############### codeDNS
############### kube-proxy
############### scheduler
############### controller

init 작업
1) 기본작업 kubeadm init
2) 네트워크 영역지정 방법 --pod-network-cidr=10.96.0.0/12
3) 실무에서는 서비스 대역도 지정해야한다. --service-cidr=20.96.0.0/16

kubeadm init --pod-network-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.56.100

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 워커노드에서 실행
kubeadm join 192.168.56.100:6443 --token <TOKEN>

워커노드가


4. CNI (Calico)

A) 설치

curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

k apply -f calico.yaml

부록 ( alias )


alias dtoken='kubectl -n kubernetes-dashboard create token admin-user'
source <(kubectl completion bash)
source <(k completion bash)
alias k=kubectl

5. Secure Dashboard

A) 대시보드 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
cd dashboard-rbac
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
k apply -f sa.yaml

B) openssl을 이용한 key, crt를 연결

mkdir dashboard_rbac
cd dashboard_rbac

grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt

grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key

openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-admin"

sudo cp /etc/kubernetes/pki/ca.crt .

SCP로
ca.crt
ClusterRoleBinding-admin-user.yaml
dashboard-admin-user.yaml
kubecfg.crt
kubecfg.key
kubecfg.p12
가 들어있는 dashboard폴더를 로컬로 가져온다.

그 이후로

certutil.exe -addstore "Root" ca.crt
certutil.exe -p k8spass# -user -importPFX kubecfg.p12

을 실행한다.

그리고
대시보드 주소

이로 들어가면 로컬에 등록한 인증서를 선택하면 들어갈 수있다.


6. Prometheus & Grafana

metric(측정단위) 수집기

  • 자원 사용률
  • 실시간 stream으로 제공 (node-exporter)
  • 수집된 데이터 DB화 시켜 저장 -> PromQL 언어로 조회, 분석
  • 높은 수준의 시각화를 위해 Grafana 연동

프로메테우스는 DBMS이다.

  • Time-Series DBMS 랭킹 중 무려 2등이다.

A) Git 설치

sudo apt -y install git

git clone https://github.com/brayanlee/k8s-prometheus.git

B) yalm전부 설치

profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글