Jenkins_설치

쿠버네티스란?

kubernetes

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 자동 Deploy, 스케일링 등을 제공하는 관리시스템으로, 오픈 소스 기반이다.

1.2.코드로 쉽게 구성하는 쿠버네티스 랩 환경

install

Vagrant 를 이용해서 설치 명령어 코드로 이미 설치된 버츄얼박스에 4개의 Cent OS 가상 서버를 설치 하고 동시에 쿠버네티스에 필요한 노드를 설치 하게 된다.

Vagrant 이용하기 위한 설치 명령어 코드 디렉토리에 가자

cd C:\HashiCorp\_Lecture_k8s_starter.kit-main\ch1\1.2\k8s-min-5GiB

Vagrant 실행하면 준비된 코드 명령어로 버츄얼 박스에 가상 서버가 설치 하게 된다.

vagrant up

설치된 가상 서버 (마스터 노드) 콘솔에 가서 쿠버네티스 구성된 노드들을 확인 해보자

kubectl get nodes

쿠버네티스에 어플리케이션 배포하기 (Pod 배포 하기)

이번에 Kubernetes 에 Nginx 를 배포 할 것이다.

설치된 가상 서버 (마스터 노드) 터미널로 가서 nginx 를 배포 해보자

여기서 Pod 란?

컨터이더(어플리케이션)의 집합이고 일반적으로 단일 컨터이너로 구성한다.

그럼 Pod 의 집합은 deployment 이다. 뒤에서 설명 한것이다.

1
2
3
4
5
6
7
8
9

$ kubectl run nginx --image=nginx // nginx 배포하기

kubectl get pod // 설치 상태 확인

$ kubectl get pod -o wide // 배포한 ip 확인

$ curl {설치된 IP} // 설치한 ip로 curl 명령어 보내기

설치된 파드(Pod) 를 외부에서도 접속 가능하게 해보자

우선 해당 로컬 PC 터미널에 curl {설치된 IP} 명령어를 입력해보자

그럼 접속이 안될것이다. 해당 PC에 가상화된 서버에 설치했을것이고 설치된 쿠버네티스 클러스트 지역에 있기 때문이다.

SVN 을 이용해서 외부에 접속해도 각각의 노드를 접속 할수 있도록 해보자

// 오픈할려고 하는 Tpye인 NodePort 입력하고 실제로 그 Pod가 내부에 있는 컨테이너를 통신하기 위한 Port 번호 지정

kubectl expose pod nginx --type=NodePort --port=80

// 노출된 것을 확인

kubectl get service

해당 명령어를 통해 밖으로 노출된 포트를 알아보자

그리고 노드로 접속해서 각각의 Pod 로 접속 하기 때문에 노드 정보를 알아보자 (INTERNAL-IP 를 확인 하자)

kubectl get nodes -o wide

웹브라우저에서

{마스터 노브 ip}:{밖으로 노출된 포트}

ex> http://192.168.1.10:31230

접속하면 설치된 nginx 메인 페이지가 보인다.

파드(Pod) 와 deployment 차이

지금까지 nginx 를 설치 및 배포를 해보았지만 워커 노드 한개만 설치 되었을 뿐이다.

이걸 전부 각각 워커 노드에게 nginx 설치 하는 방법을 알아보자

즉 deployment 는 여러 pod 를 관리 한다고 보면 되겠다.

kubectl create deployment deploy-nginx --image=nginx

kubectl get pods

kubectl get pods -o wide

curl {설치된 IP 주소}

create 명령어를 통해 ‘deploy-nginx’ 이라는 이름으로 deployment 를 만들자

여러개를 배포 할려면

kubectl scale deployment deploy-nginx --replicas=3

kubectl get pods

이렇게 하면 기존에 pod 가 한개 생성한것 비해 replica 를 3으로 늘려 pod 를 3개 생성 할 것이다.

deployment 를 노드포트로 노출하기

kubectl expose deployment deploy-nginx --type=NodePort --port=80

kubectl get services

kubectl get nodes -0 wide

외부로 노출하는 더 좋은 방법인 로드밸런서(LoadBalancer)

직접적으로 각 node 의 IP 로 곧바로 접속하는것은 좋은 방법이 아니다.

이걸 중간에 로드밸런서를 둬가지고 관리하는것이 좋다.

여기서 로드밸런서는 MetalLB 로 해볼려고 한다.

// 쿠버네티스에서 파일로 즉 코드로 이용해서 설치 할때는 ‘apply’ 명령어를 쓴다.
kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// https://hub.docker.com/repository/docker/sysnet4admin/chk-hn 해당 도커허브 링크 통해 이미지를 가져와서 'chk-hn' 이라는 이름으로 deployment 를 만든다
kubectl create deployment chk-hn --image=sysnet4admin/chk-hn

kubectl scale deployment chk-hn --replicas=3
kubectl get pods


kubectl expose deployment chk-hn --type=LoadBalancer --port=80

kubectl get services

// 적혀진 EXTERNAL-IP 웹브라우저에 접속 해보자
// 그럼 해당 Pod 이름이 보일것이다. 실제로 그런것인지 해당 명령어를 입력해 보자

kubectl get pods -o wide

// NAME 목록을 보면 웹브라우저 통해 확인한 이름이 보일 것 이다.

배포한 것들 삭제하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
kubectl get service // 이 명령어를 통해 service 된 것을 확인
kubectl delete service chk-hn // 'chk-hn' 을 삭제해보자

kubectl get service // 다시 확인해보면 'chk-hn' 된것을 확인 할수 있다.

