아쿠의 개발 일지

한화 시스템 부트 캠프 17주차 회고 본문

ETC/한화시스템

한화 시스템 부트 캠프 17주차 회고

디아쿠 2024. 8. 25. 23:47

전치 15주입니다.

 

드디어 쿠버네티스에 대해서 말씀 드릴 때가 왔습니다.

일단 배우면서 ,, 느낀 것은 정말 잘 하고 싶다는 생각을 많이 한 것 같습니다.

 

K8S?

K8S는 컨테이너화 된 애플리케이션을 효율적으로 배포하고 운영하기 위해 설계된 오픈 소스 플랫폼

프라이빗 클라우드라고도 합니다.

클라우드는 -> 남의 가상 컴퓨터를 이용하는 것이고

IDC는 남의 실제 컴퓨터를 이용하는 것입니다.

 

K8S 용어

  • Namespace :
    • 물리 클러스터 내의 복수의 가상 클러스터
    • 개발/운영/테스트 등을 네임스페이스로 나누면 개발은 cpu 100개, 운영은 400개와 같이 네임스페이스별로 포드나 서비스를 나눠서 관리할 수 있다
  • Master :
    • 마스터 노드에서 실행되는 세 개의 프로세스 집합 (kube-apiserver, kube-controller-manager, kube-scheduler)
  • Node :
    • kubelet, kube-proxy, 동작중인 pod를 유지시키고 런타임 환경 제공
  • Control Plane
    • Master + kubelet
  • Object
    • Pod, Service, Volume, Namespace 등으로 시스템의 상태를 나타내는 추상 개념

Pod?

컨테이너의 집합으로 가장 작은 배포 단위이다.

Pod내부의 컨테이너 들은 네트워크와 볼륨을 공유, 클러스터내의 Running 프로세스

내부적으로 하나의 IP만을 사용

다른 기능을 가진 컨테이너들이 포드로 묶이면 하나의 IP를 할당받게 되고, 같은 IP를 가진 두 개의 컨테이너의 포트번호가 각각 다르다면 서로의 포트번호를 통해 통신이 가능

 

Pod가 잘 실행 되는지 쿠버네티스에서 실행중인 프로그램을 확인 하는 명령어

kubectl get pods -A

이렇게 파드라는 컨테이너로 실행되고 있다.

 

K8S 사용 방법 -> yml 파일로 다룬다.

vi test.yml 으로 파일을 만들고
kubectl apply -f test.yml
이걸 적용하겠다 -> f -> 파일 지정 -> deployment가 만들어졌다~ 라는 뜻.

kubectl delete -f test.yml <- 파일 지우기

 

쿠버네티스 환경에서 로그인을 하기 위해서는 토큰을 발급 받아서 넣어줘야 하는데,

아래 명령어로 찾아오면 된다.

kubectl -n kube-system create token admin-user

 

디플로이먼트의 특징은 꼭 기억해야 한다.

디플로이먼트는 레플리카셋을 만들고 레플리카셋은 파드를 만든다.

- 디플로이먼트를 10대 만들면 쟤가 알아서 파드도 10개 만드는 것이다.

 

도커 허브에 가서 이미지를 가지고 오라는 뜻인데, worker02에 만약 이미지가 없으면 hub에 가서 가지고 오게 된다.

만약 이미지가 worker02에 원래 있다면? 도커 허브에서 가지고 오지 않겠죠 ,, ㅇㅇ

 

curl 요청 보내기

curl라는 명령어를 사용하여 HTTP 요청을 서버에 보내는 것을 의미한다. 커맨드라인에서 URL을 이용해 데이터를 전송하거나 받아오는데 사용되는 도구라고 보면 된다.

curl http://pod아이피번호:8080/test

v1으로 응답하게 해 줬다. 잘 응답이 온 건데 root@ 옆에 있다보니 ,, 좀 헷갈리게 보이지만 온 거 맞습니다 ㅎ..

 

이렇게 잘 오게 된다~! 아래는 앞으로도 활용해야 하는 yml파일이나 명령어를 살짝 ,, 정리 해 두겠다.

 

이미지 삭제

crictl rmi docker.io/aqulog/이미지이름:버전

 

Deployment 기본 구조

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-deployment
spec:
  replicas: 1  # 원하는 Pod의 복제본 수를 설정합니다
  selector:
    matchLabels:
      app: spring-app
  minReadySeconds: 5  # Pod가 준비된 상태로 간주되기 전의 최소 시간
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
      - name: spring-container  # 컨테이너 이름
        image: aqulog/이미지이름:버전  # Docker Hub에 올린 이미지 이름과 태그
        ports:
        - containerPort: 8080  # 컨테이너에서 사용하는 포트

 

