k8s (2) GCP를 사용한 쿠버네티스 실습
데브옵스(DevOps)를 위한 쿠버네티스 마스터 강의 정리
1. GKE 환경 실습
1.1 Project 생성
- 신규 project를 생성
1.2 Kubernetes Engine API 설치
- 메뉴 > Kubernetes Engine
- 생성한 project에 kubernetes engine api 설치
- 사용 버튼 클릭
- 너무 오래 기다리면 새로고침
1.3 클러스터 생성
- 만들기 버튼 클릭
- STANDARD 클러스터로 전환
- 전환 후 만들기 버튼 클릭
- 클러스터 생성 중
📍 Note1. Standard vs Autopilot
- Standard: 가상머신(=노드) 생성
- Autopilot: 가상머신(=노드) 없이 컨테이너만으로 서비스 제공, 서버리스 개념
📍Note2. 리전 vs 영역
-
리전: 데이터 센터가 있는 위치
-
영역: 데이터 센터
☞ 리전은 여러 영역에 배치하여 가용성을 보장하나 비용 발생
📍 Note3. 제어 영역 버전
- 버전에 대한 관리를 구글이하냐 내가 하냐 차이
1.4 클러스터 사용
- 클라우드 쉘 활성화
- 클라우드 쉘은 일종의 가상머신으로 클러스터에 원격접속하기 위해 사용
- 쉘은 클러스터와 관계 없으며 별도의 VM
- 연결 명령어 확인 및 실행
- gcloud 명령으로 접속 권한 인증
kubectl get nodes
- kubectl: 노드에 접근
- get nodes: node 정보 얻어옴
1.5 애플리케이션 배포
kubectl create deploy tc --image=consol/tomcat-7.0 --replicas=5
kubectl
: Kubernetes 클러스터를 관리하기 위한 커맨드라인 툴create deploy
: 새로운 디플로이먼트를 생성하는 명령어tc
: 생성될 디플로이먼트의 이름--image=consol/tomcat-7.0
: 디플로이먼트에 사용될 컨테이너 이미지를 지정--replicas=5
: 디플로이먼트에 의해 관리될 파드(Pod)의 수를 지정- 즉,
consol/tomcat-7.0
이미지를 사용하여 “tc”라는 이름의 디플로이먼트를 생성하고, 이 디플로이먼트는 5개의 복제본을 가진 파드를 클러스터에 배포하도록 Kubernetes에 요청함 - 이를 통해, Tomcat 서버 5개가 실행되는 환경을 구축
kubectl expose deploy tc --type=LoadBalancer --port=80 --target-port=8080
- 컨테이너를 만든 다음 외부에 노출시키는 명령어
- 쿠버네티스에 배포 되었더라도 외부에 노출되지 않음
kubectl get pods,svc
- svc: 서비스로 포트를 외부로 노출시키는 기능을 가지고 있음
- 5대의 pod가 띄워져 있음
- GCP의 LoadBalancer가 공인 IP를 자동으로 받아옴
- 공인 IP에 접속하면 LoadBalancer가 트래픽을 분산해줌
kubectl get pods -owide
- pod들이 배포된 정보를 알 수 있음
- dq8w-2대, f6v9-2대, ntl9-1대
1.6 삭제
- 비용 부과 되지 않게 삭제
2. VM 환경 설치 가이드
2.0 체크리스트
- 호환되는 리눅스 머신: 데비안, 레드햇 기반
- 클러스터의 모든 머신에 걸친 전체 네트워크 연결
- 모든 노드에 대한 고유한 호스트 이름, MAC 주소 및 product_uuid
- 특정 포트 개방
2.1 VM 생성
- 마스터 노드 1대/ 워커 노드 2대
- 가상머신은 2CPU, 4GB 메모리 사용 필요 (최소사양)
- kubelet이 제대로 작동하기 위한 스왑의 비활성화
📍 스왑의 비활성화
- 스왑: 메모리에 있는 정보를 오랫동안 쓰지 않은 경우 메모리 관리를 위해 디스크로 보냄
- 쿠버네티스 클러스터 입장에서 리소스에 대한 관리가 효율적으로 되지 않음
- 메모리가 안남아있는데 메모리가 남아있는 것 처럼 보여짐
- 디스크로 내려도 사실 메모리에는 있다고 봐야함
✏️ 모든 노드에서 명령어 실행
sudo swapoff -a # 현재 시스템에 적용
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 리부팅 필수
2.2 컨테이너 런타임 설치
- 설치 자료 참고
- kubelet: 쿠버네티스 설치시 같이 설치되는 데몬으로 containerd를 제어함
- 이전에는 docker로 containerd를 제어했음
- v 1.26 부터는 호환성 문제가 있어 kubelet과 containerd를 따로 설치
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
- Using Docker Repository
sudo apt update
sudo apt install -y containerd.io
- Install Containerd
sudo systemctl status containerd # Ctrl + c를 눌러서 나간다.
- 설치 확인
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOF
- Containerd configuration for Kubernetes
sudo sed -i 's/^disabled_plugins \=/\#disabled_plugins \=/g' /etc/containerd/config.toml
sudo systemctl restart containerd
- containerd 실행
ls /var/run/containerd/containerd.sock
- 소켓이 있는지 확인
2.3 쿠버네티스
- 설치 자료 참고
- 위 사이트에서 스크립트를 가져오고 실행
cat <<EOF > kube_install.sh
# /etc/apt/keyrings 폴더 생성 및 권한 부여
sudo mkdir -p -m 755 /etc/apt/keyrings
# 1. apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# 2. 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 3. 쿠버네티스 apt 리포지터리를 추가한다.
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
# 4. apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
EOF
- kubernetes 설치 스크립트 작성
sudo bash kube_install.sh
kubeadm version # 버전 확인
- kubenetes 설치
📍 kubectl
- kubectl은 Kubernetes 클러스터와 상호작용하기 위한 커맨드 라인 인터페이스(CLI) 도구입니다. 사용자는 kubectl을 사용하여 클러스터에 배포된 애플리케이션을 관리하고, 클러스터 리소스를 조회하며, 클러스터의 상태를 확인할 수 있습니다. kubectl 명령은 Kubernetes API 서버와 통신하여 이러한 작업을 수행합니다.
- 예: 파드 생성, 서비스 조회, 로그 확인 등의 작업을 kubectl을 통해 실행할 수 있습니다.
📍 kubeadm
- kubeadm은 Kubernetes 클러스터를 쉽게 부트스트랩(초기 설정)하는 데 사용되는 도구입니다. kubeadm init과 kubeadm join 명령어를 사용하여 새로운 클러스터를 생성하거나, 기존 클러스터에 노드를 추가할 수 있습니다. kubeadm은 클러스터의 컨트롤 플레인 구성, 인증서 생성 및 배포, kubeconfig 파일 설정, 네트워크 플러그인의 설치 등 클러스터 구성에 필요한 다양한 작업을 처리합니다.
- 예: kubeadm init으로 새 클러스터의 마스터 노드를 설정하고, kubeadm join으로 워커 노드를 클러스터에 추가합니다.
📍 kubelet
- kubelet은 모든 Kubernetes 노드에서 실행되는 에이전트입니다. kubelet은 각 노드에 할당된 파드(Pods)를 관리하며, 컨테이너 런타임과 통신하여 파드의 컨테이너가 올바르게 실행되고 있는지를 확인합니다. kubelet은 주기적으로 Kubernetes API 서버로부터 각 노드에 할당된 파드에 대한 정보를 받아, 파드의 컨테이너를 실행하거나 중지하고, 파드 상태를 API 서버에 보고합니다.
- 예: 파드 스펙(PodSpec)에 따라 컨테이너를 시작하고, 파드의 생명주기 이벤트를 관리합니다.
2.4 넷필터 브릿지 설정
- 넷필터 브릿지가 컨테이너간 네트워크 통신 수행 ☞ 활성화 시켜야함
- docker.io는 자동으로 활성화되나 containerd를 직접 설치하기 때문에 활성화 시켜야함
sudo -i
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit
- 위 명령어는 Linux 시스템에서 NAT(네트워크 주소 변환)를 설정하는데 사용
📍NAT
- 단일 공용 IP 주소를 사용해 여러 장치를 인터넷에 연결
- modprobe: 네트워크 스택과 Linux 브리지 간에 패킷을 전달할 수 있도록 하는데 사용되는 커널 모듈 로드
2.5 마스터 노드 초기화
- 다른 노드들이 클러스터에 참여할 수 있도록 제안할 수 있음
- init시에 token이 발행되고, 이를 다른 노드들에게 전달 가능
- token을 받은 노드는 클러스터에 join 할 수 있음
- token에 따라 master/worker 등 차이가 있음
sudo kubeadm init
2.6 클러스터 사용 초기 세팅 (마스터 노드)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 마스터 노드 초기화시 사용자 세팅 명령어 사용
2.7 워커 노드 추가
sudo kubeadm join [ip:port] --token [token] --discovery-token-ca-cert-hash sha256:[sha256]
- 마스터 노드 초기화시 join 명령어 복붙하여 워커 노드에서 실행
sudo kubeadm join 10.138.0.2:6443 --token uhowsi.ekgxojpmqo5at04x --discovery-token-ca-cert-hash sha256:eb81c233bba754e19bff7d6cfc8058f79e1214e9fd90b944488bd5d95253acb5
📍노드 연결 실패 시 점검
sudo kubeadm reset
- init이나 join을 잘못 수행한 경우 초기 설정으로 돌아감
sudo kubeadm token list
sudo kubeadm token create --print-join-command
- token list 확인 및 재발급 (마스터 노드 실행)
2.8 연결된 노드들의 상태 확인
kubectl get nodes
- 처음에는 NotReady 상태
- 쿠버네티스가 정상적으로 구동되기 위해서는 컨테이너끼리 네트워크를 구성하는 plug-in이 필요
2.9 Pod 네트워크 배포
- 앞서 구성한 유저 설정을 통해 클러스터에 cilium 설치
- 설치 참고 자료
- 마스터 노드에서 실행
curl -LO https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium install
- 모든 노드들 상태가 Ready로 변경
📍Cilium
Cilium은 CNI로 Linux 컨테이너 관리 플랫폼을(Docker, Kubernetes) 사용하여 배포된 애플리케이션 서비스 간 네트워크 연결을 보호하는 오픈 소스 소프트웨어입니다.
📍 CNI
CNI는 컨테이너간의 네트워크를 제어할 수 있는 플러그인을 뜻합니다. 요약하자면, 물리 환경의 네트워크를 기반으로 하여, Container Runtime에서 Container간의 네트워크를 사용하게 도와주는 인터페이스 입니다.
3. On-prem 배포 실습
3.1 VM 생성
[Image vm2]
- 이름: master-1, worker-1, worker-2
- 리전: us-west1
- 영역: us-west1-b
[Image vm3]
- 부팅 디스크 설정
3.2 노드 접속
- SSH를 사용한 접속
3.3 네트워크 테스트
- ping을 통해 네트워크 테스트
- 내부 IP를 통해 테스트 수행
- 외부 IP는 방화벽으로 접근 불가
3.4 VM 환경 설정
3.5 배포 테스트
kubectl create deploy tc --image=consol/tomcat-7.0 --replicas=5
- 위와 동일
kubectl expose deploy tc --type=NodePort --port=80 --target-port=8080
- type을 NodePort로 지정
- LoadBalancer 기능은 없음
kubectl get pod,svc
- 포트 확인 후 각 노드들에 대해 접속
댓글남기기