kubectl delete service nginx

kubectl delete deployment chk-hn
kubectl delete deployment deploy-nginx

kubectl delete pod nginx

kubectl delete -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml

쿠버네티스는 어떻게 구성되어 있을까?

지금까지 쿠버네티스 통해 nginx, chk-hn 을 설치 해보았는데.

이것은 쿠버네티스 default 라는 네임스페이스에 설치 되어 있는 것들이다.

실질적으로 쿠버네티스를 구성하는 곳은 kube-system 이라는 네임스페이에 저장 되어 있다.

해당 구역에 있는 쿠버네티스 구성 요소들을 확인 하기 위해서는

kubectl get pods -n kube-system

통해 확인 해보자

kube-system

API 서버, 컨트롤러 매니저, 스케쥴러 등 있다.

쿠버네티스 파드에 문제가 생겼다면?

우리는 여기서 Pod(파드) 를 실수로 지웠을때 가정하에 설정한다.

  1. 파드만 배포된 경우
  2. 디플로이먼트 형태로 배포된 경우

1 번 경우는 곤란한 일이 생기지만 2번 경우는 여러 파드를 감싸고 있는것이 디플로이먼트 형태라

파드가 삭제하면 파드를 다시 만들면 된다.

실습 통해 알아보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1 // del-deploy.yaml, del-pod.yaml 두개 파일이 실행된다.

kubectl get pods // 설치된것을 확인 해보자

kubectl delete pod del-pod // 파드를 삭제해보자

kubectl get pods // 삭제 된것을 확인 해보자

kubectl delete pod {파드 이름} // 이번에 디플로이먼트로 구성된 pod 를 삭제 해보자

kubectl get pods // 삭제 되었는지 확인 해보았지만 삭제 되고 다시 생성 된것을 확인 할 수 있다. 왜 다시 생성 되었냐면 디플로이먼트는 3개를 유지해야 된다는 것이기 때문에 삭제 후 다시 생성 된것 이다.

kubectl delete deployment del-deploy // 디플로이 먼트를 삭제 할려면 해당 명령어로 입력 해야 한다.

쿠버네티스 워커 노드의 구성 요소에 문제가 생겼다면

워커 노드의 kubelet 을 중단 해보면 어떻게 될까?

마스터 노드가 아닌 워커 노드 중 하나 서버 터미널로 접속해서

1
2
systemctl stop kubelet // kubelet 중단
systemctl status kubelet // kubelet 상태 확인

그 다음 마스터 노드의 서버 터미널로 접속해서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
kubectl apply -f ~/_Lecture_k8s_starter.kit/ch4/4.1/del-deploy.yaml

kubectl get pods -o wide

// 확인 해보면 중단한 워커 노드에게만 Pending 상태인걸 확인 할 수 있다.

// 다시 해당 워커 노드에 가서

systemctl start kubelet // 다시 살리자

// 다시 마스터 노드에 가서

kubectl get pods -o wide -w // 다시 생성 된것을 볼 수 있다.

이번에 워커 노드의 ‘컨테이너 런타임 (Docker)’ 중단 해보자

마스터 노드가 아닌 워커 노드 중 하나 서버 터미널로 접속해서

1
2
systemctl stop docker // docker 중단
systemctl status docker // docker 상태 확인

다시 마스터 노드에 가서 설치된 디플로이먼트를 replica 를 6개로 늘리자

1
2
3
kubectl scale deployment del-deploy --replicas=6
kubectl get pods -o wide

확인 해보면 해당 워커 노드에게만 배포 하지 않고 다른 워커 노드만 배포하고 있다.

이번에 추가 배포를 통해 스케줄러 역활 확인을 해보자

scheduler-test

워커 노드 설치된것을 보면 균형이 깨진것을 볼 수 있다.

해당 워커 노드 터미널로 가서

1
systemctl start docker // docker 실행 

다시 마스터 노드에 가서 설치된 디플로이먼트를 replica 를 9개로 늘리자

1
2
3
kubectl scale deployment del-deploy --replicas=9
kubectl get pods -o wide

쿠버네티스 오브젝트란?

쿠버네티스 오브젝트는 각각 상태를 갖고 있다.

‘추구하는 상태’, ‘현재 상태’

여기서 오브젝트는 원하는 상태가 기술 하는 것이다.

각 Pod 마다 상태값이 있다.

감시하고 이를 통해 차이를 발견하고 차이가 있다면 상태를 변경 해서

실제 오브젝트가 선언된 상태 이라고 한다.

그럼 오브젝트가 추구하는 상태 기술해 둔 것은 무엇일까?

1
2
3
4
5
6
kubectl get pods // 현재 배포된 pod 확인 해보자

kubectl edit deployment del-deploy // 상태값 확인

// 여기서 spec.replicas 값을 3으로 변경하고 저장해보자

그럼 replicas 값을 3으로 변경했으니 pods 는 그에 맞게 삭제 되거나 추가 하게 된다.

볼륨 실습

1
2
3
4
5
6
7
8
9
10
11
kubectl get pods
kubectl delete deployment del-deploy // 우선 삭제하자


~/_Lecture_k8s_starter.kit/ch5/5.2/nfs-exporter.sh log
cat /etc/exports

kubectl apply -f ~/_Lecture_k8s_starter.kit/ch5/5.2/dpy-chk-log.yaml
kubectl get pods -o wide

kubectl exec {Pod Name} -it -- /bin/bash

Copyright 201- syh8088. 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.

💰

×

Help us with donation