본문 바로가기
DevOps/Kubernates

[CKA] 94-104 Configure Application, Commands, ConfigMap, Secret

by BenKangKang 2023. 4. 5.

94. Solution: Rolling update : (Optional)


95. Configure Application

Configuring applications comprises of understanding the following concepts:

  • Configuring Command and Arguments on applications
  • Configuring Environment Variables
  • Configuring Secrets

We will see these next


96. Commands

Docker

  • 컨테이너는 특정 작업을 실행하기 위한 것이기 때문에 작업이 완료되면 컨테이너가 종료된다. 컨테이너에서 실행되는 프로세스는 Dockerfile에 의해 정의되며, CMD는 컨테이너 안에서 실행될 명령이다.
    • Mysql Dockerfile -> cmd mysqld
    • Nginx Dockerfile -> cmd nginx
  • Dockerfile
    - CMD 지정할 때는 공백을 주지 않고 JSON 배열로 관리한다. ["sleep 5"] -> ["sleep", "5"]

Docker 에서 컨테이너 실행 방법

1. docker run 명령어에 COMMAND를 추가하는 것

  • 이미지에 지정된 기본 명령을 재정의한다.
  • docker run ubuntu sleep 5를 실행하면 컨테이너가 작동할 때 sleep을 5초 동안 실행하고 종료된다.

2. CMD를 추가한 Dockerfile을 작성해서 이미지를 빌드하는 것

  • 일시적으로 명령을 실행하는 앞의 방법과 다르게 컨테이너가 영구적으로 명령을 실행하도록 할 수 있다.
  • 명령을 지정하는 방법은 셸 양식, JSON이 있다.

ENTRYPOINT vs CMD

  • CMD
    • 오버라이딩이 쉽다.
    • docker run 시에 다른 실행 명령어가 있으면 CMD 명령어에 써준 내용은 무시된다. -> CMD 명령어는 docker run 명령 내에 명시된 매개변수가 있는 경우 Daemon에서 무시된다.
  • ENTRYPOINT
    • 오버라이딩이 어렵다.
    • 다른 명령어가 있어도 ENTRYPOINT 명령어는 무시되지 않고 docker run에 붙여준 실행 명령어를 인자로 받아서 컨테이너를 실행한다. -> ENTRYPOINT 명령어는 무시되지 않고 대신 명령의 인수로 취급하여 매개변수로 추가된다.
  • 둘다 사용하면? ENTPRYPOINT ["python", "app.py"] ,CMD ["--color", "red"]

97. Commands and Arguments

쿠버네티스에서 이미지를 실행하는 법에 대해 알아봅니다.
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/

Docker

docker run --name ubuntu-slepper \ 
  --entrypoint sleep2.0 ubuntu-sleepr 10

Dockerfile -> Kubernetes manifest

  • command
    • Dockerfile에 ENTRYPOINT 변경
  • args
    • Dockerfile의 CMD를 재정의
    • docker run 명령에 추가되는 모든 항목은 args배열 형식으로 포드 정의 파일의 속성으로 이동
    • args필드를 명령보다 우선한다.

98. Practice Test - Commands and Arguments


99. Solution - Commands and Arguments


100. Configure Environment Variables in Applications

파드 정의 파일에서 env 필드를 사용하여 환경변수를 설정할 수 있다.

Docker의 ENV 변수

$ docker run -e APP_COLOR=pink simple-webapp-color

쿠버네티스의 ENV 변수

apiVersion: v1
kind: Pod
metadata:
  name: simple-webapp-color
spec:
 containers:
 - name: simple-webapp-color
   image: simple-webapp-color
   ports:
   - containerPort: 8080
   env:
   - name: APP_COLOR
     value: pink
  • ENV (키-값 포맷)
    • 환경 변수를 설정하려면 env포드 정의 파일에서 속성을 설정합니다.
    • 배열이어서 항목으로 적는다.

  • 이외에도 컨피그맵, 시크릿키 통해 env를 지정할 수 있다.

101. Configuring ConfigMaps in Application

  • 컨피그 맵은 중앙에서 키 값 쌍의 데이터를 한번에 관리하기 위해 사용된다.
  • 파드 정의 파일의 env 필드에 컨피그맵을 삽입하여 컨피그맵의 키 값 쌍이 환경 변수로 사용될 수 있게 한다.

컨피그맵 구성 방법

  1. Create ConfigMap
  2. Inject into Pod

컨피그맵 만드는 방법 2가지

1. 명령적인 방법

$ kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-literal=APP_MODE=prod
$ kubectl create configmap app-config --from-file=app_config.properties (Another way)

