개발 관련 일지/k8s

쉽게 시작하는 쿠버네티스 CH2 배포를 통한 쿠버네티스 체험

worldi 2024. 1. 21. 21:02

애플리케이션 배포 (NGINX)

  • 마스터 노드 실제로 마스터 노드에 kubectl 명령어 설치함. 워커 노드에 애플리케이션을 배포
  • 애플리케이션의 단위는 파드이다. 이는 컨테이너의 집합을 말한다.
  • 파드 배포를 실습한다.
kubectl run nginx --image=nginx
kubectl get pod //  이미지 생성된 것을 확인
kubectl get pod -o wide // ip 확인
curl 172.16.132.1

쿠버네티스 클러스터 외부에서 배포한 파드 접속하기

  • 외부에서 접속하려면 어떻게 해야하지?
  • 호스트 환경에서 172대의 ip로 접속해?
  • ping과 curl 명령어로 확인해 보면, 접속이 불가능한 것을 알 수 있다. 즉, 쿠버네티스 클러스터가 다음과 같은 문에 둘러싸여 있다. 문 통과해야지 외부와 통과할 수 있다.
  •  

  • 해결방법:
    • 프록시 구조 날려버린다. → 문이 없어져서 보안 없어진다. (문제점임)
    • 문 밖에 안전한 구역을 만들어 놓는다. 이를 서비스라고 한다. (=svc) 서비스를 통해서 안전하게 찾아 갈 수 있다. 정확하게 말하자면, 노드에 접속하는 것이지, 파드에 직접 연결 되는 구조는 아니다.

외부와 연결되는 pod 실습하기

  • 파드를 노출한다.
kubectl expose pod nginx --type=NodePort --port=80
  • 노출한 것을 확인한다.
kubectl get service
  • 밖으로 노출되는 포트가 32630인 것을 확인할 수 있다.
kubectl get nodes -o wide 

이를 통해, 노드에 대한 ip정보가 보여지게 된다. 외부에 노출되는 ip가 보여진다.

  • 포트 32630을 통해서 해당 부분이 노출되어있다.
  • 192.168.1.101:32630 → nginx가 보여지게 된다. (강의에서)
  • 다음과 같이, 각각 node 마다 외부 IP를 통해 들어갈 수 있다.
  • 내 실습

 

만약 이거 안된다면, GKE 의 방화벽을 추가해준다.

GCP -> VPC 네트워크 -> 방화벽 ->방화벽 규칙 새로 만들기

우선순위를 default(1000)값 보다 작게 설정한다

IP 범위를 0.0.0.0/0 (필터 안함) 으로 한다 .

그러고서 안된다면, 파드, 서비스, 디플로이 먼트 다 삭제하고 다시 해보면 된다.

 

파드의 한계를 극복하는 디플로이먼트

  • 외부에서 접속할 수 있도록 서비스에 노출한다.
  • 하지만, 파드가 한 개 밖에 없으니, 죽으면 안된다는 문제점이 존재한다. 우리가 원하는 상황은 파드 한 개가 배포되고 있는게 아니라, 다른 파드가 받아줄 수 있는 상황을 원한다.
  • 파드는 한개만 존재, deployment는 파드가 여러 개가 모여있는 단위
kubectl run // pod 배포 가능하고, deployment는 배포할 수가 없다. 
kubectl create // deployment 배포 가능 
kubectl apply // pod, deployment 배포할 수 있다. 파일을 통해서 배포한다. 
  • deploy-nginx라는 이름으로 deployment가 배포된다.
kubectl create deployment deploy-nginx --image=nginx
kubectl get pods // 파드 확인해 봄

Deployment로 다수의 파드를 배포한다면?

ReplicaSet을 통해서, 파드가 늘어날 수 있다. 현재 default 값은 1이고, 이를 늘려주게 되면 그에 맞게 파드가 늘어난다.

  • 파드의 배포수 늘리기
kubectl scale deployment deploy-nginx --replicas=3
kubectl get pods // 여러 개 파드가 늘어난 것을 확인할 수 있다. 

Deployment를 서비스로 노출하기

  • 노드 포트로 디플로이 먼트를 노출한다.
kubectl expose deployment deploy-nginx --type=NodePort --port=80
kubectl get services
  • 문제점
    • Deployment를 노드 포트로 노출하게 되면 노드의 IP를 알아야 한다. IP를 알려주는 건 부담스럽다.
    • 따라서, 가장 좋은 방법은 로드밸런서로 선언하는 것이 가장 좋은 방법이다. 강의에서는 로드밸런서 MetalLB를 통해 선언해서 보여준다.
    • chk-hn 라는 이미지를 Deploy하고, 이를 로드밸런스로 노출해 본다.

노드포트보다 로드 밸런서가 좋은점

  • 로드 밸런서는 virtual IP이다. 따라서 노드의 실제 IP를 쓰지 않아도 된다.
  • 또한 로드 밸런서는 가야할 경로를 최적화할 수 있다.

디플로이먼트를 로드밸런서로 배포

  • chk-hn을 배포하기 전에, MetalLB를 설치한다.
kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml // 다운로드가 있는 폴더로 간다. 
kubectl create deployment chk-hn --image=sysnet4admin/chk-hn // 이미지 이름 동일하게 한다.
//  개인이 가지고 있는 이미지는 레지스트리 이름을 입력해야한다. 
kubectl scale deployment chk-hn --replicas=3 
// 로드 밸런서로 노출한다.
kubectl expose deployment chk-hn --type=LoadBalancer --port=80
kubectl get services // 서비스 확인, ip가 익명으로 되어 있다.
kubectl get pods -o wide // 실제 존재하는지 확인한다.
  • 컨테이너 애플리케이션을 모아 놓는 것은 : chk-hn와 같은 이미지
  • deployment: 파드 모아 놓은 것
  • 쿠버네티스에서 서비스란 문같은 역할로, 이를 로드 밸런서로 설정한다. 서비스는 항상 다른 곳을 거치는 곳이라고 생각하면 된다. 즉, 어떤 곳을 넘어가기 위해 거쳐야 하는 곳

배포한 것들을 모두 삭제

  • pod, service, deployment 삭제
kubectl delete service chk-hn //서비스 delete 하는 명령어
kubectl get service
kubectl delete service nginx  // 서비스를 삭제한다. 
kubectl delete deployment chk-hn // deployment delete
kubectl delete deployment deploy-nginx 
kubectl delete pod nginx
kubectl get pods // 파드 확인
kubectl delete -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml // 파일로 지울 수 있다.