[K8s] K8s 구조 및 실습 환경 구축

2024. 10. 1. 21:46· Cloud/Kubernetes
목차
  1. 쿠버네티스 구조 📌
  2. 실습 환경 구축 📌
  3. 사전 준비 사항
  4. 쿠버네티스 설치

 

한권으로 배우는 도커&쿠버네티스

https://product.kyobobook.co.kr/detail/S000213057687

 

한 권으로 배우는 도커 & 쿠버네티스 | 장철원 - 교보문고

한 권으로 배우는 도커 & 쿠버네티스 | STEP BY STEP, 원리부터 이해하는 도커 & 쿠버네티스 가이드클라우드 기반의 인프라가 보편화된 현재의 IT 환경에서 도커와 쿠버네티스는 애플리케이션을 개

product.kyobobook.co.kr

 

위의 책을 열심히 따라해보겠다. !

 

 

쿠버네티스 구조 📌

 

 

실습 환경 구축 📌

책에서는 Virtual Box로 진행하였지만..

Mac ARM 아키텍처를 지원하지 않아 UTM으로 진행하였다.

 

가상 머신 3개 → Master 1, Worker 2

  • 메모리 → 8192MB 이상
  • CPU 수 → 4이상
  • Hard Disk → 100GB 이상

 

사전 준비 사항

Master UTM 네트워크 설정 → Shared Network만 설정

  • Shared Network → NAT 모드. 외부 인터넷.
  • Bridged (Advanced) → VM 끼리 내부 통신. 가상화 환경에서 주로 사용.
  • Emulated VLAN → 포트포워딩. 사용자는 인터넷을 통해 워커와 통신하는 경우

 

netplan 설정

<트러블 슈팅 > 수동 IP 설정

  • netplan 설정에서 고정 ip 할당해주려고 dhcp4: false 하고 netplan apply 
    그런데, sudo netplan get 하면 dhcp4: true로 되어있음
    ip addr 했을때 enp0s1이 중복 할당됨
  • ⇒ /etc/netplan/50-cloud-init.yaml 파일이 존재
    클라우드 이미지를 기반으로 생성되며, 네트워크 설정을 클라우드 인스턴스의 부팅 시 자동으로 구성
    이 파일에서 enp0s1 인터페이스에  dhcp4: true  설정이 되어 있어서, 수동으로 설정한 내용이 덮어씌워지는 상황
hyesu@myserver03:/etc/netplan$ sudo cat 50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s1:
            dhcp4: true
    version: 2
    • 해결책
      1. Cloud-init 네트워크 설정 비활성화: /etc/cloud/cloud.cfg.d/ 경로에 설정 파일을 만들어 cloud-init의 네트워크 설정을 비활성화
      2. Cloud-init 관련 설정 삭제:
      3. Netplan 설정 적용:
      4. 서버 재부팅
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
network: {config: disabled}
sudo rm /etc/netplan/50-cloud-init.yaml
sudo netplan apply
sudo reboot

 

Master (myserver01) 설정

# /etc/netplan/00-installer-config.yaml

network:
  version: 2
  ethernets:
    enp0s1:
      addresses:
      - "192.168.64.8/24"
      nameservers:
        addresses:
        - 8.8.8.8
      routes:
      - to: "default"
        via: "192.168.64.1"

 

 

UTM에서 가상머신 복제 → Clone

<트러블 슈팅> MAC Address 설정

여러 개의 네트워크 인터페이스 → 각 네트워크 인터페이스는 고유한 MAC 주소를 가져야 함

따라서, UTM 내에서 서버에 여러 네트워크 인터페이스(예: 브릿지 네트워크, NAT 네트워크 등)를 구성할 때마다 각 네트워크 인터페이스는 서로 다른 고유의 MAC 주소를 가져야 합니다. 이는 네트워크 상에서 패킷이 정확하게 전달되고 구분되기 위해 필수적인 요소입니다.

https://docs.getutm.app/settings-qemu/devices/network/network/#mac-address

 

Network

Documentation for UTM virtual machines

docs.getutm.app

 

호스트 이름 변경

# 두번째, 세번쨰 가상머신의 호스트 이름 변경
sudo hostnamectl set-hostname myserver02
sudo cat /etc/hostname 
## myserver02

sudo reboot now

 

IP 주소 변경

sudo vim /etc/netplan/00-installer-config.yaml
# Worker (myserver02)

