한권으로 배우는 도커&쿠버네티스
https://product.kyobobook.co.kr/detail/S000213057687
위의 책을 열심히 따라해보겠다. !
쿠버네티스 구조
실습 환경 구축
책에서는 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
- 해결책
- Cloud-init 네트워크 설정 비활성화: /etc/cloud/cloud.cfg.d/ 경로에 설정 파일을 만들어 cloud-init의 네트워크 설정을 비활성화
- Cloud-init 관련 설정 삭제:
- Netplan 설정 적용:
- 서버 재부팅
# /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
호스트 이름 변경
# 두번째, 세번쨰 가상머신의 호스트 이름 변경
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/
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/
모든 노드에 설치
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' 카테고리의 다른 글
[CI/CD] Github Actions와 ArgoCD를 활용한 CI/CD (0) | 2024.11.05 |
---|---|
[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 |