2024.03.08(금)
응용 시스템 개발 및 구성을 위한 아키텍처 스타일의 하나
이에 비교하여 전통적인 방식의 아키텍처를 모놀리식(monolithic) 아키텍처라고 부르기도 함
애플리케이션이 서비스 모음으로 개발되어 각 마이크로서비스는 특정한 기능을 수용하고 개별 작업을 처리, 이 서비스들이 서로 연결되어 전체 응용을 구성
컨테이너 모델은 마이크로서비스를 구현하기에 적합
Container ⊂ Pod ⊂ Worker node
포드의 부하 균등화를 수행 - 몇 개의 응용을 복제할 것인지 알려주면 나머지는 k8s가 처리
응용의 복제본이 둘 이상 있다면 k8s가 트래픽 부하 균등화를 수행하여 클러스터 내부에 적절히 분배
인스턴스 수를 동적으로 확장하거나 감축하여 동적 요구사항에 대응하면서 시스템 자원을 효율적으로 활용
포드와 노드를 지속적으로 모니터링하고 장애가 발생하면 새 포드를 실행하여 지정된 복제본의 수를 유지
지연 시간을 적용하고 순차적으로 업데이트 배포함으로써 문제가 발생하더라도 서비스를 정상 유지 가능
원하는 응용에 다양한 스토리지 시스템(Amazon EBS, Google GCE Persistent Disk 등)을 마운트 가능
태생적으로 수명이 짧은 포드의 동적 성질을 관리하기 위해 자체 DNS 기반으로 서비스를 동적 바인딩할 수 있는 기능 제공
kubectl get nodes
명령어로 확인kubectl get
kubectl get nodes
kubectl get pods
-o wide
option으로 자세히 보기Deployment
동작 방식
디플로이먼트의 상태를 선언하면 k8s가 동적으로 의도된 상태(desired state)가 되도록 레플리카셋을 관리
kubectl create deployment <deploy-name> --image=<image>
kubectl expose
kubectl delete <object-type> <object-name>
# deployment.yaml
apiVersion: apps/v1
kind: Deployment # 디플로이먼트를 만들 것을 지시
metadata:
name: dpy-nginx # 디플로이먼트 이름은 dpy-nginx
labels:
apps: nginx
spec:
replicas: 3 # 세 개의 포드로 구성된 레플리카셋을 생성
selector:
matchLabels:
app: nginx
# 포드 템플릿
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
# service.yaml
apiVersion: v1
kind: Service # 서비스를 만들 것을 지시
metadata:
name: nginx-svc # 서비스 이름은 nginx-svc
spec:
type: NodePort
selector:
app: nginx # 이 셀렉터에 의해 발견되는 오브젝트에 대해
# 80/TCP (http) 포트를 노드의 30000번 포트로 노출 → localhost:30000으로 접속 가능
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
kubectl apply -f <manifest-file>
kubectl create -f
를 사용할 수도 있으나 apply를 더 널리 이용docker build -t hostname:latest .
docker tag hostname:latest <docker_hub-id>/hostname:latest
docker push <docker_hub-id>/hostname:latest
deployment.yaml
에 지정된 대로 포드를 생성해서 컨테이너 실행kubectl apply -f deployment.yaml
service.yaml
로 포트 노출kubectl apply -f service.yaml
$ curl localhost:30000
<p>Hostname: dpy-hname-747d7bbcd8-sq9j7</p><p>IPv4 Address: 10.1.0.12</p>
check.sh
)i=1
while true
do
sleep 1
echo $((i++)) `curl --silent --connect-timeout 0.1 localhost:30000`
done
check.ps1
)$i=0
while($true)
{
% { $i++; write-host -NoNewline "$i $_" }
(Invoke-RestMethod "http://localhost:30000")-replace '\n', " "
Start-Sleep -Seconds 1
}
deployment.yaml
에서 replicas: 1로 수정한 후 스케일 다운kubectl apply -f deployment.yaml
[kubectl exec -it <pod-name> -- /bin/bash](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#exec)
# ps ax | grep flask
# kill -9 [PID]
⇒ pod를 삭제하면 pod를 재생성 (새로운 이름 & IP 주소가 할당됨), pod 내의 컨테이너에 문제가 생기면 컨테이너 재시작(동일한 IP 주소 유지): pod마다 고유한 IP 주소가 할당되고 수명 동안 유지되기 때문
pod를 삭제하면 pod를 재생성 (새로운 이름 & IP 주소가 할당됨)
pod 내의 컨테이너에 문제가 생기면 컨테이너 재시작(동일한 IP 주소 유지)
⇒ pod마다 고유한 IP 주소가 할당되고 수명 동안 유지되기 때문
rollout.yaml
은 기존 deployment.yaml
파일에서 image의 버전을 지정하도록 수정 2-04.tgzkubectl apply -f rollout.yaml
& kubectl apply -f service.yaml
(기존 service는 모두 삭제)rollout.yaml
의 이미지 버전을 1.17.0으로 수정하고 다시 apply--record
option 적용 시 이력 기록kubectl rollout status
deployment : 롤아웃 상태 조회kubectl rollout history
deployment : 롤아웃 이력 조회kubectl delete deployment dpy-nginx
kubectl apply -f rollout.yaml
& kubectl apply -f service.yaml
$ curl -I --silent localhost:30000 | grep Server
Server: nginx/**1.16.0**
kubectl set image
deployment dpy-nginx nginx=nginx:1.17.0
→ apply를 하지 않아도 변경 사항이 바로 적용됨kubectl annotate
deployment dpy-nginx kubernetes.io/change-cause="update nginx image from 1.16.0 to 1.17.0"
--overwrite
flag 사용kubectl rollout history deployment dpy-nginx
deployment.apps/dpy-nginx
REVISION CHANGE-CAUSE
1 <none>
2 update nginx image from 1.16.0 to 1.17.0
$ curl -I --silent localhost:30000 | grep Server
Server: nginx/**1.17.0**
kubectl rollout undo deployment dpy-nginx
로 직전 버전으로 roll backkubectl rollout undo
deployment <deployment> --to-revision=<revision-num>
으로 특정 리비전으로 복구 가능type
을 명시적으로 지정하지 않았을 때의 기본값--kubelet-insecure-tls
추가 containers:
- args:
- --cert-dir=/tmp
- --kubelet-insecure-tls
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.k8s.io/metrics-server/metrics-server:v0.7.0
kubectl apply -f metrics.yaml
로 설치 (배포)kubectl apply -f php-apache.yaml
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
kubectl run -it load-gen --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
http://php-apache
: k8s에서 서비스 디스커버리 기능이 있어서 서비스 이름으로 요청을 보낼 수 있음k8s는 클러스터 내에서 이용할 수 있는 저장장치(storage)의 추상화된 객체로 볼륨을 정의
PV(PersistentVolume)
PVC(PersistentVolumeClaim)
PV, PVC, Deployment, Service 생성 & volume 연동 확인 (2-05/pv
폴더)
⚠️ Docker Desktop의 Kubernetes를 사용 중이라면 내부적으로 Linux 컨테이너를 사용하기 때문에 윈도우 경로가 호환되지 않음
pv-volume.yaml
파일에서 hostPath의 path 입력 시/run/desktop/mnt/host/<your-path>
와 같이 수정
- 연동 확인을 위해 해당 path에 미리 파일 만들어두기 (index.html)
<p>Hello from k8s Storage!</p>
- 변경 전 (pod 생성 시 CreateContainerError 발생: Error response from daemon: invalid mode: /var/lib/mysql)
hostPath: path: "D:/PROGRAMMERS/수업/CI-CD/K8S/2-05/2-05/data"
- 변경 후
hostPath: path: "**/run/desktop/mnt/host/**d/PROGRAMMERS/수업/CI-CD/K8S/2-05/2-05/data"