2023. 6. 20. 22:24ㆍ쿠버네티스 (Kubernetes)
Environment
시스템을 실행할 때 중요한 요소 중 하나는 환경 변수입니다.
갖가지 시스템이나 프로그램을 실행해봐서 알겠지만, 대부분의 경우에 환경 변수로 통제하기 때문입니다.
또한 배포할 때 운영 목적인지, 테스트 목적인지에 따라 서버를 띄울 때 다른 환경 변수나 인자를 전달할 때도 있습니다.
ConfigMap
ConfigMap은 환경 변수나 커맨드 라인에 쓰일 인자(argument)들을 정의한 쿠버네티스 객체(object)입니다.
이를 만들 때는 선언적 방식이나 명령적 방식 모두 사용할 수 있는 데, 아래 예시에서는 명령적 방식을 사용해보겠습니다.
먼저 다음 파일을 만들어봅니다.
my-config.txt
# This is a sample config file that I might use to configure an application
parameter1 = value1
parameter2 = value2
그리고 create configmap 명령어를 실행해서 생성해봅니다.
kubectl create configmap my-config \
--from-file=my-config.txt \
--from-literal=extra-param=extra-value \
--from-literal=another-param=another-value
configmap/my-config created
생성된 객체 정보를 yaml 형식으로 확인해보면 다음과 같습니다.
kubectl get configmaps my-config -o yaml
apiVersion: v1
data:
another-param: another-value
extra-param: extra-value
my-config.txt: |
# This is a sample config file that I might use to configure an application
parameter1 = value1
parameter2 = value2
kind: ConfigMap
metadata:
creationTimestamp: "2023-06-19T15:05:07Z"
name: my-config
namespace: default
resourceVersion: "14686"
uid: 0ac6af3e-7a42-4ad8-b55c-a1400e290c51
결과를 보면 단순히 키-값 형식으로 data 에 저장되어 있음을 알 수 있습니다.
Use ConfigMap
ConfigMap을 사용할 수 있는 방법은 파일 시스템, 환경 변수, 커맨드 라인 3가지가 있습니다.
kuard-config.yaml
apiVersion: v1
kind: Pod
metadata:
name: kuard-config
spec:
containers:
- name: test-container
image: gcr.io/kuar-demo/kuard-amd64:blue
imagePullPolicy: Always
command:
- "/kuard"
- "$(EXTRA_PARAM)"
env:
- name: ANOTHER_PARAM
valueFrom:
configMapKeyRef:
name: my-config
key: another-param
- name: EXTRA_PARAM
valueFrom:
configMapKeyRef:
name: my-config
key: extra-param
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: my-config
restartPolicy: Never
먼저 env 속성에 정의된 내용은 환경 변수입니다. 모두 일전에 정의한 my-config에서 값을 가져오고 있습니다.
그리고 command 속성을 보면 어플리케이션을 실행할 때 함께 쓰일 커맨드 라인 정보가 있습니다.
여기서 EXTRA_PARAM은 env에 정의되어 있습니다.
volumnMounts와 volumns는 파일 시스템을 사용하여 지정한 경로에 ConfigMap을 저장하도록 합니다.
이제 위 파일로 pod을 생성해봅니다.
kubectl apply -f kuard-config.yaml
kubectl port-forward kuard-config 8080
localhost:8080에 접속 후 Server Env 탭을 방문해면 커맨드 라인 및 환경 변수를 확인할 수 있습니다.
그리고 File system browser 탭을 방문하고 config 디렉터리를 열면, 이전에 만들었던 정보를 확인할 수 있습니다.
Secrets
일전에 배운대로, ConfigMap을 이용하면 어플리케이션에 직접 값을 전달할 수 있습니다.
하지만 토큰이나 비밀번호 같은 민감한 정보들은 파일에 명시해서 전달하는 게 까다로울 수 있습니다.
이렇게 사적인(private) 데이터들을 secrets이라고 합니다.
쿠버네티스는 이러한 데이터를 관리하는 방법을 제공합니다.
먼저 저장할 대상으로 책에 소개된 TLS 키와 인증서를 다운로드 해봅니다.
curl -o kuard.crt https://storage.googleapis.com/kuar-demo/kuard.crt
curl -o kuard.key https://storage.googleapis.com/kuar-demo/kuard.key
이제 create secret 명령어를 통해 kuard-tls 이름으로 만들어봅니다.
kubectl create secret generic kuard-tls \
--from-file=kuard.crt \
--from-file=kuard.key
만든 secret을 확인하려면 describe 명령어를 실행하면 됩니다.
kubectl describe secrets kuard-tls
Name: kuard-tls
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
kuard.crt: 1050 bytes
kuard.key: 1679 bytes
생성된 secret은 쿠버네티스 API를 통해 조회할 수 있습니다.
Secrets Volumes
pod에서 secret을 조회할 때 secrets volume을 사용합니다.
이는 kubelet에서 관리되고, 메모리에서만 존재하며 pod이 생성될 때 함께 생성됩니다.
일전에 만든 kuard-tls를 /tls에 마운트해서 pod을 생성해봅니다.
kuard-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: kuard-tls
spec:
containers:
- name: kuard-tls
image: gcr.io/kuar-demo/kuard-amd64:blue
imagePullPolicy: Always
volumeMounts:
- name: tls-certs
mountPath: "/tls"
readOnly: true
volumes:
- name: tls-certs
secret:
secretName: kuard-tls
kubectl apply -f kuard-secret.yaml
kubectl port-forward kuard-tls 8443:8443
다 실행했으면 https://localhost:8443 에 접속해봅니다. (보안 관련 메시지는 무시하고 그냥 접속해봅니다)
그리고 File system browser 탭을 눌러 직접 /tls에 접속해보면 일전에 저장했던 kuard.crt과 kuard.key에 접근할 수 있음을 알 수 있습니다.
Management
본 챕터에서는 ConfigMap, Secrets을 관리하는 방법을 소개하겠습니다.
Listing
get 명령어를 사용하면 저장되어 있는 ConfigMap, Secrets을 가져올 수 있습니다.
kubectl get configmaps
NAME DATA AGE
kube-root-ca.crt 1 24h
my-config 3 21h
kubectl get secrets
NAME TYPE DATA AGE
kuard-tls Opaque 2 21m
describe 명령어를 사용하면 더욱 자세한 정보를 얻을 수 있습니다.
kubectl describe configmap my-config
Name: my-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
extra-param:
----
extra-value
my-config.txt:
----
# This is a sample config file that I might use to configure an application
parameter1 = value1
parameter2 = value2
another-param:
----
another-value
BinaryData
====
Events: <none>
Creating
create 명령어를 사용하면 ConfigMap, Secrets을 만들 수 있습니다.
kubectl create secret generic <name> <option>
kubectl create configmap <name> <option>
<option> 자리에는 원천 데이터를 지정할 수 있는 데 종류는 다음과 같습니다.
--from-file=<filename> | 파일에 명시된 모든 값들 |
--from-file=<key>=<filename> | 파일에서 특정 키에 해당하는 값 |
--from-file=<directory> | 디렉터리 내에 키 이름에 적합한 모든 파일들 |
--from-literal=<key>=<value> | 직접 키 - 값을 지정 |
Updating
최초에 ConfigMap, Secrets를 yaml으로 정의해서 생성했다면 해당 파일을 수정해서 replace 명령어를 실행하면 업데이트 할 수 있습니다.
kubectl replace -f <filename>
다른 방법으로는 create 명령어를 사용해서 yaml을 생성한다음, replace 명령어에 전달해주는 것입니다.
kubectl create configmap my-config \
--from-file=my-config.txt --dry-run=client \
-o yaml | kubectl replace -f -
--from-file 까지만 실행하면 이미 존재한다는 에러 메시지를 뱉는데, 이 다음 뒤의 절을 추가함으로 실제 서버에는 데이터를 보내지 말고 yaml으로 출력하라고 한 다음, 해당 출력을 replace 명령어 인자로 제공합니다.
마지막으로 edit 명령어를 사용해서 기존에 있던 yaml을 업데이트할 수 있습니다.
kubectl edit configmap my-config
'쿠버네티스 (Kubernetes)' 카테고리의 다른 글
[Kubernetes] 7. 배포 (0) | 2023.06.19 |
---|---|
[Kubernetes] 6. 레플리카 (0) | 2023.06.13 |
[Kubernetes] 5. 서비스 검색 (0) | 2023.06.12 |
[Kubernetes] 4. POD (0) | 2023.06.03 |
[Kubernetes] 3. 팁 (0) | 2023.06.01 |