애플리케이션 수명 주기 관리에 대해 포스팅 하겠다.
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
이런식으로 만든다. 하지만 데이터를 너무 많이 입력하게 되면 파일을 통해 입력할 수 있다.
kubectl create secret generic
아래와 같은 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/