--from-literal

  • 명령어를 사용할 때 키 값 데이터를 명시하기 위해 '--from-literal' 옵션을 사용할 수 있다.
  • 여러 개의 키 값을 명시하기 위해서는 '--from-literal' 옵션을 여러번 사용해야 한다. -> 복잡하다.
  • '--from-file' 옵션을 사용하여 파을을 통해 필요한 키 값 데이터를 한번에 전달할 수도 있다.

2. 선언적인 방법

Create a config map definition file and run the 'kubectl create` command to deploy it.
$ kubectl create -f config-map.yaml
  • configmap 정의 파일을 작성하고 kubectl create -f 명령어를 실행 configmap 정의 파일을 통해 다음과 같이 configmap을 생성할 수 있다.
  • 다양한 목적을 위해 같은 방식으로 필요한만큼 configmap을 생성할 수 있다. 그렇기 때문에 configmap에 이름을 적절히 붙이는 것이 중요하다.
  • 컨피그맵을 통해 환경 변수를 전달하기 위해서는 파드 정의 파일의 'envFrom' 필드에 컨피그맵 이름을 명시하면 된다.

  • 파드 정의 파일에서 configmap을 사용하는 경우는 다음 세 가지이다. env, single env, volume으로 사용될 수 있다.

ConfigMap 보기

configMaps를 보려면

$ kubectl get configmaps (or)
$ kubectl get cm

102. Practice Test: Environment Variables

Practice Test: https://uklabs.kodekloud.com/topic/practice-test-env-variables-2/


103. Solution - Environment Variables


104. Configure Secrets in Applications

ConfigMap의 한계

  • ConfigMap은 일반 텍스트 형식으로 구성 데이터를 저장하기 때문에 암호를 저장하기에는 부적절하다. (DB 정보 등)
    -> 암호를 저장하기 위해 Secret이 사용된다.

Sercret

  • Secret은 비밀번호 등 민감한 정보를 저장하는 데 사용된다. 인코딩된 형식으로 저장된다는 점만 빼면 ConfigMap과 비슷하다.

Sercret 만드는 2가지 방법

Secret 역시 두 가지 방법으로 만들 수 있다.

1. 명령적인 방법

$ kubectl create secret generic app-secret --from-literal=DB_Host=mysql --from-literal=DB_User=root --from-literal=DB_Password=paswrd
$ kubectl create secret generic app-secret --from-file=app_secret.properties
  • '--from-literal'옵션을 통해 키 값 쌍을 지정
  • 비밀값이 많으면 '--from-file' 옵션을 이용해 파일로 키 값 쌍을 한번에 지정

2. 선언적 방법

  • 시크릿 정의 파일을 먼저 작성하고 kubectl apply -f 명령어를 통해 시크릿을 생성
  • 주의할 점은 데이터를 인코딩된 포맷으로 저장해야 한다는 것이다.

인코딩하는 법

Generate a hash value of the password and pass it to secret-data.yaml definition value as a value to DB_Password variable.
$ echo -n "mysql" | base64
$ echo -n "root" | base64
$ echo -n "paswrd"| base64

Secret 보기

암호해독

$ echo -n "bX1zcWw=" | base64 --decode
$ echo -n "cm9vdA==" | base64 --decode
$ echo -n "cGFzd3Jk" | base64 --decode

인코딩된 값을 해독하기 위해서 '--decode' 옵션을 사용하면 된다.

팟으로 시크릿 구성

apiVersion: v1
kind: Secret
metadata:
 name: app-secret
data:
  DB_Host: bX1zcWw=
  DB_User: cm9vdA==
  DB_Password: cGFzd3Jk
apiVersion: v1
 kind: Pod
 metadata:
   name: simple-webapp-color
 spec:
  containers:
  - name: simple-webapp-color
    image: simple-webapp-color
    ports:
    - containerPort: 8080
    envFrom:
    - secretRef:
        name: app-secret
  • 파드의 env로 시크릿을 사용할 수 있다. 파드 정의 파일에 환경 변수를 삽입하려면 envFrom이라는 필드를 사용하면 된다.

주입 다른 방법

  • 단일 환경 변수로 넣을 수 있고 볼륨으로 넣을 수도 있다.
  • 파드의 볼륨으로 시크릿을 사용할 경우, 시크릿의 각각의 특성은 파일로 생성된다.

시크릿 어디있나?

  • 파일에는 암호 값이 담겨 있다. 이 경우에는 3개의 암호가 3개의 파일에 담겨 있다.

주의

  • 우선, Secret은 암호화되어 있지 않다. 그래서 누구든 Secret 정의 파일을 볼 수 있고 Secret 개체를 얻을 수 있다. 그리고 기밀 데이터를 볼 수 있다.
  • 따라서 주의해야 하며 RBAC(Role Based Access Control, 역할 기반 접근 제어)나 제 3자의 암호 공급자를 고려하는 것이 좋다.

댓글