210629 TIL

쿠버네티스

POD

pod 안에는 독립적인 애플리케이션이 실행되는 container들이 존재한다.

그 컨테이너들은 서비스가 연결될 수 있도록 포트를 가지고 있고 한개 이상의 포트를 가질 수는 있지만 한 개의 팟 안에 중복되도록 가질 수는 없다.

2개의 컨테이너는 한 호스트로 묶여있다고 보면 되는데, localhost로 접근 가능.

팟이 생성될 때 고유의 IP가 생성됨. 클러스터 내부에서만 그 ip를 통해서 팟에 접근이 가능하지만, 클러스터 외부에서는 불가능함.

만약 팟에 문제가 생기면 시스템이 감지를 해서 기존 팟 삭제 후 재생성하면서 ip 자동할당하여 변경됨.(휘발성 ip)

라벨은 팟 뿐만 아니라 모든 오브젝트에 달 수 있음. 팟에 가장 많이 사용됨.

사용 이유 : 목적에 따라 오브젝트들을 분류하고, 분류된 오브젝트들만 따로 모아서 연결을 하기 위함.

키:밸류 형태로 여러개의 라벨을 다는 것도 가능함.

YAML 파일에 팟 생성할때에

labels:
  type: web
  lo: dev

서비스 생성할때에

selector:
  type: web

와 같이 적으면 됌.

팟은 여러 노드들 중에 한 노드에 올라가야함.

직접 노드를 선택하는 방법과 자동 지정이 있음.

노드에 라벨을 달고 팟을 만들때 노드를 지정할 수 있음.

nodeSelector:
  hostname: node1

자동으로 판단해서 지정해주는 것.

메모리와 cpu 자원 사용량에 따라 알아서 해줌.

팟을 생성할때 팟이 사용할 리소스의 양을 라벨링 할 수 잇음.

limits의 경우 memory 초과시 팟 종료 시킴. cpu 초과시 requests로 낮추고 over 되어도 종료시키지는 않음.

resources:
  requests:
    memory: 2Gi
  limits:
    memory: 3Gi

Service

서비스는 기본적으로 자신의 클러스터 ip를 가지고 있음. 서비스와 팟이 연결되어 있으면 서비스의 ip로도 팟에 접근할 수 있음. 팟의 ip는 자동할당이기 때문에 불안정함. 팟의 ip와 마찬가지로 클러스터 내부에서는 접근 가능하지만 외부에서는 접근 불가함.

type: ClusterIP

type: NodePort

ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000

노드포트는 30000 ~ 32767 값을 가질 수 있고 안적으면 자동할당.

노드포트로 만들어도 기본적으로 클러스터IP가 할당되며 같은 기능을 쓸 수 있음.

클러스터의 모든 노드에 똑같은 포트로 할당이 됨.

어느 노드의 ip건 간에 포트만 동일하게 접속하면 연결된 해당 서비스 오브젝트로 연결이 됨.

externalTrafficPolicy: Local

이 옵션을 주면 접속한 노드(ip로)에 있는 팟에게만 연결이 된다.

로드밸런서 타입의 서비스

기본적으로 노드 포트의 성격을 가지고 있고 거기에 추가적으로 로드밸런서가 있어서 트래픽을 분산시켜줌.

로드밸런서의 ip는 별도로 할당해주는 플러그인이 있어야 ip를 부여받을 수 있다. GCP, AWS, Azure 같은 거를 이용하면 이미 플러그인이 있어서 알아서 해줌.

type: LoadBalancer

다른 타입의 서비스들도 있음.

클러스터ip는 외부 접근 불가, 내부에서만 접근 가능. 쿠버네티스 대쉬보드 관리, 팟의 서비스상태 디버깅

노드포트는 물리적인 호스트의 ip를 통해서 하드에 접근 가능. 호스트 ip는 보안적으로 내부에서만 접근하게 관리를 함. 일시적인 외부 연동용.

외부에 서비스 노출하는 용도로 로드밸런서 타입을 사용함. 실제 외부 사용을 하기 위해 사용함.

서비스에 타입을 설정하지 않으면 기본적으로 ClusterIP 로 할당이 된다.

서비스가 살아있고 팟이 죽어도 라벨과 셀렉터로 연동되어 있기 때문에 다시 자동으로 연결이 된다.

클러스터ip가 죽었다가 다시 살아나면 아이피 그대로인가...?

Volume

emptyDir : 최초 생성될 때 비어 있는 볼륨이라서 이름이 이래 되었음. 컨테이너끼리 볼륨을 공유하기 위해. 공통된 (공유된) 볼륨은 팟 안에 생성. 팟 재생성시 싹 비워짐.

volumeMounts:

  • name: empty-dir

mountPath: /mount1

volumes:

  • name: empty-dir

emptyDir: {}

저 {}의 의미는 뭘까?

hostPath

노드에 볼륨을 공통된(공유된) 볼륨으로 사용. 컨테이너가 아니라 파드들이 공유함.

팟이 죽었다가 다시 생성될때 노드가 여러개면 반드시 그 노드에 생성되리라는 법이 없어서... 공유된 볼륨을 사용하고 싶어도 못하는 경우가 생겨버림.