network:
  version: 2
  ethernets:
    enp0s1:
      addresses:
      - "192.168.64.9/24"
      nameservers:
        addresses:
        - 8.8.8.8
      dhcp4: false
      routes:
      - to: "default"
        via: "192.168.64.1"
# Worker(myserver03)

network:
  version: 2
  ethernets:
    enp0s1:
      addresses:
      - "192.168.64.10/24"
      nameservers:
        addresses:
        - 8.8.8.8
      dhcp4: false
      routes:
      - to: "default"
        via: "192.168.64.1"

 

 

DNS 설정 → 01, 02, 03 다 해주기

sudo vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 myserver01 # 여기 부분만 계속 바꿔서 !

192.168.64.8 myserver01
192.168.64.9 myserver02
192.168.64.10 myserver03

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

 

 

UFW 방화벽 설정

UFW(Uncomplicated FireWall): 리눅스 운영체제에서 작동하는 방화벽

status가 inactive여야 함

sudo ufw disable
sudo ufw status 
## Status: inactive

 

네트워크 설정 → 01, 02, 03 다 해주기

sudo -i
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
> overlay # 시스템 부팅 시 overlay 네트워크 드라이버 로드하도록 설정
> br_netfilter # iptables/netfilter 규칙 적용
> EOF

sudo modprobe overlay 
sudo modprobe br_netfilter
  • overlay
    • 리눅스 커널의 네트워크 드라이버
    • 서로 다른 호스트에 존재하는 파드 간의 네트워크 연결을 가능하게 → 여러개의 독립적인 네트워크 레이어를 겹쳐서 하나로 연결된 네트워크 생성
    • 서로 다른 호스트에 존재하는 파트가 동일한 네트워크에 존재하는 것처럼 통신 가능
  • br_netfilter
    • 네트워크 패킷 처리 관련 모듈 → iptables/netfilter 규칙 적용되도록
    • 컨테이너와 호스트 간의 인터페이스 등에서 발생하는 트래픽에 대해 규칙을 적용해 트래픽 관리
  • modprobe: 리눅스 커널 모듈 관리 도구
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf # sysctl 매개변수 설정 -> 재부팅시 값 유지
> net.bridge.bridge-nf-call-iptables = 1 # 브릿지 네트워크 인터페이스에 대한 ipv4 트래픽이 iptables 규칙에 의해 처리되도록
> net.bridge.bridge-nf-call-ip6tables = 1 # ipv6에 대해 iptables 처리
> net.ipv4.ip_forward = 1 # 커널이 처리하는 패킷에 대해 외부로 ip4 포워딩 가능하도록
> EOF

sudo sysctl --system # 재부팅 하지 않고 매개변수 적용

 

containerd 설정 → 01, 02, 03 다 해주기

도커의 containerd를 쿠버네티스에서 컨테이너 런타임으로 사용할 수 있도록 설정 변경

  • 도커 설치

https://docs.docker.com/engine/install/ubuntu/

 

Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

sudo mkdir -p /etc/containerd
# containerd config default로 출력된 기본 설정을 config.toml 파일로 저장
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null

sudo vim /etc/containerd/config.toml
# false 값을 true로 변경
	SystemdCgroup = true
	
sudo systemctl restart containerd
sudo systemctl enable containerd

sudo systemctl status containerd

 

swap 메모리 비활성화 → 01, 02, 03 다 해주기

free -h # swap 메모리 확인

sudo -i
swapoff --all

free -h

vim /etc/fstab
# /swap.img 주석처리

shutdown -r now

 

 

쿠버네티스 설치

p252 실습내용 ⇒ 안돼서 공식문서 따라함

 

https://v1-28.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

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.31. If

kubernetes.io

모든 노드에 설치

 

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

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

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

