ㄴ Kubernetes

8월 18일 (이미지 커밋, 배포, 쿠버네티스 설치)

깜자왕 2022. 8. 18. 17:38
반응형

이미지 커밋

- 이미 만들어진 이미지로 컨테이너를 생성해 원하는 구성으로 바꾸고, 이것을 다시 이미지로 바꾸는 것

 

-> 이미지 생성

-> 이미지 생성 확인

 

 

이 이미지로 두 번째 컨테이너를 만들어본다

-> first, second 이미지 확인

 

 

이미지 배포

우리가 배운 가상머신 배포는 템플릿으로 만들고, ova 또는 ovf 파일로 배포를 한다

컨테이너는 이미지를 외부로 배포해야한다.

- 이미지 추출 (save, load 명령어)

- 또는 export, import 명령어

이미지는 docker repository라는 이미지 저장소에 저장되고, 이는 도커 런타임에서 접근이 가능하다.

 

이미지 배포는 Docker Hub에 배포할 수 있고, Private Repository에 배포할 수도 있다.

 

1. 도커허브

 

 

이 허브 저장소에 이미지 올리기

-> 우선 이미지 커밋을 한다 (도커허브에 생성했던 이름과 똑같아야 한다 (my-image-name))

 

 

-> 이미지에 tag 명령어로 이름 추가 (h970630)

 

 

-> 도커 로그인

 

 

-> push 명령어로 업로드

 

 

-> 업로드 확인 가능

 

 

-> 도커허브에서 실제로 내 이미지를 찾을 수 있다

-> 배포 용이하다

 

 

-> pull 명령어로 다운받을 수 있다!

 

 

2. 사설 레지스트리

-> 이 부분은 시간 관계상 넘어가기로...

 

 

도커파일

지금 이미지를 배포하기까지의 명령어들을 묶은 파일

- 이미지 자체를 배포하는 방법에 비해 크기가 작은 장점이 있음

- 시간 관계상 실습 생략..


개별 리눅스 호스트에서 컨테이너를 동작시켰을 때

만약 리눅스 호스트가 다운되거나 여러가지 관리를 하기 위한 방안?

-> 쿠버네티스

 

가상머신에서 클러스터를 VM Controller (vCenter Server)에서 관리했듯이,

리눅스 내의 컨테이너들의 부하분산 같은 관리를 하기 위한 Controller가 있어야 한다.

 

이 중앙집중관리 서버는 도커에서는 2가지를 만들었다

1. Docker Swam

- 컨테이너를 클러스터로 구성

2. Docker Compose

- Swam에 의해 만들어진 클러스터를 Yaml 형식으로 컨테이너를 정의한다

 

=> 하지만 이 두 가지는 잘 안 씀

 

중앙집중관리 서버는 쿠버네티스 서비스를 사용함

- 구글에서 만듦 -> 오픈소스화 시킴(무료)

- 다양한 종류의 버전이 존재함

- 가용성, 성능, 확장성 관리

- K8S 라고도 함

쿠버네티스 구성요소

하이퍼바이저 처럼 리눅스 위에 컨테이너 엔진이 구성되어 있어야 함

이 위에 K8S Controller를 구성함

1. K8S Node

2. K8S Master Node (kubelet (K8S Agent)이 설치되어 있어야 함)

3. K8S Worker Node (Master Node끼리 통신하기 위한 Node)

 

K8S Cluster - K8S Master Node 의 집합

 


쿠버네티스 설치

 

-> 메모리 스왑 해제 (성능 저하 이슈때문)

-> 구글 클라우드 퍼블릭 키 다운로드

-> 쿠버네티스 저장소 추가

 

 

지금 도커는 설치된 상태이다. containerd 설정파일은 기본적으로 컨테이너 런타임 인터페이스가 비활성화 되어 있으므로 이를 containerd 기본 설정값으로 덮어씌운 뒤 containerd를 재시작한다.

-> 컨테이너 런타임 인터페이스는 쿠버네티스가 컨테이너를 제어할 때 사용하는 일종의 프로토콜이다.

-> 간단히 생각해서는 "컨테이너를 생성한다" 등을 인터페이스로서 정의한 표준화된 규격을 컨테이너 런타임 인터페이스라고 생각하면 된다.

-> Containerd 구성 초기화 (K8S를 containerd에 바로 연결)

 

 

-> systemctl daemon-reload 임 ! 오타조심

-> apt 업데이트 후 쿠버네이스 설치

 

 

-> 마스터 노드로 사용할 호스트에서 클러스터를 초기화한다

-> K8S Master Node 구성하기

-> ip addr는 현재 설치 노드의 ip

 

-> 쿠버네티스 설치 완료

 

 

-> 마스터 노드에서 실행

 

 

-> 네트워크 애드온 설치

-> 쿠버네티스의 컨테이너 간 통신을 위해 calico를 기준으로 설치

 

=> 마스터 노드 구성 완료.

 

 

이제 워커노드를 구성하자

-> 도커 설치

 

그리고 쿠버네티스 설치까지는 위와 동일하다.

-> 뒤에 sha 코드까지 다 쳐야함...

-> kubeadm join ~~~

 

 

-> 마스터노드에서 연결 및 구성 완료 확인

 

 

Docker image 생성

- Docker commit

- Docker File

K8S

- 서비스 설계

- Pod => 1개 or 2개 이상의 컨테이너 그룹

- Replica Set => Pod 들의 그룹 => 일정 개수의 Pod을 유지시킴 => 하나의 Pod이 죽게 되면 K8S Repository에서 이미지를 불러와 복원시킨다.

- Deployment => Replica Set을 묶는 그룹 

- 이 Deployment를 묶어서 namespace를 정의한다. 이 namespace는 이 자체로 하나의 서비스라고 할 수 있다. 이 안에 모든 애플리케이션이 들어있기 때문

- 이 Pod부터 Deployment 까지를 K8S Object라고 한다. 이 Object는 Yaml을 통해 서비스 제공

 

-> kubectl --help 로 각종 명령어 확인 가능

 

 

-> 쿠버네티스의 object들을 볼 수 있다

-> kubectl api-resources

 

 

-> kubectl get namespace

-> namespace 정보 확인

 

-> kubectl get pod -n kube-system

-> Pod의 정보들 확인

-> 1/1의 분모 = 컨테이너 갯수, 분자 = 실제 동작중인 컨테이너

 

 

-> namespace에 들어있는 Pod의 IP 확인

-> kubectl get pod -o wide -n [namespace]

 

 

-> namespace에 들어있는 ReplicaSet 확인

-> kubectl get rs -o wide -n [namespace]

 

-> namespace에 들어있는 deployment 확인

-> kubectl get deploy -o wide -n [namespace]

 

-> namespace에 들어있는 서비스 확인

-> kubectl get service -o wide -n [namespace]