- Volumes
- Persistent Volumes(PV)
- Projected Volumes ← 오늘 볼 내용
- Ephemeral Volumes
- 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를 통해 레이블과 CPU한도가 값으로 저장된 파일이 생성되었다.
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은 소유자, 그룹, 기타 사용자 모두에게 읽기, 쓰기, 실행 권한을 부여하겠다는 의미가 된다.
위 구성요소와 같이 실제 파일의 권한을 변경하여 컨테이너 볼륨 내부에 저장할 수 있다.
서비스 어카운트(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이 들어가게 된다.
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 |