pod 기본 구조

apiVersion: v1
kind: Pod
metadata:
  name: spring-pod
  labels:
    app: backend
spec:
  nodeSelector:
    kubernetes.io/hostname: worker02
  containers:
  - name: hello-container1
    image: aqulog/이미지이름:버전1
    ports:
    - containerPort: 8080
  - name: hello-container2
    image: aqulog/이미지이름:버전2
    ports:
    - containerPort: 9090

 

라벨과 셀렉터를 활용 해서 특정 그룹을 만들어 줄 수도 있다.

role을 라벨이라고 생각하면 되는데, 라벨을 사용하여 파드를 다양한 선택자와 연결할 수 있는 것이다.

파드를 그룹화하고 관리하는 데 도움을 준다.

파드와 서비스를 연결 시켜주는 건데, 

 

  • 라벨(Label): 서비스는 특정 라벨을 가진 파드들을 선택하여 연결합니다. 예를 들어, 서비스는 app=web 라벨을 가진 파드들만 선택할 수 있다.
  • 셀렉터(Selector): 서비스 정의에서 selector 필드를 사용하여 연결할 파드를 지정합니다. 이 셀렉터는 서비스가 트래픽을 전달할 파드를 정의한다.
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

 

 

이 서비스는 app=my-app 라벨이 붙은 파드들에 대해 트래픽을 전달한다.. 서비스는 클러스터 내에서 80 포트로 접근할 수 있고, 해당 트래픽은 파드의 8080 포트로 전달된다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: my-image
    ports:
    - containerPort: 8080

이 파드는 app=my-app 라벨을 가지고 있으며, 8080 포트에서 서비스를 제공하고 있다. 이로 인해 위의 서비스는 이 파드를 찾고, 클러스터 내에서 이 파드와 연결된다.

 

따라서, 파드는 서비스와 연결되어 클러스터 내의 다른 애플리케이션이나 클라이언트가 파드에 접근할 수 있도록 한다.

 

아까 말 했던 것처럼

 

디플로이먼트를 만들면 레플리카셋이 자동으로 만들어지고, 레플리카셋을 만들면 pod가 만들어지는 사진을 그려본거다. ㄱㅊ죠,, ?

레플리카셋의 기본 구조를 가지고 왔는데, 본인에게 맞는 부분으로 채워서 써야한다.

주석을 달아놨으니 ,, 가져가실 거면 지우고 하세요.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 2 // 몇개의 파드 생성?
  selector: //
    matchLabels:
      type: web
      ver: v1
    matchExpressions:
    - {key: type, operator: In, values: [web, backend, frontend]} 
    // 값이 존재만 해도 해당되게 하겠다. 할 때 쓰는 것
    - {key: ver, operator: Exists} // ver키가 존재하면 매칭이 되게 해 준다.
  template: // 내가 만들 컨테이너가 뭔지
    metadata:
      name: pod1
      labels:
        type: web // 라벨 맞춰주기
        ver: v2
    spec: // pod에서 배운 문법들 , 환경변수나 볼륨 포트 할 거면 쓰기
      containers:
      - name: container
        image: 이미지
        ports:
        - containerPort: 8000
      terminationGracePeriodSeconds: 0 
      // 프로그램이 꺼질 때 메모리 정리하고 끄는 시간

 

몇개의 파드를 생성 할 건지 내가 원하는대로 늘려줄 수도 있다.

 

 

오늘 배운 것 중 가장 중요한 것.

  • 서비스는 파드 연결을 라벨로 한다.
  • 디플로이먼트로 파드를 만든다.

 

!


 

Problem

 

쿠버네티스의 기본 구조에 대해서 다시 한 번은 살펴보고, 혼자 실습을 해 보는 시간을 가져야 하는데 그러지 못 해서 아쉽다. 3일의 시간은 너무 짧은 것 같다 ,, 좀 더 시간이 있었으면 더 깊게 했을텐데 싶은 마음이 아쉬웠다 ㅇㅇ..

 

회고록을 드디어 따라잡았다. 이젠 밀리지 말아야지 ,, (이래놓고 또 밀릴듯)

 

Try

 

혼자 실습 꼭 해보기 ++ 안 되면 그냥 강사님께 찾아가기

내가 잡고 있는다고 되는 건 거의 없더라 ㅇㅇ

728x90