목차
클러스터링
•
여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술
•
컨테이너는 보통 멀티호스트 환경(여러개의 물리머신 또는 여러개의 가상머신)으로 구축
•
가용성, 확장성 장점
오케스트레이션 툴
•
멀티 호스트 환경에서 컨테이너들의 클러스터링을 수행
•
멀티호스트로 구성된 환경을 클러스터 구성으로 가동시키려면 컨테이너의 시작, 정지 / 호스트 간 네트워크 연결, 스토리지 관리 / 컨테이너를 어떤 호스트에서 가동시킬지와 같은 스케줄링 기능 / 컨테이너가 정상적으로 작동하고 있는지 감시하는 기능이 필요
•
Kubernetes, Docker Swarm
Kubernetes
•
여러 개의 호스트를 하나로 묶어 도커를 이용하기 위한 오케스트레이션 툴
•
오케스트레이션 툴을 온프레미스 환경에 도입 시 인프라 환경 구축과 더불어 컨테이너 오케스트레이션 툴, 감시 툴의 사용법이나 운용 및 장애 대응 등 여러 분야에 걸친 기술이 필요하므로 퍼블릭 클라우드가 제공하는 서비스를 이용하는 것을 추천
◦
Amazon EKS, Azure AKS, Google GKE
주요 기능
•
여러 서버들에서의 컨테이너 관리
•
컨테이너 간 네트워크 관리
•
컨테이너 부하분산
•
컨테이너 감시
•
무정지로 업데이트
Kubernetes의 서버 구성
마스터 서버(Kubernetes Master)
•
쿠버네티스 클러스터 안의 컨테이너 조작
•
kubect1 명령을 사용하여 클러스터를 구성 또는 리소스 조작
◦
리소스 조작 시 커맨드로부터 리퀘스트를 받아 처리
•
쿠버네티스 클러스터 안에 있는 노드의 리소스 사용 상황을 확인하고 컨테이너를 시작할 노드를 자동으로 선택
•
etcd에 있는 구성정보를 바탕으로 여러 노드나 컨테이너 관리
•
다중화 검토 필요
API Server
•
리소스 정보를 관리하기 위한 프론트엔드 REST API
•
각 컴포넌트로부터 리소스 정보를 받아 데이터 스토어(etcd)에 저장
•
다른 컴포넌트는 API Server를 통해 etcd의 정보에 액세스
•
프로그래머가 API Server에 액세스하려면 웹의 GUI 툴이나 kubectl 명ㄹ쳥 사용
•
인증 및 인가 기능도 갖고 있음
Scheduler
•
Pod을 어떤 노드에서 작동시킬지 제어
•
노드에 할당되어 있지 않은 Pod에 대해 쿠버네티스 클러스터의 상태를 확인하고 빈 영역을 가진 노드를 찾아 Pod을 실행
Controller Manager
•
쿠버네티스 컬러스터의 상태를 항상 감시하는 백엔드 컴포넌트
•
정의 파일에서 정의한 것과 실제 노드나 컨테이너에서 움직이고 있는 상태 모아서 관리
백엔드 데이터베이스(etcd)
•
클러스터의 구성정보를 관리
•
어떤 pod을 어떻게 배치할 지와 같은 구성정보 및 설정정보가 들어 있음
•
데이터베이스를 마스터 서버 상에 구축하는 경우도 있음
•
다중화 검토 필요
manifest 파일
•
클러스터의 구성 정보를 YAML 및 JSON 형식의 파일로 관리
•
젠킨스와 같은 소프트웨어 버전관리 시스템과 연계 가능
노드
•
도커 컨테이너를 작동시키는 서버
•
클라우드에서는 가상머신의 인스턴스가 노드
kubelete
•
노드에서 작동하는 에이전트
•
pod의 정의 파일에 따라 도커 컨테이너를 실행하거나 스토리지를 마운트
•
노드의 상태를 정기적으로 검사하여 변경 시 API Server에게 통지
애플리케이션 구성 관리(Pod, ReplicaSet, Deployment)
Pod
•
한 개의 노드에 있는 여러 개의 컨테이너를 모아서 pod로 관리
•
반드시 동일한 노드 상에 동시에 전개
•
노드 안에는 여러 개의 pod이 배치
•
애플리케이션의 전개단위가 되어 pod 단위로 컨테이너 작성/시작/정지/삭제와 같은 조작 수행
◦
웹 프론트 서버와 데이터베이스 서버와 같이 역할이 다른 기능을 하나의 pod에 저장하면 안 됨
배포방식
ReplicaSet-Deployment
ReplicaSet
•
클러스터 상에 정해진 수의 pod을 반드시 실행
•
실행중인 pod을 감시하여 정지된 경우 해당 pod을 삭제하고 새로운 pod을 실행
•
리플리카 수 : pod을 실행시킬 개수
•
pod 수를 동적으로 변경하여 오토스케일 구현 가능
Deployment
•
pod과 replicaset을 모은 것
•
replicaset의 이력을 관리
◦
pod 안의 컨테이너 버전업을 하고 싶을 때 시스템을 정지시키지 않고 롤링 업데이트를 할 수 있거나 이력을 바탕으로 이전 세대로 롤백 가능
•
replicaset의 템플릿을 가지고 pod의 구성을 정의하여 해당 템플릿을 따르는 replicaset을 만듬
•
리플리카 수를 유지하는 것이 replicaset, replicaset의 작성이나 갱신을 정의하는 것이 deployment
DaemonSet
•
노드별로 감시 에이전트와 같은 특정 pod을 반드시 배치하고 싶을 때 사용
StatuefulSets
•
스테이트풀 애플리케이션 지원
•
Pod마다 고유의 ID와 상태를 가질 수 있음
◦
웹 서버와 DB 서버가 연결되는 애플리케이션 등에서 사용을 검토하면 좋음
◦
도커는 스테이트리스한 애플리케이션을 효율적으로 실행하는 데 적합한 툴이므로 영구 데이터의 관리에는 적합하지 않음
Job-CronJob
•
웹 서버와 같은 상주 서비스가 아니라 수치 연산 처리와 같이 프로그램의 시작부터 종료까지로 완료되는 프로그램을 pod에서 실행
//cronjob.yaml 파일
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: showdate
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: showdate
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello Docker
restartPolicy: OnFailure
kubectl create -f config/cronjob.yaml
Bash
복사
•
잡을 한번만 실행하는 Jobs도 있음
Replication Controller
쿠버네티스 클러스터 구축
명령어
•
노드 확인(kubectl get nodes)
•
정의파일 지정 및 전개(kubectl create -f [파일])
•
pod 확인(kubectl get pods)
•
pod 정지(kubctl delete pod [Pod Name])
•
pod 모두 정지(kubctl delete -f [deployment 파일])
•
서비스 비공개(kubectl delete -f [서비스 정의 파일])
•
job 삭제(kubectl delete -f [cronjob 정의 파일])
•
서비스 상태 확인(kubctl get services)
•
cronjob 확인(kubectl get cronjob)
•
gronjob 실행 내용(kubectl get jobs —watch)
애플리케이션 설정 정보 관리(kind: ConfigMap, kind: Secrets)
•
설정 정보나 외부 서비스를 이용하기 위한 API 키 등은 환경에 의존하기 때문에 분산 환경에서 작동하는 도커 컨테이너 안에서 관리하는 것이 아니라 다른 방법으로 관리하는 것이 바람직
애플리케이션 프로퍼티 정보(kind: ConfigMap)
•
애플리케이션에서 공통으로 사용하는 프로퍼티 정의
•
설정한 값은 etcd에서 플레인 텍스트로 관리
//config/configmap.yaml 파일
apiVersion: v1
kind: ConfigMap
metadata:
name: projectid
data:
project.id: "hello-docker"
// configmap 정의파일 지정
kubectl create -f config/configmap.ymal
Bash
복사
기밀 데이터(kind: Secret)
•
다른 시스템에서 호출하여 사용하는 API 키나 데이터베이스 연결을 위한 ID 및 비밀번호와 같은 기밀 데이터 관리
•
etcd에서 플레인 텍스트로 관리하기 때문에 base64로 인코딩할 필요가 있음
◦
base64 인코딩은 암호화가 아니기 때문에 Secrets 설정 파일의 관리는 인터넷 상의 공개 리포지토리에 놓지 말고 다른 곳에서 적절히 관리해야 함
hbeen@DESKTOP-EDC39JU:~$ echo -n "test" | base64
dGVzdA==
Bash
복사
//config/secrets.yaml 파일
apiVersion: v1
kind: Secret
metadata:
name: apikey
type: Opaque
data:
id: YXNh
key: YUJjRDEyMw==
// secrets 정의파일 지정
kubectl create -f config/configmap.ymal
Bash
복사
앱 전개(kind: Deployment)
•
pod에 대한 설정
//deployment-blue.yaml 파일
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webserver-blue
spec:
replicas: 3 //pod 수
template:
metadata:
labels: //라벨 설정
type: webserver
color: blue
spec:
containers:
- image: gcr.io/<PROJECT_ID>/imageview:blue //이미지 취득
name: webserver-container
env: //환경변수 정의
- name: PROJECT_ID
valueFrom:
configMapKeyRef:
name: projectid
key: project.id
- name: SECRET_ID
valueFrom:
secretKeyRef:
name: apikey
key: id
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: apikey
key: key
ports: //포트 정의
- containerPort: 80
name: http-server
//deployment-green.yaml 파일
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webserver-green
spec:
replicas: 3 //pod 수
template:
metadata:
labels:
type: webserver
color: green
spec:
containers:
- image: gcr.io/<PROJECT_ID>/imageview:green
name: webserver-container
env:
- name: PROJECT_ID
valueFrom:
configMapKeyRef:
name: projectid
key: project.id
- name: SECRET_ID
valueFrom:
secretKeyRef:
name: apikey
key: id
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: apikey
key: key
ports:
- containerPort: 80
name: http-server
//애플리케이션 정의 파일 지정(전개)
kubctl create -f config/deployment-blue.ymal
kubctl create -f config/deployment-green.ymal
Bash
복사
Label
•
리소스를 식별하기 위한 key-value형으로 된 임의의 문자열
•
Label이 붙은 리소스를 참조하려면 selector로 지정
•
하나의 리소스에 여러 개 설정 가능
•
쿠버네티스 정의 파일인 매니페스트 파일을 참조할 때도 사용
•
논리적인 그룹핑 가능
네트워크 관리(service)
•
Load Balancer : 서비스에 대응하는 IP 주소 + 포트번호에 액세스하여 pod에 대한 레이어 4레벨의 부하분산
•
Cluster IP : 클러스터 안의 pod끼리 통신하기 위한 프라이빗 IP 주소
◦
클러스터 안의 pod에서 cluster IP로 보내는 패킷은 노드 상의 proxy 데몬이 받아 수신 pod으로 전송
•
External IP : 외부 클라이언트가 연결하기 위한 퍼블릭 IP 주소
//service.yaml 파일
apiVersion: v1
kind: Service
metadata:
name: webserver
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
type: webserver
color: blue // blue -> green으로 변경하면 요청 전송처가 변경되므로 앱 버전업 가능(green pod에 문제 발생 시 Blue로 전송처를 되돌릴 수 있음)
//서비스 정의 파일 지정하여 서비스 공개
kubectl create -f config/service.yaml
Bash
복사
Ingress
•
pod에 대한 통신을 제어
•
서비스와 연결되어 통신 내용을 프록시
•
레이어7에서 작동하기 때문에 세세한 네트워크 제어 가능