노드와 노드끼리 수동으로 연결되게끔 작업을 해주면 불가능한 것도 아니지만 사람손을 타면 휴먼에러가 발생하기 때문에... 그닥 추천하는 방법이 아님.

각각의 노드는 각 노드들의 자신들을 위해서 사용되는 파일들(시스템 파일들이나 여러 설정 파일들)이 있는데 팟이 자기가 할당되어 있는 호스트에 데이터를 읽거나 써야될때 사용.

hostPath에 들어가는 노드의 path는 이미 만들어져 있는 경로여야 된다.

퍼시스턴트볼륨(PV) / 퍼시스턴트볼륨클레임(PVC)

다양한 형태의 실제 볼륨을 퍼시스턴트볼륨과 연결하고 그 PV들이 PVC에 연결이 되고 PVC는 팟들과 연결이 되어 있다.

볼륨 사용에 있어서 유저영역과 어드민 영역으로 나누었음. 어드민은 말 그대로 관리자고, 유저는 파드에 서비스를 올려서 배포하는 사람을 의미.

볼륨 전문가가 세팅을 쫙 해놓으면 서비스 배포에 필요한 만큼 YAML을 작성해서 팟을 생성하는거임. - 오 좋은데? 한번 잘 세팅해놓으면 잘 쓰겠다.

9분 13초

실습때 사용할 로컬볼륨을 잠깐 설명을 해드리면, 아까 hostPath처럼 노드에 있는 로컬 볼륨을 사용하는 거구요. 밑에 달린 내용들이 많은데 지금 당장에는 모르셔도 좋습니다. 결론적으로 PV에 연결되는 팟들은 node1에만 생성된다는 뜻이다. 오.. 그래야 노드에 있는 path를 사용해서 볼륨을 사용할 수 있을테니까.. 그렇게 세팅해놓는게 당연해보이는데?

이런 로컬의 PV/PVC는 잘 사용하지 않아요. 개념만 살펴보려고 하는 것이니까 너무 깊게 생각하지는 말구요. 중요한건 capacity와 accessModes인데 세팅을 딱 해놓으면 PV와 PVC가 연결될때 쿠버네티스가 알아서 그 세팅값에 맞는 YAML이 적인 애들을 찾아서 연결함.

ConfigMap, Secret

개발환경과 배포환경에서 달라지는 cofig에 대해서 일일이 이미지에 그 정보를 넣어 관리하는 것이 아니라 외부에서 관리할 수 있도록 도와주는 것이 바로 ConfigMap과 Secret이라는 것이다.

분리해야되는 일반적인 상수들을 모아서 ConfigMap에 담고, 보안적인 관리가 필요한 것들은 Secret에 담는다. 그리고 이걸 참조해서 파드가 생성되도록 하면 되는 것이다.

ConfigMap: 키와 밸류로 넣으면 된다.

Secret : 보안적인 이슈가 있어서 메모리에 올라가며 1메가로 용량을 제한한다. literal로 만들때에 Base64로 값을 만들어서 넣어야하며 팟이 생성될때 자동으로 디코딩해서 만들어진다.

ConfigMap, Secret 파일을 만들어서 할 수 도 있는데 얘는 쿠버네티스 대시보드에서는 안되서 kubectl 명령어를 통해 진행해야한다. Secret의 경우 파일 안의 내용이 읽혀지면서 Base64로 변경이 되기 때문에 주의해야함. 미리 Base64로 만들어 놓으면 안됨.

또는 아예 볼륨을 마운트해서 그 볼륨 안에 파일을 넣고 거기서 팟을 생성해도 된다.

env 형태로 파일을 이용해 값을 넣는 것은 팟 생성 후 파일이 변경되어도 팟이 다시 생성되지 않는 한 변경이 안되고

volume mount 형태로 파일을 이용해 값을 넣는 것은 팟이 죽었다 살아나지 않아도 변경된대로 사용이 가능하다.

Namespace, ResourceQuota, LimitRange

팟이 사용하고자 하는 자원의 양의 합을 네임스페이스마다 또는 클러스터마다 설정을 해두는 것 = ResourceQuota.

팟에서 요구하는 자원량이 일정 한계를 넘으면 해당 네임스페이스 또는 클러스터에 생성이 되지 않도록 LimitRange를 걸 수도 있다.

한 네임스페이스 안에서는 팟 오브젝트의 uuid가 달라도(각기 다른 객체일지라도) 이름이 같으면 안된다.

서로 다른 네임스페이스에 있다면 팟끼리 연결이 안된다. 물론 노드나 퍼시스턴트볼륨(PV)과 같이 공용으로 사용하는 것도 있긴 함. 네임스페이스를 지우면 안에 있는 자원들도(팟, 서비스 등) 지워지므로 유의.

request.memory와 limits.memory가 뭐가 다른거임?

자원을 제한할때 cpu, memory, storage를 제한할 수 있고, 여러 오브젝트들을 제한할 수 있음.

LimitRange

min : 최솟값

max: 최댓값

maxLimitRequestRatio: 최솟값과 최댓값의 비율

defaultRequest, default: requests와 limits가 명시되지 않은 팟이 생성될때 해당 값들을 설정해줌.

댓글을 작성해보세요.

채널톡 아이콘