Scaling & StatefulSet(aws)
Amazon EC2(Elastic Computing Cloud)
- Amazon Web Service에서 컴퓨터 용량을 제공하는 서비스
- EC2는 Managed Service(관리 주체가 Public Cloud 사업자가 제공하는 서비스 - 백업과 업데이트를 사업자가 수행)가 아님
- 서버 및 네트워크 운영은 AWS가 담당하지만 운영체제를 포함한 필요한 소프트웨어는 사용자가 직접 설치하고 운영
- 장점
- 클릭 한 번으로 쉽게 생성
- 다양한 하드웨어와 운영체제 조합이 가능
- 생성과 삭제가 자유로움
- 스케일 업 다운이 편리
- 적합하지 않은 경우
- 단순히 서버 1대로 구성하고 변화가 거의 없는 경우
SaaS: 애플리케이션
PaaS: 개발환경 빌려줌
Iaas(H/W, OS, Network, Disk): 인프라 빌려줌
Managed Service: 업데이트나 백업을 Public Cloud에서 수행, SaaS
Managed Service가 아님: 관리 주체가 사용자, IaaS
주요 구성
- Instance: AWS에 존재하는 가상 서버
- AMI: 운영체제 이미지
- Key Pair: 외부에서 인스턴스에 접속할 때 인증을 위해 사용하는 키 인증서는 보관을 잘 해두는 것이 중요
- EBS: 스토리지
- 보안 그룹: 가상의 방화벽
- Inbound: 인스턴스 외부에서 인스턴스 내부로 요청
- Outbound: 인스턴스 내부에서 외부로 요청
사용 절차
- 기본 리전 설정
- region: 지리적으로 떨어진 독립적인 위치를 의미
- AZ(Availability Zone: 가용 영역): region 내에서 물리적으로 격리된 공간
- 인스턴스 시작을 누르고 인스턴스 옵션을 설정
- 이름
- 운영체제
- 하드웨어
- 키페어: 외부에서 접속할 때 사용할 키와 관련된 파일
- 보안 그룹: 일정의 방화벽으로 기존의 내용을 선택할 수 있고 새로 만들 수도 있는데 기본적으로 외부에서 SSH로 접속할 수 있도록 SSH 만 개방되어 있음
- 저장장치: 기본적으로 8G가 제공되는데 30G까지는 프리티어 계정에서 무료
- 인스턴스를 생성하면 Public IP 와 Private IP 그리고 Public IP 와 매핑되는 도메인 한 개가 제공
- 인스턴스에 접속
- AWS에 로그인해서 접속
- 외부에서 SSH를 이용해서 접속
ssh -i pem파일경로 ubuntu@IP 또는 DNS
웹 서버로 사용
- 외부에서 80 번 포트로 접속
sudo apt-get update
sudo apt install apache2 -y
sudo service apache2 start # 아파치 시작
# 확인
ps aux | grep apache2
systemctl status apache2
- 다른 컴퓨터에서 EC2 공인 IP를 브라우저에 입력
- apache2 웹 페이지가 보이면 보안 그룹에서 http를 인바운드에서 처리할 수 있도록 설정을 한 것
- 이 경우 외부에서 접속이 안되면 보안 그룹에서 80번 포트를 외부에서 접속할 수 있도록 허용을 해야 함
- 보안 그룹 편집
- 인스턴스 상세보기 화면에서 하단의 [보안] 탭을 클릭
- 보안 그룹의 ID를 클릭하면 편집 화면으로 들어가서 편집
MySQL을 설치해서 외부에서 접속이 가능하도록 설정
- 패키지 정보 업데이트
sudo apt update
- MySQL 설치: 패키지 이름 - mysql-server
sudo apt install -y mysql-server
- 설치 확인
mysql --version
- MYSQL에 접속: 초기 비밀번호는 없거나 계정 이름
sudo mysql -u root -p
- 관리자 비밀번호를 수정
use mysql
alter user 'root'@'localhost' identified with mysql_native_password by '비밀번호'
flush privileges;
- 계정 생성
- 데이터베이스 생성:
create database 데이터베이스 이름
- 유저 생성:
create user 유저이름@'%' identified by '비밀번호'
- 권한 부여:
grant all privileges on 데이터베이스이름.* to '유저이름'@'%';
flush privileges
- %에는 IP를 설정할 수 있는데 IP를 설정하면 설정한 곳에서만 접속이 가능함
- 특정 애플리케이션에서만 DB에 접속하는 경우 설정하는데 최근에는 VPC를 이용해서 해결
- 데이터베이스 생성:
mysql> create database itstudy;
Query OK, 1 row affected (0.02 sec)
mysql> create user dh@'%' identified by '0000';
Query OK, 0 rows affected (0.04 sec)
mysql> grant all privileges on itstudy.* to 'dh'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
- MySQL은 외부 접속을 기본적으로 차단
- 이 설정은 /etc/mysql/mysql.conf.d/mysqld.cnf 파일에 되어 있음
mysqld.cnf
bind-address = 0.0.0.0
sudo service mysql restart
로 설정 적용- dbeaver에서 edit connection클릭 후 EC2의 public IP, mysql user, pw 입력 후 driver properties 탭의 allowPublicKeyRetrieval 속성을 true로 설정
EC2를 이용한 쿠버네티스 클러스터 구성
1. EC2 인스턴스 생성
- 외부에서 접속을 했을 때는 일정 시간 동안 입력이 없으면 자동으로 세션이 해제
- Master Node
- CPU가 2개 이상: Core가 1개이면 설치는 성공을 하지만 마스터 노드로 실행하려고 할 때 에러가 발생
- 포트 개방
- API Server: 6443
- etcd Server: 2379, 2380
- kubelet API: 10250
- kube scheduler: 10251
- kube controller manager: 10252
- Flannel CNI 플러그인에 대한 포트: 8285, 8472
- Worker Node
- 하드웨어 제약 없음
- 포트 개방
- API Server: 6443
- kube-proxy가 서비스를 로드밸런싱하기 위해서 사용하는 포트: 26443
- Flannel CNI 플러그인에 대한 포트: 8285, 8472
- NodePort 로 사용할 포트: 30000-32767
2. Ubuntu에 쿠버네티스 설치: https://hostnextra.com/learn/tutorials/how-to-install-kubernetes-k8s-on-ubuntu
# 패키지 정보 업데이트
sudo apt update && sudo apt upgrade -y
# 런타임 설치:
sudo apt install -y docker.io
# 런타임 확인:
sudo docker --version
# Docker version 24.0.7, build 24.0.7-0ubuntu4.1
# 쿠버네티스 저장소 등록
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 쿠버네티스 클러스터 구성을 위한 패키지 설치
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
# 패키지의 용도
kubeadm: 클러스터 구성을 위한 패키지
kubelet: 노드 에이전트(Pod 생성, 실행, 모니터링)
kubectl: 명령 수행 도구(CLI)
# 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
# Memory Swap 비활성화: 가상 메모리 사용으로 인한 문제점 제거
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 확인: sudo free -m 과 sudo swapon -s
# 마스터 노드에서 클러스터 생성
# kubeadm을 초기화하고 파드의 네트워크 대역을 설정
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 아래 내용이 출력되는데 이 내용이 워커노드에서 마스터 노드에 연결하기 위한 코드
kubeadm join 172.31.10.135:6443 --token qtaw4i.n7eif2q1bnif1h28 \
--discovery-token-ca-cert-hash sha256:018ed69a6a7c85b864dfceedc2ecfbfa586017e49b705788724caaf7bfe28785
# (Optional) Configure kubectl for a Non-Root User
sudo -i
mkdir -p /home/<your-username>/.kube
cp -i /etc/kubernetes/admin.conf /home/<your-username>/.kube/config
chown <your-username>:<your-username> /home/<your-username>/.kube/config
exit
# 쿠버네티스 환경 설정 파일 생성
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 노드 확인
kubectl get nodes
# 방화벽 중지
sudo systemctl stop ufw
sudo systemctl disable ufw
- Cloud 서비스는 기본적으로 포트에 대한 보안을 별도로 설정하도록 되어 있기 때문에 보안 그룹에 가서 인바운드 규칙에 추가를 해주어야 함
# 토큰 확인
kubeadm token list
# 토큰 생성
kubeadm token create
# 해시값 확인
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt
# 포트번호 확인
kubectl cluster-info
3. 워커 노드에서 마스터 노드에 연결
kubeadm join 172.31.10.135:6443 --token qtaw4i.n7eif2q1bnif1h28 \
--discovery-token-ca-cert-hash sha256:018ed69a6a7c85b864dfceedc2ecfbfa586017e49b705788724caaf7bfe28785
스케일링
- 성능을 높이거나 낮추는 작업
- Scale Up
- 하드웨어의 성능을 높이는 것
- 초기 단계의 서비스나 하드웨어 업그레이드 전략으로 충분히 성능 향상이 가능한 경우에 적합한 전략
- 확장의 한계에 도달했을 때 추가적인 성능 향상이 어렵기 때문에 장기적으로 사용하는 서비스에는 부적합
- 쿠버네티스의 매니페스트에서 resource의 제한을 가할 수 있는데 이 부분을 수정하면 scale up과 유사한 효과를 나타낼 수 있음
- Scale Out
- 컴퓨터의 대수를 늘리는 전략
- 서비스 성장에 따라 서버를 추가로 확장할 수 있음
- 하나의 서버에 문제가 발생하더라도 다른 서버가 역할을 대신 수행해줌
- 서버의 수가 증가하게 되면 네트워크가 복잡해지고 관리 비용이 증가
- 쿠버네티스에서는 replica를 조정해서 동일한 서비스를 하는 pod의 개수를 늘리는 것
replicaset
- pod를 여러 개 만들 수 있는 객체
- pod 보다는 상위의 개념인데 deployment 보다는 하위의 개념, 최근에는 replicaset을 잘 사용하지 않음
- replicaset 이나 deployment로 만들어진 pod는 삭제되거나 중지되면 바로 다른 pod가 만들어짐
scale 명령
- pod가 구동중에 동적으로 replica를 변경해야 할 때 사용
- 재배포를 하게 되면 무효가 됨
kubectl scale --replicas=파드개수 유형/이름
- 실습
- ch06으로 이동
# 파일 경로 대신에 디렉토리 경로를 사용하게 되면 디렉토리 안의 모든 yaml 파일을 수행 kubectl apply -f pi/web/
- 파드의 개수(kubectl get pod)를 확인: 2개
- 파드의 개수를 3개로 증가시키기
kubectl scale --replicas=3 deploy/pi-web
- 파드의 개수(kubectl get pods)를 확인: 3개
- 다시 배포
kubectl apply -f pi/web/
- 파드의 개수를 확인: 2개로 복귀
DaemonSet
- replicas를 설정하지 않더라도 모든 워커 노드에 파드를 생성해주는 객체
- 모니터링 용도
garbage collection
- 쿠버네티스는 가비지 컬렉션이 있어서 주기적으로 감시를 하다가 자신의 상위 객체가 존재하지 않으면 자동으로 제거가 됨
파드 강제 삭제
kubectl delete pods 파드이름 --grace-period=0 --force
멀티 컨테이너 파드
- 하나의 파드에 여러 개의 컨테이너를 실행
- 이런 패턴을 사이드카 패턴이라고 함
- 애플리케이션 컨테이너와 애플리케이션 컨테이너가 필요로 하는 다른 컨테이너를 같이 배치
- 대표적인 경우가 wordpress 같은 애플리케이션은 반드시 mysql이나 mariadb가 있어야 하는데 이 경우 서로 다른 파드로 구성해도 되고 하나의 파드에 다른 컨테이너로 묶어도 됨
파드와 컨테이너 통신
- 파드는 하나의 가상 환경
- 파드는 하나의 리눅스 시스템이 존재하고 그 안에 네트워크 그리고 파일 시스템을 제공하는 하나의 파드에 속한 컨테이너들은 이를 공유
- 하나의 파드에 속한 모든 컨테이너는 동일한 IP를 가지게 됨
- 하나의 파드에 속한 모든 컨테이너는 동일한 IP를 가지기 때문에 통신을 할 때 localhost를 사용할 수 있음
- 하나의 파드에 속한 컨테이너들은 내부 볼륨(hostPath)을 공유할 수 있음
- 하나의 메모리 공간을 공유하는 컨테이너(ch07/sleep)
# 파드 생성
kubectl apply -f sleep-with-file-reader.yaml
# 볼륨에 파일 기록: HOSTNAME이라는 환경 변수에 저장된 내용을 data-rw/hostname.txt 파일에 기록
kubectl exec deploy/sleep -c sleep -- sh -c 'echo ${HOSTNAME} > data-rw/hostname.txt'
# 자신이 저장한 파일 읽기
kubectl exec deploy/sleep -c sleep -- cat data-rw/hostname.txt
# 파드 내에 컨테이너 간의 통신
# 파드 생성
kubectl apply -f sleep-with-server.yaml
# sleep 이라는 컨테이너에서 server라는 컨테이너의 8080 포트에 요청을 전송
kubectl exec deploy/sleep -c sleep -- wget -q -O - localhost:8080
# 확인: server 컨테이너의 로그 확인
kubectl logs -l app=sleep -c server
초기화 컨테이너
- 사이드카 패턴의 컨테이너들은 컨테이너가 만들어지는 순서가 없음
순차적으로 실행되어야 하는 컨테이너들을 사이트카 패턴으로 만들게 되면 필요한 컨테이너가 구동되지 않았음에도 컨테이너가 생성되서 오류를 발생시킬 수 있음 - 이런 경우에는 초기화 컨테이너를 이용해서 먼저 생성되어야 하는 컨테이너를 초기화 컨테이너로 설정하고 이 컨테이너가 정상적으로 생성된 경우에 다음 컨테이너를 생성하도록 해줄 수 있음
- 초기화 컨테이너는 여러 개 설정할 수 있고 작성한 순서대로 동작
- 리눅스 명령어의
;
는 사이드카,&&
는 초기화 컨테이너와 유사 - 초기화 컨테이너 설정
- 일반 컨테이너는 spec 안에 containers 라는 속성으로 설정하는데 초기화 컨테이너는 initContainers 라는 속성으로 설정하며 배열 형태이며 순차적으로 생성
- 예제
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
labels:
kiamol: ch07
spec:
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
initContainers: #여기에 기재된 컨테이너를 먼저 생성
#여기에 설정하는 컨테이너들은 순차적으로 생성됨
- name: init-html
image: kiamol/ch03-sleep
command: ['sh', '-c', "echo '<!DOCTYPE html><html><body><h1>KIAMOL Ch07</h1></body></html>' > >
volumeMounts:
- name: data
mountPath: /data
containers:
- name: sleep
image: kiamol/ch03-sleep
- name: server
image: kiamol/ch03-sleep
command: ['sh', '-c', 'while true; do echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\nConte>
ports:
- containerPort: 8080
name: http
volumeMounts:
- name: data
mountPath: /data-ro
readOnly: true
volumes:
- name: data
emptyDir: {}
어댑터 컨테이너
- 애플리케이션이 어떤 내용을 스스로의 파일에 기록을 하게 되면 외부에서는 이 내용을 확인할 수 없음
- hostPath 와 같은 노드 컴퓨터의 특정 디렉토리와 볼륨 마운트를 하면 가능은 함
- 애플리케이션이 로그를 출력하면 그 출력한 로그를 읽어서 표준 출력으로 다시 연결하는 방식을 이용해서 로그를 외부로 출력할 수 있음
- 이렇게 자신의 어떤 로직을 수행하는 것이 아니고 다른 컨테이너가 수행한 작업의 내역을 가지고 다른 컨테이너에게 전송을 하거나 외부에 출력해주는 역할을 수행하는 컨테이너를 어댑터 컨테이너라고 함
- 헬스 체크나 성능 지표를 측정하는 애플리케이션을 이러한 방식으로 배포하는 경우가 있는데 최근에는 이를 위한 프로메테우스 나 ELK Stack 잘 만들어져 있어서 어댑터 컨테이너 형태보다는 별도의 애플리케이션을 주로 이용
데이터를 많이 다루는 애플리케이션
Stateful Set
- stateful: 상태를 저장하는 것
- stateless: 상태를 저장하지 않는 것
- http나 https는 stateless
- web에서 이전 상태를 확인하기 위해서는 별도의 기술이 필요
- web에서는 이전 상태를 server에 저장해 둘 수 있고 client에 저장하기도 함
- server에 저장하는 것이 session이고 session을 저장하는 기술로는 메모리에 저장하는 것 그리고 파일이나 데이터베이스에 저장하는 것이 있음
- 메모리에 저장하는 경우 많은 클라이언트가 접속하는 경우 서버의 처리가 느려지기 때문에 속도가 빠른 In Memory Database를 사용하는 경우가 많음
- 클라이언트에 저장하는 기술로는 Cookie, Local Storage, Web SQL 등이 있음
- pod는 기본적으로 stateless
- stateful 형태의 파드를 만드는 방법은 kind를 StatefulSet으로 설정하고 serviceName을 설정해야 함
- 파드를 stateless 형태(ReplicaSet, Deployment)로 replica를 3이라고 하면 3개의 파드를 동시에 생성할려고 함
이 경우는 데이터를 저장할 필요가 없기 때문에 병렬로 생성해도 아무런 문제가 되지 않음
데이터베이스를 이런식으로 배포하게 되면 3개의 데이터베이스의 불일치가 발생할 수 있음
이름도 랜덤하게 만들어짐 - 파드를 stateful 형태(StatefulSet)로 replica를 3이라고 하면 3개의 파드를 동시에 생성하는 것이 아니고 하나의 파드를 만들고 이 파드를 만드는 데 성공하면 이 내용을 복사해서 다음 파드를 생성
이렇게 만들면 파드의 이름도 순차적으로 부여 - 데이터베이스를 배포할 때 이 방식을 취하게 됨
- 첫번째 파드는 읽고 쓰기가 가능하도록 하고 두번째 부터는 읽기만 가능하고 첫번째 파드의 데이터를 동기화하는 역할만 수행
- StatefulSet 사용
- 파일 구성
- ch08/todo-list/db/todo-db-secret.yaml: 환경 설정 파일로 데이터베이스 비밀번호로 사용할 값을 가지고 있음
apiVersion: v1
kind: Secret
metadata:
name: todo-db-secret
labels:
kiamol: ch08
type: Opaque
stringData:
POSTGRES_PASSWORD: "kiamol-2*2*"
- ch08/todo-list/db/todo-db-service.yaml: 서비스 설정 파일로 데이터베이스 포트를 외부에서 사용할 수 있도록 개방하는 내용
apiVersion: v1
kind: Service
metadata:
name: todo-db
labels:
kiamol: ch08
spec:
ports:
- port: 5432
targetPort: 5432
name: postgres
selector:
app: todo-db
clusterIP: None
- ch08/todo-list/db/todo-db-service.yaml: Stateful 한 Pod 생성
apiVersion: apps/v1
kind: StatefulSet # StatefulSet을 생성: Pod가 순차적으로 생성
metadata:
name: todo-db
labels:
kiamol: ch08
spec:
selector:
matchLabels:
app: todo-db
serviceName: todo-db
replicas: 2
template:
metadata:
labels:
app: todo-db
spec:
containers:
- name: db
image: postgres:11.6-alpine
env:
- name: POSTGRES_PASSWORD_FILE
value: /secrets/postgres_password
volumeMounts:
- name: secret
mountPath: "/secrets"
volumes:
- name: secret
secret:
secretName: todo-db-secret
defaultMode: 0400
items:
- key: POSTGRES_PASSWORD
path: postgres_password
- 파드 생성(ch08 디렉토리에서 실행)
kubectl apply -f todo-list/db/
- 파드 확인
kubectl get pods -o wide
- 파드의 이름이 -0, -1 이렇게 순차적으로 만들어 짐
- 하나의 파드가 만들어지고 다음 파드가 만들어짐
- 파드를 삭제하면 새로운 파드가 만들어질 때 이전 파드 이름으로 만들어짐
- 웹의 forwarding과 유사(redirect는 이전값 기억x)
- deploy로 배포하면 pod을 삭제하면 pod이 다시 생성되면서 이름이 달라짐
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-web-cfcbc4f49-fqlrr 1/1 Running 0 12m 10.244.1.7 ip-172-31-33-74 <none> <none> <- 이 pod 삭제
pi-web-cfcbc4f49-mhh27 1/1 Running 0 12m 10.244.2.6 ip-172-31-38-88 <none> <none>
todo-db-0 1/1 Running 0 8m1s 10.244.2.7 ip-172-31-38-88 <none> <none>
todo-db-1 1/1 Running 0 7m52s 10.244.1.8 ip-172-31-33-74 <none> <none>
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl delete pods pi-web-cfcbc4f49-fqlrr --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "pi-web-cfcbc4f49-fqlrr" force deleted
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-web-cfcbc4f49-mhh27 1/1 Running 0 15m
pi-web-cfcbc4f49-swkq6 1/1 Running 0 3s <- pod 이름이 달라짐
todo-db-0 1/1 Running 0 10m
todo-db-1 1/1 Running 0 10m
- StatefulSet으로 배포한 pods 삭제 시 똑같은 이름의 pod이 다시 생성
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-web-cfcbc4f49-mhh27 1/1 Running 0 15m 10.244.2.6 ip-172-31-38-88 <none> <none>
pi-web-cfcbc4f49-swkq6 1/1 Running 0 17s 10.244.1.9 ip-172-31-33-74 <none> <none>
todo-db-0 1/1 Running 0 10m 10.244.2.7 ip-172-31-38-88 <none> <none>
todo-db-1 1/1 Running 0 10m 10.244.1.8 ip-172-31-33-74 <none> <none>
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl delete pods todo-db-0 --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "todo-db-0" force deleted
ubuntu@ip-172-31-10-135:~/kiamol/ch08$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pi-web-cfcbc4f49-mhh27 1/1 Running 0 18m 10.244.2.6 ip-172-31-38-88 <none> <none>
pi-web-cfcbc4f49-swkq6 1/1 Running 0 3m36s 10.244.1.9 ip-172-31-33-74 <none> <none>
todo-db-0 1/1 Running 0 2s 10.244.2.8 ip-172-31-38-88 <none> <none>
todo-db-1 1/1 Running 0 13m 10.244.1.8 ip-172-31-33-74 <none> <none>
초기화 컨테이너 사용 가능
- 특정 스크립트 파일을 만들고 변수의 값을 0으로 초기화를 하고 값이 0일 때 특정 작업을 수행하고 1을 증가시키게 되면 이 스크립트는 첫번째 컨테이너가 만들어질 때 와 다른 컨테이너가 만들어질 때 다른 작업을 수행하도록 할 수 있음
- 데이터 동기화
- 애플리케이션이 구동될 때 데이터를 복제, 작업 시간 별 로깅
- 애플리케이션에 작업이 수행 할 때 양쪽에 작업 수행, 작업 시간을 같이 기록
Job과 CronJob의 활용
- 데이터를 활용하는 애플리케이션의 데이터의 백업은 중요한 작업인데 이를 수동으로 하게되면 실수를 할 수 있음, 이러한 작업은 자동으로 수행되도록 해주는 것이 좋음
- 이렇게 특정 작업을 일정한 주기를 가지고 작업을 할 수 있도록 해주는 것이 CronJob 임
- Job은 한 번 수행하면 그대로 종료됨
- Job은 배치 작업에 사용함
- 모아서 한번에 많은 내용을 수행하고자 할 때 사용
- CronJob은 주기를 정해서 주기 단위로 작업을 계속 수행하기 위해서 생성
todo
EC2 2개에 mysql 설치, 외부에서 접속해보기
db 복사
파이썬으로 실행해보기
크론잡 만들어보기