And Brain said,

CI/CD Argonautica - Kubernetes, 조타수 - 실습 [3] 본문

IT/CICD Argonautica

CI/CD Argonautica - Kubernetes, 조타수 - 실습 [3]

The Man 2023. 8. 19. 15:55
반응형

CI/CD Argonautica

Docker, 선박
Kubernetes, 조타수 Harbor, 항구
Helm, 타륜
Istio, 돛
Jenkins, 선장
ArgoCD, 출항

1장/ Loki, Trickster

Troubleshooting

 
지난 시간에 우리는 파드와 네임스페이스를 다뤄봤습니다.
 
파드는 쿠버네티스에서의 최소 배포 단위였습니다. 하나 이상의 컨테이너를 포함하며, 동일한 파드 내의 컨테이너들은 같은 네트워크 네임스페이스, UTS, IPC, 그리고 선택적으로 스토리지 볼륨을 공유합니다.
네임스페이스는 쿠버네티스 클러스터 내의 리소스를 로지컬하게 구분하기 위한 방법이었습니다. 큰 클러스터를 여러 사용자나 팀 간에 분할하여 사용하고자 할 때 유용합니다.
 
그러면 오늘은 쿠버네티스의 '서비스(Service)', '레플리카셋(ReplicaSet)' 그리고 '디플로이먼트(Deployment)' 까지 알아봅시다.
 
 

Service

 
쿠버네티스의 "서비스(Service)"는 특정한 작업(예: 파드 그룹)에 대한 네트워크 접근을 추상화하는 기능을 제공합니다. 주요 목적은 파드의 생명 주기와 독립적으로 안정적인 네트워크 주소를 제공하는 것입니다.
 
지난 시간에 파드가 뒤졌다 살아난 것이 바로 이 서비스의 기능입니다.
 
먼저, 서비스를 생성해줍니다.

// nginx-service.yml

apiVersion: v1
kind: Service
metadata:
  name: mynginx-service
spec:
  ports:
  - name : mynginx-service-port
    port: 8001

apply 명령어를 통해 서비스 생성합니다.
 
서비스를 확인해보면

selector가 none인 것을 볼 수 있는데, selector는 주로 파드와 다른 리소스들 간의 연결성을 정의하는 데 사용됩니다. 서비스는 selector를 사용하여 네트워크 트래픽을 전달할 파드를 선택합니다. 예를 들어, "app=frontend" selector를 가진 서비스는 "app=frontend" 라벨을 가진 모든 파드에 트래픽을 전달합니다.
 

// ngix-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: nginx:latest 
    ports:
    - containerPort: 80

지난 시간에 만든 파드를 활용해보도록 합시다.

한 가지 달라진 점은 가상환경의 스펙이 좋지않아 minikube로 바꾸었다는 점입니다. 여러분들은 minikube를 안 쓰셔도 되시는 환경이시길 바랍니다...
 
자, 그러면 이 파드와 서비스를 연결해봅시다.

// nginx-service.yml

apiVersion: v1
kind: Service
metadata:
  name: mynginx-service
spec:
  ports:
  - name: mynginx-service-port
    port: 8001
    targetPort: 80
  selector:
    app: myweb

이 서비스는 app: myweb 라벨 셀렉터를 사용하여 트래픽을 전달할 파드를 선택합니다. 이 의미는 app 라벨의 값이 myweb인 모든 파드로 트래픽이 전달된다는 것입니다. 이 서비스가 트래픽을 전달할 때, 파드 내의 80번 포트(targetPort)로 트래픽이 전달됩니다.
 
서비스 yml파일을 변경해준 후, 다시 적용합니다.
 

selector가 myweb으로 변경된 것을 확인하실 수 있습니다.
 
이번엔 이를 외부로 포워딩 시켜봅시다.

// nginx-service.yml

apiVersion: v1
kind: Service
metadata:
  name: mynginx-service
spec:
  type: NodePort
  ports:
  - name: mynginx-service-port
    port: 8001
    targetPort: 80
  selector:
    app: myweb

 
다시 apply 명령어로 적용해 주면 외부 포트를 확인하실 수 있습니다.

 
저는 minikube를 썼기에 minikue ip를 통해 IP를 확인하였습니다. 여러분들은 각자 노드의 IP를 가지고 확인하시면 됩니다.

이리오너라 Nginx야!

 
현재는 NodePort를 이용하였는데 이는 클러스터 외부에서 쿠버네티스 서비스에 접근할 수 있는 간단한 방법을 제공하지만, 대규모 프로덕션 환경에서는 보통 로드 밸런서나 인그레스 등의 더 복잡한 솔루션을 사용하는 경우가 많습니다.
 
그럼, 쿠버네티스의 멋진 기능인 로드 밸런싱을 해봅시다.
 
지금은 MetalLB를 사용할 것입니다. MetalLB는 쿠버네티스 환경에서 로드 밸런서 서비스의 역할을 수행할 수 있도록 해주는 솔루션입니다.
 

kubectl edit configmap -n kube-system kube-proxy

위 명령어를 사용하면 스크립트가 나올 것입니다. vi 명령어를 사용합니다.

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

