Container의 강점(Docker 관점)

  • 도커 호스트의 커널(프로세스, 하드웨어 관리)을 공유하기 때문에 가볍고 빠르다
    (하드웨어가 차지하는 용량이 적다)
  • Application 운영 시 VM보다 가볍다
  • Application 배포가 빠르다
  • 지속적인 개발, 통합 및 배포가 가능하다
  • 개발, 테스트, 운영 전반에 걸쳐 일관성 있는 환경을 제공한다
  • Resource를 충분하게 활용할 수 있다

 

Container의 약점(Docker 관점)

  • 개발자 입장
    - Application code 작성 > Build > Ship > Run
    - 도커는 container 단위로 관리
    따라서 Container가 많으면 docker 명령어로 일일이 관리하기가 어렵다
  • 운영자 입장
    - Container가 갑자기 죽으면?
    - Container 운영 중 업그레이드는? Rollback은 어떻게?
    - 서비스의 이상 및 부하의 모니터링은 어떻게?

 

>>>> K8S - Container Orchestrarion<<<<

출처 https://ko.m.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Kubernetes_logo_without_workmark.svg

= Container 환경을 효과적으로 관리(생성, 수정, 삭제)하기 위한 도구

 

특징

  1. Clustering : 여러 node 중앙 관리
  2. 상태(State) 관리 : 설정한 Pod 개수 보장, Pod의 livenessProbe(컨테이너가 동작 중인지 여부를 나타낸다. 만약 활성 프로브에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는 재시작 정책의 대상이 된다.)
  3. 부하 조정(Scheduling)으로 배포 관리 : Pod 배포 시 부하 정도가 가장 적절한 node 선정하여 배포
  4. 배포  버전 관리 : Rolling Update (Deployment로 새로운 버전의 App을 이전 버전을 유지한 채 업데이트 진행) + Roll Back (문제 발생 시 이전 버전으로)
  5. Service Discovery
    (Pod 집합에서 실행중인 Application을 네트워크 서비스로 노출하여 Cluster 외부에 있는 User가 Application을 이용하도록 네트워크 경로를 제공하는 것)
    (K8S는 Pod에게 고유한 IP주소 부여, Pod 집합에 대한 단일 DNS명을 부여. 이들간의 로드-밸런싱 수행)
  6. Volume Storage
    (각 node 별 다양한 storage 제공)
    (Volume : Pod에 종속되는 디스크. 해당 Pod에 속해 있는 여러 개의 Container가 공유해서 사용)

 

Kubernetes는 서비스 관리를 개별적이 아닌 집단적으로 관리한다

따라서 대부분의 상황에서 개별 시스템(node)와 상호작용할 필요는 없다

→ 비교적 Stateless(관계의 상태를 유지하지 않는 것) 업무에 적합하다 (stateless 예시 : UDP 프로토콜)

 

 

개발 배경

  • Container는 stateless, immutable, mortal (상태를 가지고 있지 않고, 변화하지 않으며, 언제든 죽을 수 있는)개념을 기반으로 아키텍처를 구성하다 보면 운영에 앞서 반드시 필요한 것이 Container Orchestration(=Kubernetes)이
  • Container Orchestration은 다수의 Container를 다수의 node(Cluster)에 적절하게 분산 실행하고, 원하는 상태(Desired State)로 실행상태를 유지해 주고, 다운타임 없이 유동적으로 스케일을 확장/축소(Scale)할 수 있게 도와준다
  • 사용자가 Container에 대한 동작과 다른 Container와의 관계를 정의하면 배포/운영/스케일링에 문제가 없도록 자동으로 관리되는 운영 시스템이라고 할 수 있다

 

Kubernetes 종류

  • 관리형 Kubernetes
    : Amazon EKS, Azure AKS, Google GKE
  • 설치형 Kubernetes
    : RANCHER, RedHat OPENSHIFT
  • 직접 구성형 Kubernetes
    : Kubeadm, Kubespray, Kops, Krib

 

Kubernetes 설치

설치 구성도

(아래 내용은 master, node1, node2, node3 모두에게 적용)

실행 환경 : centos7-x86_64



1. /etc/hosts 파일 수정

/etc/hosts

각 PC의 IP 작성 후 scp 로 node1,2,3에 복사
- scp /etc/hosts node1:/etc/hosts

 


2. SWAP 기능 끄기
- swapoff -a
- vi /etc/fstab 
(마지막 부분인 swap 부분 주석처리)
- reboot

 


3. br_netfilter Kernel Module 기능 켜기
- modprobe br_netfilter
- echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
- vi /etc/sysctl.conf
(net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1 작성)
- reboot

 


