han098 2023. 8. 14. 22:41
반응형

중간 프로젝트가 끝나고 말도 안 되는 억까로 코로나에 걸려 겨우 살아나 블로그를 쓰지 못했다.

쿠버네티스 오브젝트

쿠버네티스 시스템에서 영속성을 가지는 오브젝트이다. 클러스터의 상태를 나타내기 위해 오브젝트를 이용한다.

  • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
  • 그 애플리케이션이 이용할 수 있는 리소스
  • 그 애플리케이션이 어떻게 재구동 정책, 업그레이드, 그리고 내고장성과 같은 것에 동작해야 하는지에 대한 정책

쿠버네티스 오브젝트는 하나의 "의도를 담은 레코드"이다.

오브젝트는 2개의 필드를 포함해야 하는데 spec, status이다.

spec : 오브젝트를 생성할 때 원하는 특징(의도한 상태)에 대한 설명을 제공해서 설정한다.

status : 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태를 설명한다.

쿠버네티스에서 오브젝트를 생성할 때, 기본정보 + spec을 yaml 파일로 kubectl에 제공해야 한다.

기본 오브젝트 4가지

파드(Pod)

쿠버네티스에서 생성하고 관리 할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.

하나 이상의 컨테이너 그룹으로 그룹은 스토리지 및 네트워크를 공유하고 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.

pod 생성 yaml 예시
apiVersion: v1 //스크립트를 실행하기 위한 쿠버네티스 API 버전 
kind: Pod //리소스의 종류 정의 Pod 쿠버네티스 선언
metadata: // 리소스의 라벨, 이름 등을 지정함
  name: nginx // namespace 상에서 유일한 값
spec: // 생성할 오브젝트의 구체적 내용을 정의하는 spec -> object마다 형식이 다르다.
  containers: // 컨테이너 명세를 배열로 기술
  - name: nginx // 컨테이너 이름
    image: nginx:1.14.2 // 컨테이너 생성시 사용할 이미지
    ports: // 외부 요청을 전달하기 위한 포트 목록
    - containerPort: 80 // 80번 포트를 사용한다.

쿠버네티스 namespace

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/namespaces/

쿠버네티스에서, 네임스페이스 는 단일 클러스터 내에서의 리소스 그룹 격리 메커니즘을 제공한다. 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다. 네임스페이스 기반 스코핑은 네임스페이스 기반 오브젝트 (예: 디플로이먼트, 서비스 등) 에만 적용 가능하며 클러스터 범위의 오브젝트 (예: 스토리지클래스, 노드, 퍼시스턴트볼륨 등) 에는 적용 불가능하다.

쿠버네티스 클러스터에서 사용되는 리소소들을 구분해 관리하는 그룹이다. pod와 service 등은 네임스페이스별로 생성 및 관리될 수 있으며, 네임스페이스별로 사용자 접근 권한을 다르게 설정할 수도 있다.

쿠버네티스는 namespace 즉 논리적인 분리 단위를 제공해 준다. -> 물리적 분리가 아닌 논리적 분리

볼륨 Volume

pod가 사라지더라도 사용할 수 있는 디렉터리는 볼륨 오브젝트를 통해 host에 저장할 수 있다.

서비스 Service

파드의 집합으로 쿠버네티스의 네트워크를 나타낸다.

ClusterIP - 클러스터 내부에서만 접근 가능한 pod끼리 통신하게 해주는 

NodePort - 클러스터 node위의 open port를 의미하며 고정 포트로 각 노드의 포트를 열어 외부에서 접속할 수 있게 한다.

LoadBalancer - 클라우드 공급자의 로드밸런서를 사용해 서비스를 외부에 expose 한다.

ExternalName -  잘 모르겠음

ex) Deployment

파드와 레플리카셋에 대한 선언적 업데이트를 제공한다.

디플로이먼트에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.

apiVersion: apps/v1 // api 버전과 디플로이는 apps/v1을 사용해야 한다.
kind: Deployment // 해당 yaml은 deployment라고 정의
metadata: // metadata 설정
  name: nginx-deployment // namespace 필드 nginx-deployment를 만든다.
  labels: // 라벨을 만든다.
    app: nginx // app=nginx라는 key : value 형식
spec: // spec 요구사항을 적는다.
  replicas: 3 // 레플리카는 3개로
  selector: // 생성된 레플리카셋을 관리할 파드를 찾아내는 방법을 정의
    matchLabels: // 라벨이 맞는 파드들을 관리한다.
      app: nginx // app=nginx라는 라벨을 가진 파드를 관리한다.
  template: // 새 파드를 런칭하는데 사용할 템플릿 -> selector와 labels 가 일치 해야 한다.
    metadata: // 파드 메타데이터
      labels: // 파드 라벨
        app: nginx // app=nginx
    spec: //파드 템플릿 사양
      containers: // 컨테이너 정보
      - name: nginx // 컨테이너 이름 nginx
        image: nginx:1.14.2 // 컨테이너에 사용할 이미지
        ports: // 컨테이너 사용 포트
        - containerPort: 80 // 80포트를 사용한다.
반응형