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 필드에 컨피그맵을 삽입하여 컨피그맵의 키 값 쌍이 환경 변수로 사용될 수 있게 한다.
컨피그맵 구성 방법
- Create ConfigMap
- 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자의 암호 공급자를 고려하는 것이 좋다.
'DevOps > Kubernates' 카테고리의 다른 글
[CKA] 129-143 (0) | 2023.04.09 |
---|---|
[CKA] 105-115 (0) | 2023.04.07 |
[CKA] 62-75 Node Affinity, Taints and Tolerations, DaemonSets, Static Pod (0) | 2023.04.03 |
[CAK] 36-48 Sevice, Namespace, Kubectl commands (0) | 2023.03.30 |
[CKA] 28-35 Replica Controller, ReplicaSet, Deployment, Labels and Selectors (0) | 2023.03.30 |
댓글