딸기말차

[MSA] 18. Ingress, PV / PVC 본문

Bootcamp/MSA

[MSA] 18. Ingress, PV / PVC

딸기말차 2023. 11. 2. 12:41

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)

 

백엔드 개발 부트캠프

백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.

playdata.io


1. Ingress, PV / PVC

1. Ingress

외부에서 내부로 들어오는 패킷을 처리하는 역할로, Layer7 에서 정의하는 쿠버네티스 오브젝트이다.

외부 요청에 대해 라우팅처리를 하며, 가상호스트 기반의 요청처리, SSL/TLS 보안 연결 또한 처리한다.

즉, 외부 요청에 대한 처리 규칙을 쿠버네티스 자체의 기능으로 편리하게 관리할 수있다.

 

2. PV / PVC

컨테이너의 특징은 컨테이너가 내려가면 저장되어있는 정보가 다 날아간다. 그런데, 쿠버네티스 pod는 언제든 내려갔다 올라올 수 있게 설계 되어있다.

때문에 변경사항을 저장을 해둬야 컨테이너가 내려갔다가 다시 올라왔을 때 이전 변경사항을 유지할 수 있다.

 

이를 저장하는 공간을 PV (Persistence Volume) 라고 하고, PVC (Persistence Volume Claim) 을 통해 요청을 보내 서비스를 할당, Pod를 생성한다.

 

3. Jenkins

jenkins는 git / github 와 파이프라인을 연결할 경우, repository 내 나의 코드에 변경사항을 주기적으로 검사, 감지해서 변경사항을 자동으로 빌드해준다.


2. Ingress 설치

# docker실행
sudo service docker start

# minikube 실행
minikube start

# 정상적으로 실행됐는지 확인
kubectl get pods -A

기본 실행

# ingress 설치
minikube addons enable ingress

ingress 설치

# 접속하기 위한 앱 배포
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

# 포트 노출 
kubectl expose deployment web --type=NodePort --port=8080

# 확인 
kubectl get service web

# 주소 확인 및 서비스 실행
minikube service web --url

pod 생성 및 실행
실행한 pod 확인


3. Ingress를 통한 LoadBalancer 실습

1. 첫 번째 pod 생성

# example-ingress.yaml 파일 생성
vim example-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: example-ingress
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
    rules:
      - host: hello-world.info
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: web
                  port:
                    number: 8080

yaml 파일 작성

# 작성한 yaml 파일 적용
kubectl apply -f ./example-ingress.yaml

yaml 적용

# ingress 확인
kubectl get ingress

ingress 확인

# ingress ip 등록
sudo vim /etc/hosts
192.168.49.2    hello-world.info

ip 등록

# curl을 날려 ip가 잘 등록되었는지 확인
curl hello-world.info

ip 등록된 것 확인

 

2. 두 번째 pod 생성

# 두번째 pod 생성
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0

# deployment 노출 
kubectl expose deployment web2 --port=8080 --type=NodePort

# deployment를 하나 더 띄우기 위한 vim 수정
vim example-ingress.yaml

- path: /v2
  pathType: Prefix
  backend:
    service: 
      name: web2
      port:
        number: 8080

# 작성한 yaml 파일 적용
kubectl apply -f ./example-ingress.yaml

# curl을 날려 ip가 잘 등록되었는지 확인
curl hello-world.info/v2

curl을 날려 확인


4. pv / pvc 실습

도킹이란, 서로 다른 환경을 연결하는 것을 의미한다.

wsl과 windows 서로 도킹을 하여 공유 패키지로 mnt 디렉토리를 이용한다.

 

1. volume 세팅을 위한 pv-volume.yaml 생성

# pv-volume.yaml 파일 생성
vim pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

# 작성한 yaml 파일 등록
kubectl apply -f pv-volume.yaml

# 등록된 것 확인
kubectl get pv task-pv-volume

등록 확인

2. pvc를 세팅하기 위한 pv-claim.yaml 생성

# pv-claim.yaml 파일 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
      
# 작성한 yaml 파일 등록
kubectl apply -f pv-claim.yaml

# 등록된 것 확인
kubectl get pv task-pv-claim

Bound 된 것 확인

3. pv / pvc 를 통해 pod를 생성하기 위한 pv-pod.yaml 생성

# pv-pod.yaml 파일 생성
vim pv-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
          
      
# 작성한 yaml 파일 등록
kubectl apply -f pv-pod.yaml

# 등록된 것 확인
kubectl get pod task-pv-pod

pod 확인

4. pv / pvc 테스트

# minikube를 통해 쿠버네티스에 접속
minikube ssh

# /mnt/data 디렉토리 접근
cd /mnt/data

# html 파일 생성
sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"

# pod 내에 접속
kubectl exec -it task-pv-pod -- /bin/bash

# html 파일이 있는 디렉토리 접근
cd /usr/share/nginx/html

# 파일이 존재하는지 확인
cat index.html

 

pv / pvc 기능 확인

 

pv-volume.yaml 을 통해 /mnt/data 를 바라보게 만들었고, pv-claim.yaml 을 통해 요청을 보낸다.

이후 pv-pod.yaml 을 통해 /usr/share/nginx/html 를 volumeMount로 사용함으로서 pv, pvc, pod가 모두 연결 시킨 구조로 만들었다.

 

결과를 확인하기 위해, pod 생성 후 해당 pod 내에 들어가  /usr/share/nginx/html 로 접근하여 /mnt/data 내에 있던 index.html이 존재하는지 확인했다.


5. Jenkins 실행

# jenkins 컨테이너 생성
kubectl exec --namespace default -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo

# 실행을 위한 포트포워딩
kubectl --namespace default port-forward svc/jenkins 20000:8080

실행
jenkins 실행 화면


6. 65일차 후기

Ingress는 OSI 7계층에서 Layer7을 담당하는 쿠버네티스 오브젝트로, 이를 활용해 로드밸런싱 또한 가능하다.

쿠버네티스는 컨테이너를 관리하기 위한 오케스트레이션 툴로, 컨테이너가 모종의 이유로 종료되거나 중지 될 시 replica를 통해 컨테이너를 대체하여 해당 서비스를 유지하게 된다.

그런데, 이 때 컨테이너가 종료된다면 컨테이너 실행 이후 변경사항이 전부 날아가게 된다. 그렇다면 서비스가 제대로 유지될 수가 없기 때문에 Volume을 통해 변경사항을 저장해야한다.

이를 위해 PV, PVC를 사용하여 변경사항을 유지, 서비스를 유지하게 된다.

'Bootcamp > MSA' 카테고리의 다른 글

[MSA] 20. Custom System 구축, Kafka  (0) 2023.11.06
[MSA] 19. Namespace, ConfigMap, AWS CLI  (0) 2023.11.03
[MSA] 17. Jenkins 설치  (0) 2023.11.01
[MSA] 16. Api Gateway 내 MicroService 등록  (0) 2023.10.31
[MSA] 15. Minikube, k9s 설치  (0) 2023.10.30