4. 방화벽과 selinux disable 처리
- systemctl disable firewalld
- vi /etc/sysconfig/selinux (## centos7 이전 버전 시)
(SELINUX=disabled 수정)

 


5. Kubernetes Repository 파일 다운로드

  • repository : kubelet, kubectl, kubeadm

(원래는 repo 파일을 직접 구성해야 한다. 편의상 있는 자료를 다운받겠다)
- cd /etc/yum.repos.d
- wget http://down.cloudshell.kr/k8s/kubernetes.repo

/etc/yum.repo.d/kubernetes.repo

- yum repolist -y (## kubernetes 설치 확인)

 


6. docker 설치 및 시작 
- curl -sSL http://get.docker.com | bash
- systemctl start docker && systemctl enable docker
- docker info | grep -i cgroup
(이 명령어 입력 시 Cgroup Driver : cgroupfs라고 나타난다.
Kubernetes는 docker의 cgroup을 systemd를 사용하기 때문에 
이를 systemd로 변경해주어야 한다)

 


7. docker cgroup driver를 systemd로 변경
- vi /usr/lib/systemd/system/docker.service
(ExecStart=/usr/bin/dockerd 바로 뒤에 --exec-opt native.cgroupdriver=systemd를 삽입)
- systemctl daemon-reload (## 모든unit filereload)
- systemctl restart docker 
- docker info | grep -i cgroup (## systemd로 변경됨)

 


8. 특정한 이전 버전(1.21.1)의 K8S 설치

※ kubernetes repository 
1. kubeadm - 쿠버네티스 클러스터 구성, 클러스터 가입, 삭제시 사용(init, reset, join..)
2. kubelet - 쿠버네티스 서비스(서버). 클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
3. kubectl - kubectl은 쿠버네티스 클러스터 관리자를 제어한다.
container 생성 순서

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


- yum install -y kubelet-1.21.1-0 kubeadm-1.21.1-0 kubectl-1.21.1-0
- systemctl daemon-reload
- systemctl enable kubelet --now

 


9. K8S Clustering 구성(Master에서만 작업)
#특정한 이전 버전(1.21.1)의 K8S Clustering 구성
- kubeadm init --kubernetes-version=v1.21.1
이때, 설치 결과를 복사하여 다른 곳에 꼭 저장해놓는다.
----------------------------------------------------------------------------

설치 결과
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

(master에서 클러스터 구성 시 필요)

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.2.15:6443 --token h1a03j.qe1qctd831cfijxa \
        --discovery-token-ca-cert-hash sha256:538ab8cea29bab9814f850a87450008bf8ee7efcf3706e562bbc6ce5bb08cf74

(나중에 node1,2,3에서 join 할 때 필요)
----------------------------------------------------------------------------
그리고 

  mkdir -p $HOME/.kube
  cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  chown $(id -u):$(id -g) $HOME/.kube/config

이 부분을 순차적으로 입력해준다.

 

10. Kubernetes 버전 정보 확인 - Master에서
- kubectl version --short
- kubeadm version -o yaml
- kubelet --version 

레파지토리 버전 정보


Namespace 확인
- kubectl get namespaces

- kubectl get namespace

- kubectl get ns 

 


11. Cluster 구성정보(ConfigMap) 확인하기 - Master에서
- kubectl get configmap -n kube-system
- kubectl get cm kubeadm-config -n kube-system
- kubectl get cm kubeadm-config -n kube-system -o yaml
- kubeadm config view

 


12. Clustering 상태 및 Pod 상태 확인하기 - Master에서
- kubectl get node (## master가 NotReady 상태)
- kubectl get pod --all-namespaces (## 모든 pod 확인)
- kubectl get pod -A (## 모든 pod 확인)


-->> cluster 상태가 Not Ready이고 coredns 상태가 Pending이다.

이 상태에선 각 Node들에서 실행중인 Pod들간에 통신이 안된다
-->>Pod Network를 생성하여 이 문제를 해결할 수 있다

 


13. Pod Network 구성하기 - Master에서만 작업 (weave-net 설치)
- export kubever=$(kubectl version | base64 | tr -d '\n')
- kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

- kubectl get pod -A (## coredns가 이제는 running)
30초 정도 기다린 후 
- kubectl get pods -A

weave - net - xxxxx 이라는 Pod 이 master 에 설치됨

- kubectl get nodes (## master가 Ready 상태가 됨)

 


(node1,2,3에서)
kubeadm join 10.0.2.15:6443 --token h1a03j.qe1qctd831cfijxa \
        --discovery-token-ca-cert-hash sha256:538ab8cea29bab9814f850a87450008bf8ee7efcf3706e562bbc6ce5bb08cf74
입력 후

(master)
- kubectl get nodes (## master 말고 node1,2,3도 Ready 상태가 됐음을 알 수 있다)

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - yaml  (0) 2022.07.21
Kubernetes - Deployment & Service  (0) 2022.07.20
Docker Image Layer  (0) 2022.07.18
라우터 이해하기3  (0) 2022.07.06
라우터 이해하기2  (0) 2022.07.05

+ Recent posts