애플리케이션 수명 주기 관리에 대해 포스팅 하겠다.

1. Rolling Updates and Rollbacks

Rolling updates는 소프트웨어 또는 시스템 업데이트를 진행할 때 사용되는 전략 중 하나이다.

Rollbacks는 이전 상태로 되돌리는 것을 말한다.

Rolling Updates를 사용하는 이유는 구 버전을 업데이트 할 때 한번에 모든 응용프로그램을 중지하고 새로운 버전을 실행시키게 되면 그 사이에 서비스가 중지되는 사태가 벌어지게 된다. 
그래서 하나씩 구버전을 다운시키며 새로운 버전을 업데이트 하는것이다.

아래는 관련된 명령어를 정리하였다. 

kubectl create -f deployment-definitio.yaml : deployment-definition.yaml 파일에 정의된 내용을 기반으로 쿠버네티스 클러스터에 새로운 배포를 생성합니다. kubectl get deployments: 현재 클러스터 내의 모든 배포 목록을 가져옵니다. kubectl apply -f deployment-definition.yaml: deployment-definition.yaml 파일에 정의된 내용을 기반으로 쿠버네티스 클러스터에 배포를 생성하거나 업데이트합니다. kubectl set image deployment/myapp-deployment nginx=nginx:1.9.1: myapp-deployment 배포의 nginx 컨테이너 이미지를 nginx:1.9.1 버전으로 변경합니다. kubectl rollout status deployment/myapp-deployment: myapp-deployment 배포의 롤아웃 상태를 확인합니다. 배포가 완료될 때까지 기다립니다. kubectl rollout history deployment/myapp-deployment: myapp-deployment 배포의 롤아웃 히스토리를 표시합니다. 이전 배포들에 대한 정보를 제공합니다. kubectl rollout undo deployment/myapp-deployment: myapp-deployment 배포의 이전 상태로 롤백합니다. 이전 배포로 롤백하여 애플리케이션을 이전 상태로 되돌립니다.

2. application commands & arguments

Dockerfile

FROM python:3.6-alpine RUN pip install flask COPY . /opt/ EXPOSE 8080 WORKDIR /opt ENTRYPOINT ["python", "app.py"] CMD ["--color", "red"]

kubernetes 명령

apiVersion: v1 kind: Pod metadata:  name: webapp-green   # 파드의 이름을 지정합니다.  labels:      name: webapp-green   # 레이블을 지정합니다.spec:  containers:  - name: simple-webapp   # 컨테이너의 이름을 지정합니다.    image: kodekloud/webapp-color   # 사용할 컨테이너 이미지를 지정합니다.    command: ["python", "app.py"]   # 컨테이너가 시작될 때 실행할 명령을 지정합니다.    args: ["--color", "pink"]   # 명령행 인수를 지정하여 배경색을 녹색으로 변경합니다.

 3. 환경변수 설정

pod파일에 정의가 많을 경우 관리하기가 어려워진다.

confgifmap을 활용하면 관리가 수월해진다.

예를 들어, 웹 애플리케이션을 배포하는 경우, 웹 애플리케이션의 구성이 변경되는 경우가 많다. 

이러한 경우에는 ConfigMap을 사용하여 구성 값을 분리하여 관리할 수 있다. 다

음은 ConfigMap을 사용하여 웹 애플리케이션의 설정 값을 분리하는 간단한 예시다. 

1. ConfigMap 생성 

먼저, 웹 애플리케이션의 설정을 ConfigMap으로 정의한다.

apiVersion: v1kind: ConfigMapmetadata:  name: webapp-configdata:  app-color: green  app-port: "8080"

위의 ConfigMap은 웹 애플리케이션의 배경색을 “green”으로, 포트를 “8080”으로 설정한다. 

2. Pod 정의에 ConfigMap 적용 

이제 Pod 정의 파일에 ConfigMap을 적용하여 설정 값을 사용한다.

apiVersion: v1kind: Podmetadata:  name: webapp-podspec:  containers:  - name: webapp-container    image: my-webapp-image    ports:    - containerPort: 8080    env:    - name: APP_COLOR      valueFrom:        configMapKeyRef:          name: webapp-config          key: app-color

위의 Pod 정의 파일에서는 ConfigMap에서 가져온 “app-color” 설정 값을 환경 변수 APP_COLOR로 설정한다. 

이제, 웹 애플리케이션의 배경색을 변경하려면 ConfigMap의 “app-color” 값을 수정하면 된다. 

Pod 정의 파일을 다시 작성할 필요 없이 설정이 자동으로 업데이트되어 적용된다.

4. application 비밀정보 설정 (secret 설정)

secret 만들기

kubectl create secret generic  —from-literal==

이런식으로 만든다. 하지만 데이터를 너무 많이 입력하게 되면 파일을 통해 입력할 수 있다.

kubectl create secret generic —from-file= 

아래와 같은 secret을 yaml파일로 작성해줄 수 있다.

실제로는 인코딩 된 값 첨부

pod 안에 secret 넣기

apiVersion: v1kind: Podmetadata:  name: webapp-podspec:  containers:  - name: webapp-container    image: my-webapp-image    ports:      - containerPort: 8080    envFrom:      - secretRef:          name: app-secret

5. 미사용 비밀 데이터 암호화

예를 들어 

인코딩

echo “supersecret” | base64 —encode

디코딩

echo “c3VwZXJzZWNyZXQ=” | base64 —decode

이런식으로 할 수 있다.

아래 링크를 참고하자.

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/

 [Encrypting Confidential Data at Rest

All of the APIs in Kubernetes that let you write persistent API resource data support at-rest encryption. For example, you can enable at-rest encryption for Secrets. This at-rest encryption is additional to any system-level encryption for the etcd cluster

kubernetes.io](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)

6. Kubernetes 멀티컨테이너 pods

다중 컨테이너 pod 를 만드려면 아래처럼 yaml 파일에 컨테이너를 여러개 넣으면 된다.

apiVersion: v1kind: Podmetadata:  name: multi-container-pod  labels:    name: multi-container-podspec:  containers:  - name: multi-container-pod    image: multi-container-pod    ports:    - containerPort: 80  - name: log-agent    image: log-agent

7. initContainers

initContainers는 Kubernetes 포드 내에서 주어진 애플리케이션 컨테이너가 시작되기 전에 실행되는 컨테이너다.

주로 초기화 작업을 수행하는 데 사용된다.

각 initContainer는 순차적으로 실행되며, 하나가 완료되어야 다음 initContainer가 실행된다.

만약 initContainer 중 하나가 실패하면 POD는 재실행된다.

initContainers를 사용하여 Kubernetes 포드에서 애플리케이션 컨테이너가 시작되기 전에 필요한 초기화 작업을 수행할 수 있다.

예시

apiVersion: v1kind: Podmetadata:  name: myapp-pod  labels:    app: myappspec:  containers:  - name: myapp-container    image: busybox:1.28    command: ['sh', '-c', 'echo The app is running! && sleep 3600']  initContainers:  - name: init-myservice    image: busybox:1.28    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']  - name: init-mydb    image: busybox:1.28    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

참고

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/