반응형

목차

  1. Annotations 정의와 예시
  2. 어노테이션 특징
  3. 네임스페이스의 특징
  4. 네임스페이스를 사용한 격리 이해하기

Annotations 정의와 예시

Kubernetes annotations(주석)은 파드, 배포, 서비스 등과 같은 Kubernetes 개체에 추가할 수 있는 메타데이터입니다. 개체를 식별하는 데 사용되지 않고 컨텍스트 또는 구성 옵션을 제공하는 데 사용되는 개체에 대한 추가 정보를 제공합니다. 어노테이션은 키-값 쌍으로 표시되며 Kubernetes 도구 또는 기타 애플리케이션에서 특정 작업을 수행하거나 추가 기능을 제공하는 데 사용할 수 있습니다.

다음은 Kubernetes 배포에서 어노테이션을 사용할 수 있는 방법의 예입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
  annotations:                * 주석
    app-type: web
    app-version: v1.2.3      
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-container
        image: example/image:latest

이 예에서는 배포 메타데이터에 app-type 및 app-version이라는 두 개의 어노테이션을 추가했습니다. 이러한 어노테이션은 배포 중인 애플리케이션 유형 및 해당 버전과 같은 배포에 대한 추가 정보를 제공합니다. 이 정보는 배포 및 관련 리소스를 더 잘 이해하기 위해 모니터링 도구 또는 기타 응용 프로그램에서 사용할 수 있습니다.

어노테이션을 사용하여 Kubernetes의 특정 기능이나 동작을 구성할 수도 있습니다. 예를 들어 kubectl 명령줄 도구는 특정 명령의 동작을 사용자 지정하는 데 사용할 수 있는 여러 어노테이션을 지원합니다. 다음은 어노테이션을 사용하여 kubectl expose 명령을 구성하는 방법의 예입니다.

kubectl expose deployment example-deployment --type=LoadBalancer \
  --port=80 --target-port=8080 \
  --annotations="service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:123456789012:certificate/12345678-1234-1234-1234-123456789012"

이 예에서는 example-deployment 배포를 위한 새 서비스를 생성하고 annotations 플래그를 사용하여 로드 밸런서에 대한 AWS SSL 인증서를 지정합니다. 이 어노테이션은 이 서비스와 연결된 로드 밸런서에 대해 지정된 SSL 인증서를 사용하도록 Kubernetes에 지시합니다.


어노테이션 특징

파드 및 다른 오브젝트는 레이블 외에 어노테이션을 가질 수 있습니다. 어노테이션은 키-값 쌍으로 레이블과 거의 비슷하지만 식별 정보를 갖지 않습니다. 레이블은 오브젝트를 묶는  데 사용할 수 있지만, 어노테이션은 그렇게 할 수 없습니다. 레이블 셀렉터를 통해서 오브젝트를 선택하는 것이 가능하지만 어노테이션 셀렉터와 같은 것은 없습니다.

 

반면 어노테이션은 훨씬 더 많은 정보를 보유할 수 있습니다. 이는 주로 명령어들에서 사용됩니다. 특정 어노테이션은 쿠버네티스에 의해 자동으로 오브젝트에 추가되지만, 나머지 어노테이션은 사용자에 의해 수동으로 추가됩니다.

 

어노테이션은 쿠버네티스에 새로운 기능을 추가할 때 흔히 사용됩니다. 일반적으로 새로운 기능의 알파 혹은 베타 버전은 API 오브젝트에 새로운 필드를 바로 도입하지 않습니다. 필드 대신 어노테이션을 사용하고, 필요한 API 변경이 명확해지고 쿠버네티스 개발자가 이에 동의하면 새로운 필드가 도입됩니다. 그리고 관련된 어노테이션은 사용이 중단되게 됩니다.

 

어노테이션이 유용하게 사용되는 경우는 파드나 다른 API 오브젝트에 설명을 추가해두는 것입니다. 이렇게 하면 클러스터를 사용하는 모든 사람이 개별 오브젝트에 관한 정보를 신속하게 찾아볼 수 있습니다. 예를 들어 오브젝트를 만든 사람 이름을 어노테이션으로 지정해두면, 클러스터에서 작업하는 사람들이 좀 더 쉽게 협업할 수 있습니다.


네임스페이스의 특징

이전에 레이블을 이용해 파드와 다른 오브젝트를 그룹으로 묶는 것을 다뤘었습니다. 각 오브젝트는 여러 레이블을 가질 수 있기 때문에, 오브젝트 그룹은 서로 겹쳐질 수 있습니다. 또한 클러스터에서 작업을 수행할 때 (예를 들어 kubectl 명령을 통해) 레이블 셀렉터를 명시적으로 지정하지 않으면 항상 모든 오브젝트를 보게 됩니다.

 

오브젝트를 겹치지 않는 그룹으로 분할하고자 할 때에는 어떻게 해야 할까요? 또 다른 클러스터를 만들어 완전히 별개의 작업공간을 만들 수도 있지만, 사실 한 번에 하나의 그룹 안에서만 작업하고 싶은것이 사람 마음입니다. 이러한 이유로 쿠버네티스는 오브젝트를 네임 스페이스로 그룹화합니다.

 

여기서 네임스페이스는 이전에 다루었던 프로세스를 격리하는데 사용했던 리눅스 네임스페이스가 아닙니다. 쿠버네티스 네임스페이스는 오브젝트 이름의 범위를 제공합니다. 모든 리소스를 하나의 단일 네임스페이스에 두지 않고 여러 네임스페이스로 분할할 수 있으며, 이렇게 분리된 네임스페이스는 같은 리소스 이름을 다른 네임스페이스에 걸쳐 여러번 사용할 수 있게 해줍니다.

 

여러 네임스페이스를 사용하면 많은 구성 요소를 가진 복잡한 시스템을 좀 더 작은 개별 그룹으로 분리할 수 있습니다. 또한 멀티테넌트 환경처럼 리소스를 분리하는 데 사용됩니다. 리소스를 프로덕션, 개발, QA 환경 혹은 원하는 다른 방법으로 나누어 사용할 수 있습니다. 리소스 이름은 네임스페이스 안에서만 고유하면 됩니다. 서로 다른 두 네임스페이스는 동일한 이름의 리소스를 가질 수  있습니다. 대부분의 리소스 유형은 네임스페이스 안에 속하지만 일부는 그렇지 않습니다. 그 가운데 하나는 노드 리소스인데, 이 리소스는 전역(global)이며 단일 네임스페이스에 얽매이지 않습니다.


네임스페이스를 사용한 격리 이해하기

네임스페이스를 사용하면 오브젝트를 별도 그룹으로 분리해 특정한 네임스페이스 안에 속한 리소스를 대상으로 작업할 수 있게 해주지만, 실행 중인 오브젝트에 대한 격리는 제공하지 않습니다.

 

예를 들어 다른 사용자들이 서로 다른 네임스페이스에 파드를 배포할 때 해당 파드가 서로 격리돼 통신할 수 없다고 생각할 수 있지만, 반드시 그런 것은 아닙니다. 네임스페이스에서 네트워크 격리를 제공하는지는 쿠버네티스와 함께 배포하는 네트워킹 솔루션에 따라 다릅니다.

 

네트워크 솔루션이 네임스페이스 간 격리를 제공하지 않는 경우 foo 네임스페이스 안에 있는 파드가 bar 네임스페이스 안에 있는 파드의 IP 주소를 알고 있었다면, HTTP 요청과 같은 트레픽을 다른 파드로 보내는 것에 아무런 제약 사항이 없습니다.

 

반응형