strictARP: false로 되어있을 것입니다. 이를 true로 바꿔주시고 :wq로 나오시면 됩니다.
 

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-frr.yaml

 
이제, 위 명령어들을 각각 입력해준 뒤 네임스페이스를 확인해보시면

metallb-system이 Active 상태인 것을 확인해보실 수 있습니다.
 

// configmap.yml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: config
spec:
  addresses:
  - 192.168.49.90-192.168.49.150

MetalLB의 ConfigMap 설정입니다. ConfigMap은 쿠버네티스에서 사용하는 리소스 중 하나로, 구성 정보를 파드와 기타 오브젝트에 주입하는 데 사용됩니다. ConfigMap을 사용하면 구성 정보를 컨테이너 이미지와 분리할 수 있어, 애플리케이션을 다양한 환경에서 더 쉽게 배포하고 관리할 수 있습니다.
 

 
apply 하시고, config 확인까지.

// // configmap_2.yml

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

이 설정도 apply를 하셔야 외부에서 접근이 가능했습니다.
 

 
이제 192.168.49.90의 8001번 포트는 여러 트래픽을 로드밸런싱할 수 있게 되었습니다.
 
 

ReplicaSet

 
ReplicaSet은 지정된 수의 파드 레플리카(replicas)를 유지하는 역할을 합니다. 이는 파드의 가용성을 보장하고 쿠버네티스 클러스터의 여러 노드에 파드를 분산시킴으로써 고가용성과 장애 허용성을 제공합니다.

// replica.yml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replica
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-replica-test
  template:
    metadata:
      labels:
        app: nginx-replica-test
    spec:
      containers:
      - name: myweb-container2
        image: nginx:latest
        ports:
        - containerPort: 80

apply 한 후, 레플리카가 생성된 것을 확인할 수 있습니다.

파드를 죽여봅시다.

httpd-pod는 죽었고 replica는 다시 생성되는 것을 확인하실 수 있습니다.
 

기존 파일의 replica 숫자를 5로 바꾸고 적용해봅시다.
 

2개가 추가로 생성되는 것을 확인하실 수 있습니다. 관리자는 이제 yml 파일의 replica 숫자만 바꿔서 pod 수를 조절할 수가 있게 되었습니다.
 
 

Deployment

 
ReplicaSet의 놀라운 기능에도 아직은 부족합니다. 여러분들이 실제로 쿠버네티스를 가용한다면 ReplicaSet 계층을 직접 건드리는 일은 별로 없을 것입니다. 바로 이 쿠버네티스의 꽃, Deployment가 존재하기 때문이죠.
 
Deployment는 쿠버네티스에서 애플리케이션을 안정적으로 배포하고, 업데이트를 관리하는 데 사용되는데, 내부적으로 Deployment는 ReplicaSet을 사용하여 파드의 인스턴스를 관리합니다. Deployment의 주요 기능은 애플리케이션의 롤아웃 및 롤백, 스케일링, 원하는 상태의 유지 등입니다.
 
즉, Deployment는 ReplicaSet의 모든 기능을 사용하면서도 애플리케이션의 배포 및 관리에 필요한 추가적인 기능을 제공합니다.
 

// deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

 
deployment.yml 파일을 만들어줍니다. kind만 기존 ReplicaSet에서 Deployment로 변경될 뿐 크게 달라지는 것은 없습니다.
 

확인해보시면 됩니다.
 

 
이제, 아래의 명령어를 입력해봅시다.

kubectl rollout history deployment <deployment-name>

 

 
이는 무슨 의미일까요?
 
이 명령어는 특정 Deployment의 변경 이력을 조회하는 데 사용됩니다. 이 명령어를 사용하면 Deployment의 수정 내역과 각 변경 사항에 대한 버전(리비전)을 확인할 수 있습니다. 이 기능은 특히 롤백을 수행할 때나, 어떤 변경이 언제 이루어졌는지를 파악하고 싶을 때 유용합니다.

 
돌아가봅시다.
 

 
이렇게 원하는 리비전으로 롤백이 가능합니다.
 
그럼, 마지막으로 오늘 배운 Service와 Deployment를 연결해봅시다.
 

// dep_ser.yml

apiVersion: v1
kind: Service
metadata:
  name: nginxservice   ### 서비스 이름
spec: 
  type: NodePort    ### 외부에서 서비스를 보는 방식
  ports:
  - port: 8099     ## worker
    targetPort: 80   ### 내부 서비스 포트  --> 각 pod에서 서비스하고 있는 포트
    protocol: TCP
    nodePort: 30080   ## 외부에서 볼 수 있는 포트
  selector:
    app: nginx   ## 디플로이먼트와 맞춰줌

 
apply 해주고 포트 확인.

안녕, Nginx

 
오늘은 여기까지. 아직 여정이 끝나지 않았습니다만, 이제 우리에겐 든든한 조타수, 쿠버네티스가 있으니 풍파가 두렵겠습니까. 다음 시간부터는 이보다는 더 쉬울 것입니다. 여기까지 고생 많으셨습니다. 그럼, 이제는 헤어져야할 시간. 안녕
 
 

Thanks for watching, Have a nice day.

반응형
Comments