[Kubernetes] 8. 설정

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