sudo -i
kubelet --version
## Kubernetes v1.28.14
kubeadm version
## kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.14", GitCommit:"66f3325d5562da565def802b8bacf431b082991d", GitTreeState:"clean", BuildDate:"2024-09-11T08:26:11Z", GoVersion:"go1.22.6", Compiler:"gc", Platform:"linux/arm64"}
kubectl version --output=yaml
## clientVersion:
##   buildDate: "2024-09-11T08:27:29Z"
##   compiler: gc
##   gitCommit: 66f3325d5562da565def802b8bacf431b082991d
##   gitTreeState: clean
##   gitVersion: v1.28.14
##   goVersion: go1.22.6
##   major: "1"
##   minor: "28"
##   platform: linux/arm64
## kustomizeVersion: v5.0.4-0.20230601165947-6ce0bf390ce3
  • kubeadm: Kubernetes 클러스터를 간단하게 설정하고 부트스트래핑하는 도구
  • kubectl: Kubernetes 클러스터와 상호작용하는 명령줄 도구 → ****클러스터를 관리하고 애플리케이션을 배포 및 제어
  • kubelet : 각 노드에서 실행되는 에이전트. Kubernetes 클러스터의 모든 노드에서 실행

 

마스터 노드 설정

myserver01 → Master

kubeadm certs check-expiration # 쿠버네티스 인증서 상태 확인
## 인증 하나도 안됨

kubeadm config images list # kubeadm이 사용할 수 있는 이미지 리스트 출력

sudo -i
kubeadm config images pull
# CRI를 containerd로 설정하여 이미지 pull
kubeadm config images pull --cri-socket /run/containerd/containerd.sock

kubeadm init --apiserver-advertise-address=192.168.64.8 --pod-network-cidr=192.168.0.0/16 --cri-socket unix:///run/containerd/containerd.sock
## token 저장

kubeadm certs check-expiration
## 인증된 것 확인

exit

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

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/custom-resources.yaml -O

ls # 다운로드 파일 확인
## custom-resources.yaml

kubectl create -f custom-resources.yaml

watch kubectl get pods -n calico-system # calico에 파드 실행중인지 확인

kubectl get node -o wide # 쿠버네티스 클러스터 노드 확인

 

워커 노드 설정

myserver02, myserver03 → Worker node

mkdir -p $HOME/.kube

scp -p hyesu@192.168.64.8:~/.kube/config ~/.kube/config # 마스터노드의 설정 파일 가져오기
cd .kube/
ls # config 파일 확인

sudo -i
## token 입력
kubeadm join 192.168.64.8:6443 --token **u \
	 --discovery-token-ca-cert-hash **
	 --cri-socket unix:///run/containerd/containerd.sock
# 마스터 노드
kubectl get node

이제부터 작업은 마스터노드인 myserver01에서 진행!!

 

쿠버네티스로 실행하는 Hello World!

kubectl run hello-world --image=hello-world --restart=Never pod/hello-world created

kubectl get pod

 

쿠버네티스 삭제 방법

sudo apt-get purge kubeadm kubectl kubelet
sudo apt-get autoremove # 사용하지 않는 패키지 자동 삭제해주는 autoremove 설치
sudo rm -rf ~/.kube # 쿠버네티스 설정 관련 .kube 디렉터리 삭제

 

 

 

저작자표시 비영리 변경금지

'Cloud > Kubernetes' 카테고리의 다른 글

[K8s] Kubernetes 활용한 웹 서비스 배포  (0) 2024.11.05
[K8s] Kubernetes Ingress 및 Helm  (2) 2024.11.05
[K8s] Kubernetes Service  (1) 2024.11.05
[K8s] kubectl과 Workload  (0) 2024.10.25
  1. 쿠버네티스 구조 📌
  2. 실습 환경 구축 📌
  3. 사전 준비 사항
  4. 쿠버네티스 설치
'Cloud/Kubernetes' 카테고리의 다른 글
  • [K8s] Kubernetes 활용한 웹 서비스 배포
  • [K8s] Kubernetes Ingress 및 Helm
  • [K8s] Kubernetes Service
  • [K8s] kubectl과 Workload
혬수
혬수
혬수
수리수리 마수리
혬수
전체
오늘
어제

블로그 메뉴

  • 🏡 Home
  • 🏷️ Tag
  • Github
  • 분류 전체보기 (48)
    • Language (5)
      • JavaScript (5)
      • TypeScript (0)
    • Framework (16)
      • React (1)
      • React Native (15)
    • Testing (2)
      • Jest (0)
      • Postman (1)
    • DevOps (7)
    • Cloud (8)
      • Kubernetes (5)
      • AWS (3)
    • KakaoTech_Bootcamp (4)
      • Weekly Scrum (3)
      • 회고 (1)
    • Etc (5)
      • Git (1)
      • MacOS (4)

인기 글

hELLO · Designed By 정상우.v4.2.2
혬수
[K8s] K8s 구조 및 실습 환경 구축
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.