Kubernetes

Kubernetes 기초 - Storage(3)

사실 나도 모름 2024. 1. 22. 00:52
  1. Volumes
  2. Persistent Volumes(PV)
  3. Projected Volumes                ←  오늘 볼 내용
  4. Ephemeral Volumes
  5. Storage Classes

3. Projected Volumes

Projected Volumes은 configmap, secret, downwardAPI, serviceAccountToken과 같은 소스 데이터들을 포함하여 볼륨을 생성하고 싶을 때 사용이 가능하다.

Projected Volumes은 쿠버네티스 API 오브젝트가 아니며 파드 명세에 볼륨 필드의 하위에 projected라는 필드를 정의하여 구성 가능하다.

 

 

 

기본 Projected Volumes 구조

아래는 Projected Volumes을 사용하는 yaml 구조다.

# projected-secret-downwardapi-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    command: ["sleep", "3600"]
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

 

위 파일의 내용을 보면 all-in-one이라는 볼륨을 사용하며 컨테이너에 projected-volume이라는 이름의 디렉토리를 생성한다.

mysecret이라는 이름의 secret 내에서 username이라는 키를 가진 데이터를 my-group디렉토리 내 my-username이라는 파일이름으로 저장한다.

downwardAPI는 kubenetes에서 지원하는 파드와 컨테이너의 상세정보의 데이터를 파일로 저장할 수 있는 메커니즘이다.

metadata.labels 즉 파드의 레이블, limits.cpu 즉 컨테이너의 가용 CPU 한도를 파일로 저장하게 된다.

또한 myconfigmap이라는 이름의 configmap 내에서 config라는 이름의 키의 데이터를 my-group 디렉토리 내 my-config라는 이름으로 파일을 저장한다.

 

위 내용을 직접 실습확인하기 전에 configmap과 secret에 대한 yaml파일을 실행한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  config: my-config
---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: dXNlcm5hbWU=  # base64-encoded "username"
  password: cGFzc3dvcmQ=  # base64-encoded "password"

 

 

위 yaml파일을 모두 실행한 후 결과를 보자.

kubectl exec -it volume-test -c container-test -- sh

생성된 볼륨과 파일 및 디렉토리

 

projected-volume이라는 디렉토리 내에 설정한 내용과 같이 파일과 디렉토리가 생성되었다.

 

 

downwardAPI로 생성한 파드의 정보

 

downwardAPI를 통해 레이블과 CPU한도가 값으로 저장된 파일이 생성되었다.

 

 

my-group 디렉토리와 내부에 생성된 파일

 

 

configmap의 내용이 들어있는 my-config와 secret의 내용이 들어있는 my-username파일이 생성되었다.

 

 

 


권한을 변경하여 투영하는 Projected Volumes

Projected Volumes을 사용하는 가장 기본적인 방법은 위와 같다.

이번에는 기본이 아닌 Permission이 적용된 파일을 생성하는 yaml파일을 한번 보자.

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    command: ["sleep", "3600"]
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - secret:
          name: mysecret
          items:
            - key: password
              path: my-group/my-password
              mode: 511

 

 

추가된 것이라고는 'mode'라는 필드가 생긴 것이다.

mode: 511은 파일의 권한에 대한 정보로 511은 8진수로 777을 의미한다.

8진수로 이루어진 UNIX권한 체계에 의하면 읽기는 4, 쓰기는 2, 실행은 1의 값을 가지고 각 수의 합으로 권한을 결정한다.

즉, 8진수로 777은 소유자, 그룹, 기타 사용자 모두에게 읽기, 쓰기, 실행 권한을 부여하겠다는 의미가 된다.

my-password의 권한은 777이다.

 

 

위 구성요소와 같이 실제 파일의 권한을 변경하여 컨테이너 볼륨 내부에 저장할 수 있다.

 

 

 


서비스 어카운트(serviceAccountToken) Projected Volumes

Projected Volumes은 서비스 어카운트도 투영할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: sa-token-test
spec:
  containers:
  - name: container-test
    image: busybox:1.28
    command: ["sleep", "3600"]
    volumeMounts:
    - name: token-vol
      mountPath: "/service-account"
      readOnly: true
  serviceAccountName: default
  volumes:
  - name: token-vol
    projected:
      sources:
      - serviceAccountToken:
          audience: api
          expirationSeconds: 3600
          path: token

 

 

변경된 내용은 serviceAccountToken이라는 필드가 생긴 것이다.

audience: api는 토큰의 수신자를 api로 설정하는 것이고 expirationSeconds: 3600은 토큰의 만료 시간을 3600초 후로 설정한 것이다.

path: token은 경로를 token이라는 디렉토리로 설정하는 것이다.

serviceAccountToken은 service-account라는 이름의 디렉토리에 저장되며 내부에 default계정의 Token이 들어가게 된다.

serviceAccountToken을 투영

 

 

 

Projected Volumes을 이용하여 쿠버네티스 1.29버전부터 ClusterTrustBundle이라는 알파버전의 기능을 사용할 수 있다.

기능게이트를 따로 활성화해야 하며 자세한 내용은 공식 문서를 확인해보자.

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Storage(5)  (0) 2024.01.23
Kubernetes 기초 - Storage(4)  (0) 2024.01.22
Kubernetes 기초 - Storage(2)  (0) 2024.01.20
Kubernetes 기초 - Storage(1)  (0) 2024.01.12
Kubernetes 기초 - Scheduling(6)  (0) 2024.01.10