본문 바로가기

카테고리 없음

Docker 개발관리 활용 - Kubernete

개발 배경

• Container는 stateless, immutable, mortal (상태를 가지고 있지 않고, 변화하지 않으며, 언제든 죽을 수 있는)개념을 기반으로 아키텍처를 구성하다 보면 운영에 앞서 반드시 필요한 것이 Container Orchestration(=Kubernetes)이다

• Container Orchestration은 다수의 Container를 다수의 호스트(클러스터)에 적절하게 분산 실행하고, 원하는 상태(desired state)로 실행상태를 유지해 주고, 다운타임 없이 유동적으로 스케일을 확장/축소할 수 있게 도와준다

• 사용자가 Container에 대한 동작과 다른 Container와의 관계를 정의하면 배포/운영/스케일링에 문제가 없도록 자동으로 관리되는 운영 시스템이라고 할 수 있겠다.

 

오케스트레이션 프레임워크의 종류

출처 : www.mantech.co.kr

 

특징

Automatic binpacking

• 가용성을 희생하지 않는 범위안에서 물리적 리소스를 충분히 활용해서 Pod을 (자동) 배치한다

• binpacking이란 컨테이너가 호스트의 물리적 리소스를 충분히 활용할 수 있도록 효율적으로 고르게 배치해서 불필요한 물리적 리소스의 낭비를 줄이는 것을 의미한다. (Pack in a Camping Bin)

Self-healing

• Container의 실행 실패, Node(K8s에서 Pod을 실행하는 Slave Host)가 죽거나 반응이 없는 경우, health check에 실패한 경우에 해당 Container를 자동으로 복구한다

• Kubernetes가 관리하는 가장 작은 배포단위인 Pod은 언젠가는 반드시 죽는(mortal) 것으로 정의되어 있으며 Container, Node의 장애 상황발생 시에도 운영자가 기대하는 상태로 서비스가 무사히 실행될 수 있도록 Self-healing을 지원한다.

Horizontal scaling

• Pod의 CPU 사용량 혹은 app이 제공하는 metric을 기반으로 ReplicaSet (동일한 Pod을 몇 개 띄울지 정의) 을 scaling할 수 있다.

Service discovery and load balancing

• 익숙하지 않는 Service Discovery 매커니즘을 위해 Application을 수정할 필요가 없다 • K8s는 내부적으로 Pod에 고유 IP, 단일 DNS를 제공하고 이를 이용해 load balancing 한다

Automated rollouts and rollbacks

• application, configuration의 변경이 있을 경우 전체 인스턴스의 중단이 아닌 점진적으로 Container에 적용(rolling update) 가능하다

• Release revision이 관리되고 새로운 버전의 배포시점에 문제가 발생할 경우 자동으로 이전의 상태로 Rollback을 진행할 수 있다

Secret and configuration management

• Secret key, Configuration을 관리하기 위해 Secret, ConfigMaps Object가 제공되기 때문에 이미지의 변경없이 키/설정을 업데이트할 수 있고, 이를 외부에 노출(expose)하지 않고 관리/사용할 수 있다

• Secret은 데이터를 binary 형태로, ConfigMap은 text 형태로 저장한다.

Storage orchestration

• local storage를 비롯해서 Public Cloud(GCP, AWS), Network storage등을 구미에 맞게 자동 mount할 수 있다

 

설치 방식

All-in-One 방식

• Master와 Node가 동일한 Host에서 실행

• 기본적인 작동 방식을 이해하는데 도움

• 실제 환경에서는 사용하지 않음

Cluster 방식

• 1개의 Master와 2개 이상의 Node로 구성

• 필요할 때마다 Node를 추가해서 용량을 늘려 나감

• 실제 환경에서 주로 사용

Kubernetes 구성 방법

• Kubernetes 설치를 위한 VM 및 Physical Machine 필요

• Cloud 사업자(Google, Azure, AWS)가 제공하는 Kubernetes 사용

 

CentOS에 Kubernetes 설치하기

모델

 

node와 outside포트포워딩

 

master VM은 메모리 2GB로 설정

 

ModaXtrem으로 master에 ssh 연결

 

설치전 기본 설정

br_netfilter Kernel Module 기능 켜기

modprobe br_netfilter

echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

vi /etc/yum.repos.d/kubernetes.repo

Kubernetes Repository 구성하기

 

cd /etc/yum.repos.d (##중요)

wget http://down.cloudshell.kr/k8s/kubernetes.repo

yum repolist -y

여기까지 해주고

docker 설치

 

docker 설치후 systemctl로 실행한다

후에 kubernetes 패키지 설치

 

systemctl start kubelet

systemctl enable kubelet

 


(Mater)

kubeadm init

초기화 후 설정 안내

Master의 경우 아래와 같이 설정해준다

 

docker node ls

kubectl get namespaes

kubectl get pods --all namespaces

  • cluster 상태가 Not Ready이고 coredns 상태가 Pending이다. 이렇게 되면 각 Node들에서 실행중인 Pod들간에 통신이 안된다

  • Pod Network를 생성하여 이 문제를 해결할 수 있다

  • POD network는 node간에 통신을 하게 하는 overlay network이다

kubectl get pods -n kube-system

kube-system에 pod들이 실행중이다

 

Pod Network 구성하기

export kubever=$(kubectl version | base64 | tr -d '\n')

weave-net 설치 : kubectl apply -f "cloud.weave.works/k8s/net?k8s-version=$kubever"

Kubernetes cluster의 master 초기화 및 구성이 완료되었다

 

Nginx Pod을 Kubernetes cluster에 배포하기(Master에서 작업)

kubernetes 환경에서 실행중인 Pod은 한 개 이상의 container로 구성되어 있으며, 그 Pod에 있는 docker container들은 storage와 Network을 공유한다

 

kubectl create deployment mynginx --image=nginx

kubectl get deployments -o wide

kubectl get nodes

mynginx라는 deployment 생성하기

kubectl create service nodeport mynginx --tcp=80:80

외부에서 nodePort로 사용하여 서비스 중인 deployment에 접속하도록 service 노출하기

kubectl describe deployment mynginx

생성된 mynginx deployment의 세부 내용 확인하기

kubectl get service

 

접속할 IP와 Port 번호 확인하기

kubectl get pods -o wide

container가 실행중인 node 확인

kubectl get svc -o wide

node port 번호 확인

 

namespace 단위로 cluster의 구성 내용 확인하기

kubectl -n kube-system get cm

-> kube-system이라는 namespace의 configmaps 확인하기

kubectl -n kube-system get cm kubeadm-config -o yaml

 

configmaps들의 각각의 상세한 내용을 꼭 확인해볼 것

  kubectl get cm -n kube-system coredns -o yaml

  kubectl get cm -n kube-system weave-net -o yaml

  kubectl get cm -n kube-system kube-proxy -o yaml

 

 

kubectl 구문 • kubectl [command] [TYPE] [NAME] [flags] -o • command: run, create, apply, get, describe, delete • TYPE: pods, nodes, deployments, services, replicasets, configmaps 등등 • NAME: resource 이름(대/소문자 구분하므로 정확하게 입력해야 한다) • kubectl get pod example-pod1 example-pod2 • kubectl get pod/example-pod1 rc/example-rc1 • flags (=options) • 위치에 구애 받지 않는다 • kubectl -n kube-system get pod (=kubectl get pod -n kube-system) • -i, -t, -n, --all, --server, -f, --image, --replicas, --port • -o • -o wide/yaml/json • kubectl get 구문의 제일 마지막에만 사용한다 • 현 상태를 표시하는 형식이기 때문이다