이번글에서 Pod의 기능정리에 대해서 마무리해보겠습니다.
지금까지는 1개의 컨테이너만 사용하여 실습왔습니다.
Pod내에는 1개이상의 컨테이너를 가질수 있는 최소실행단위라고 했었습니다.
그럼 2개의 서로다른 컨테이너를 만들어 실습해보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: second
spec:
containers:
- name: nginx
image: nginx
- name: curl
image: curlimages/curl
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 5; curl localhost; done"]
지금까지 containers property에는 1개의 컨테이너만 명세했었지만, 리스트에 여러 컨테이너정보를 넣어서 2개의 이상의 컨테이너를 가진 Pod를 생성할 수 있습니다.
Pod를 생성하고
logs
명령을 사용하면 error 메세지가 출력됩니다.
메세지 끝부분에 [nginx curl]
리스트에 두개의 컨테이너 중 하나를 선택해달라고 합니다.
따라서 어떤 컨테이너의 로그를 측정할 지 -c
옵션으로 컨테이너name
을 명시해주어야 합니다.
curl 컨테이너로 바꿔서 해보겠습니다.
처음 실행하면 5초 대기 후 실행이 됩니다.
쿠버네티스는 Pod내부 컨테이너끼리 실행 순서를 보장하지 않습니다.
따라서 nginx
컨테이너가 정상적으로 서비스가 올라오고 curl
을 호출하게 만든 목적으로 대기합니다.
Pod내에 컨테이너 중 첫번째 컨테이너가 먼저 실행된다는 보장은 없습니다.
그렇다면 메인 컨테이너가 실행되기 전에 미리 컨테이너를 초기화 하는 법을 알아보겠습니다.
initContainers property
를 사용하면 컨테이너 초기화 작업을 할 수 있습니다.
initContainers
는 위에서 말했다시피 메인 컨테이너 실행전, 먼저 초기화를 위해 실행되는 컨테이너를 명세합니다.
위에 명세서를 분석하자면, 메인 컨테이너가 실행하기 전에 git 리포지토리를 갖고있어야한다면, 초기화 컨테이너에서 먼저 git pull을 받아 컨테이너끼리의 공유 공간인 emptyDir
볼륨(/tmp)에 git 리포지토리를 전달합니다.
그 뒤 메인 컨테이너는 git 리포지토리가 있다고 가정하고 로직을 수행합니다.
쿠버네티스에는 설정값들을 따로 모아두고 필요할 때 꺼내 사용할 수 있는 메커니즘이 존재합니다.
이 설정값들이 모아둔 곳을 ConfigMap
이라고 합니다.
이번 실습에서는 ConfigMap
에 값들을 불러와서 Pod에 전달하는 법을 알아보겠습니다.
지금까지 Pod에 직접 설정값(metadata)을 작성했지만 ConfigMap
에 모든 설정값들을 저장해서 Pod에서 필요한 값만 불러오게 할 수 있습니다.
ConfigMap
을 생성하는 기본 포맷입니다.
$ kubectl create configmap <key> <data-source>
weapon=gun
health=4
potion=2
게임 설정 파일을 하나 만들어 봅니다.
--from-file
옵션을 사용하여 game.properties
파일을 game-config
라는 이름의 ConfigMap
으로 만들어 보겠습니다.
$ kubectl create configmap game-config --from-file=game.properties
ConfigMap을 상세 조회 해봤습니다.
data
는 설정값들이 저장된 데이터입니다.
--from-literal
이라는 옵션을 사용하여, ConfigMap
을 생성해보겠습니다.
-literal
옵션은 사용자가 직접 설정값을 지정합니다.
사용자가 직접 ConfigMap리소스를 YAML명세서로 만들 수도 있습니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: monster-config
namespace: default
data:
monsterType: fire
monsterNum: "5"
monsterLife: "3"
ConfigMap
을 볼륨으로 마운트하여 파일처럼 사용할 수 있습니다.
volumes
는 Pod에서 사용할 볼륨을 지정하고, configMap
이라는 볼륨 종류에서 name이 game-config
인 볼륨을 사용하겠다는 뜻입니다.
game.properties
라는 파일로 만든 ConfigMap
을 동일하게 파일로 볼륨 마운트해서 활용하는 방법이였습니다.
ConFigMap을 Pod의 환경변수로도 사용할 수 있습니다.
env
: 환경변수 사용
name
: 환경변수 키값
valueFrom
: 다른 리소스를 참조할때 사용
configMapKeyRef
: ConfigMap을 참조하겠다는 의미
앞에서 만든 special-config
라는 이름의 ConfigMap을 선택하고 special.power
를 환경변수로 사용하게 됩니다.
ConfigMap에 포함된 모든 설정값을 환경변수로 사용하는 법에 대해 실습해보겠습니다.
envFrom
은 env
를 대신해서 사용하는 property
입니다.
valueFrom
과는 다르게 configMapRef
의 name
까지만 정의해서 ConFigMap
전체를 사용합니다.
monster-config
ConfigMap에 설정된 모든 값들이 환경변수로 설정되었습니다.
Secret리소스는 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 갖는 리소스로서 Pod 명세서나 컨테이너 이미지에서 중요한 정보를 포함시키길 원치않을 때 사용하는 리소스입니다.
쿠버네티스 Secret리소스는 기본적으로 API서버의 etcd에 암호화되지 않은 상태로 저장됩니다.
Api접근 권한이 있는 사용자나 etcd접근할 수 있는 모든 사용자는 Secret을 조회/수정할 수 있습니다.
또는 네임스페이스에서 Pod를 생성할 권한이 있어도 해당 접근을 사용하여 네임스페이스의 모든 Secret을 읽을 수 있습니다.
먼저 임의로 사용할 계정이름과 비밀번호로 만들어 base64
로 인코딩해보겠습니다.
위에서 얻은 값을 이용해서 Secret리소스를 생성하겠습니다.
type
은 여러 종류가 있지만 기본적으로 Opaque
를 사용합니다.
data
에 중요 데이터 값을 정의합니다.
data
에 값들을 base64
로 직접 인코딩하지 않고 쿠버네티스가 대신 처리할 수도 있습니다.
data -> stringdata를 사용합니다.
선언형 커맨드인 yaml말고도 명령형 커맨드를 사용해서 Secret리소스를 생성할 수도 있습니다.
username=admin
password=password123
위 파일을 생성 후 --from-env-file
옵션을 사용하여 properties파일 정보로 Secret리소스를 생성합니다.
Secret의 사용처에 관련된 예제들을 몇개 알아보겠습니다.
Secret도 ConfigMap와 마찬가지로 볼륨 연결이 가능합니다.
환경변수 활용도 ConfigMap
과 유사합니다.
앱이 실행되기 전에 이미 알고있는 속성, 설정 값들은 ConfigMap
이나 Secret
리소스로 파드에 전달할 수 있지만, 파드가 생성 및 실행 되기전에는 알 수 없는 속성들도 존재합니다.
ex) Pod의 이름, IP, Pod내의 node정보 등
이런 Pod의 metadata를 컨테이너에게 전달하는 것을 Downward API
라고 합니다.
ConfigMap
, Secret
처럼 볼륨과 환경변수 연결을 통해서 컨테이너에 정보를 전달할 수 있습니다.
downwardAPI
: 볼륨 종류
items
: 메타데이터로 사용할 아이템 리스트를 지정
Pod의 라벨 필드를 컨테이너의 지정한 path위치에 볼륨을 연결했습니다.
items[0].path를 labels로 지정해서 파일이름이 labels로 사용됩니다.
fieldPath
에 지정해놓은 정보들을 환경변수로 확인할 수 있습니다.
이번 포스트를 마지막으로 쿠버네티스의 가장 기본이 되는 Pod에 대해 핵심 기능들을 알아봤습니다.
이후에 공부할 리소스들 역시 Pod기반으로 확장되어 나오기 때문에 Pod에 대해 깊은 이해도가 필요합니다.
다음 포스트부터는 Service리소스를 실습해보겠습니다.
$ kubectl delete pod --all #생성한 모든 pod를 삭제합니다.