애플리케이션 배포 (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 // 파일로 지울 수 있다.
'개발 관련 일지 > k8s' 카테고리의 다른 글
쉽게 시작하는 쿠버네티스 CH6 쿠버네티스 Tips (0) | 2024.01.21 |
---|---|
쉽게 시작하는 쿠버네티스 CH5 쿠버네티스 오브젝트 (0) | 2024.01.21 |
쉽게 시작하는 쿠버네티스 CH4 문제를 통해 배우는 쿠버네티스 (0) | 2024.01.21 |
쉽게 시작하는 쿠버네티스 CH3 쿠버네티스 인사이드 (0) | 2024.01.21 |
쉽게 시작하는 쿠버네티스 CH1 쿠버네티스 환경 구성 (1) | 2024.01.21 |