0%

kubernetes pod, replicaset, deploymemt

대시보드 설치

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

1
2
3
4
5
# 음.. 뭔지모르지만 추천하는 데시보더 설정을 적용한다는 의미같음.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

# 음.. 뭔지 모르겠지만 프록시를 처리하는 명령어 같음.
$ kubectl proxy

토큰 생성

1
$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

대시보드 접속

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

쿠버네티스 주요 개념

  • 노드: 컨테이너가 배치되는 서버
  • 네임스페이스: 쿠버네티스 클럿 터 안의 가상 클러스터
  • 파드: 컨테이너의 집합 중 가장 작은 단위, 컨테이너의 실행 방법을 정의
  • 레플리카세트: 같은 스팩을 갖는 파드를 여러개 생성하고 관리하는 역할
  • 디플로이먼트: 레플리카 세트의 리비전을 관리
  • 서비스: 파드의 집합에 접근하기 위한 경로 정의
  • 인그레스: 서비스를 쿠버네티스 클러스터 외부로 노출
  • 컨피그맵: 설정 정보를 정의하고 파드에 전달
  • 퍼시스턴트 볼륨: 파드가 사용할 스토리지의 크기 및 종류 정의
  • 퍼시스턴트볼륨클레임: 포시스턴트 볼륨을 동적으로 확보
  • 스토리지클래스: 퍼시스턴트 볼륨이 확보하는 스토리지의 종류를 정의
  • 스테이트풀세트: 같은 스팩으로 모두 동일한 파드를 여러개 생성하고 관리
  • 잡: 상주 실행을 목적으로 하지 않는 파드를 여러개 생성하고 정상적인 종료를 보장
  • 크론잡: 크론 문법으로 스케줄링되는 잡
  • 시크릿: 인증 정보 같은 기밀 데이터 정의
  • 롤: 네임스페이스 안에서 조작 가능한 쿠버네티스 리소스의 규칙 정의
  • 롤바인딩: 쿠버네티스 리소스 사용자와 롤을 연결
  • 클러스터롤: 클러스터 전체적으로 조작 가능한 쿠버니테스 로스싕 규칙 정의
  • 클러스터롤바인딩: 쿠버니테스 리소스 사용자와 클러스터 롤 연결
  • 서비스 계저이: 파드가 쿠버네티스 리소스를 조작할 때 사용하는 계정

클러스터와 노드

클러스터는 여러 리소스를 관리하기 위한 집합체 입니다.
리소스중 가장 큰 개념은 노드 입니다.
노드는 클러스터 관리대상으로 등록된 도커 호스트로 컨테이너가 배치되는 대상입니다.

기본적으로 전체 클러스터를 관리하는 마스터가 적어도 하나 이상 있어야 하며 마스터와 노드의 구릅으로 구성된다고 볼수있습니다.

1
2
3
4
5
6
7
8
9
Cluster {
Master Node {
kube apiserver
etcd
kube scheduler
kube controller manager
}
Nodes...
}

네임스페이스

클러스터 안에 가상 클러스터를 만들 수 있는데 이를 네임스페이스라고 합니다.
현재 존재하는 네임스페이스 조회

1
2
3
4
5
6
7
8
$ kubectl get namespace
NAME STATUS AGE
default Active 69m
docker Active 68m
kube-node-lease Active 69m
kube-public Active 69m
kube-system Active 69m
kubernetes-dashboard Active 62m

파드 생성 및 배포

파드 생성은 kubectl 로도 가능하지만 버젼관리 관점에서도 yaml 파일로 정의하는것이 좋다.
쿠버네티스의 여러가지 리소스를 정의하는 파일을 매니페스트 파일 이라고 한다.

simple-echo-pod.yaml

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: simple-echo
spec:
containers:
- name: goecho
image: lejewk/goecho:latest
ports:
- containerPort: 80

파드 생성 및 확인

1
2
3
4
5
6
7
8
9
10
11
12
# 생성
$ kubectl apply -f simple-echo-pod.yaml
# 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
simple-echo 1/1 Running 0 4m19s
# 제거
$ kubectl delete pod simple-echo
pod "simple-echo" deleted
# 확인
$ kubectl get pod
No resources found in default namespace.

레플리카세트

파드를 정의한 매니페스트 파일로는 파드 1개밖에 생성할 수 없습니다.
이런 경우 레플리카세트를 통해 동일한 파드를 여러개 관리할 수있습니다.

파드를 정의한 매니페스트까지 포함한 레플리카세트의 매니페스트를 정의할 수 있습니다.

simple-echo-replicaset.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: simple-echo
labels:
app: simple-echo
spec:
replicas: 3
selector:
matchLabels:
app: simple-echo
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: simple-echo
spec:
containers:
- name: goecho
image: lejewk/goecho:latest
ports:
- containerPort: 80

리플리카 생성 및 파드 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 레플리카세트 생성
$ kubectl apply -f simple-echo-replicaset.yaml
replicaset.apps/simple-echo created

# 파드 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
simple-echo-9tpxb 1/1 Running 0 48s
simple-echo-xfk5c 1/1 Running 0 48s
simple-echo-zkfkt 1/1 Running 0 48s

# 레플리카세트 삭제
$ kubectl delete -f simple-echo-replicaset.yaml
replicaset.apps "simple-echo" deleted

디플로이먼트

레플리카세트보다 상위에 해당하는 리소스이며, 애플리케이션 배포의 기본단위가 되는 리소스 입니다.

레플리카세트는 똑같은 파드의 레플리케이션 개수 관리에 집중하지만,
디플로이먼트는 레플리카세트를 관리하고 다루기 위한 요소입니다.

관계를 정리하면

1
2
3
Deployment --create--> ReplicaSet --create--> Pod (echo-1a)
(echo) (echo-1) --create--> Pod (echo-1b)
--create--> Pod (echo-1c)

디플로이먼트를 정의한 매니페스트 파일은 다음과 같습니다.

simple-echo-deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-echo
labels:
app: simple-echo
spec:
replicas: 3
selector:
matchLabels:
app: simple-echo
template: # template 아래는 파드 리소스 정의와 같음
metadata:
labels:
app: simple-echo
spec:
containers:
- name: goecho
image: lejewk/goecho:latest
ports:
- containerPort: 80

디플로이먼트 반영

1
2
3
4
$ kubectl apply -f simple-echo-deployment.yaml --record
deployment.apps/simple-echo created

# --record 옵션을 통해 어떤 kubectl 명령어를 날렸는지를 기록합니다. 왜인지는...

리소스를 확인해보자

1
2
3
4
5
6
7
8
9
10
11
$ kubectl get pod,replicaset,deployment --selector app=simple-echo
NAME READY STATUS RESTARTS AGE
pod/simple-echo-66f7fffb-792bk 1/1 Running 0 4m44s
pod/simple-echo-66f7fffb-p2fbv 1/1 Running 0 4m44s
pod/simple-echo-66f7fffb-x4ztb 1/1 Running 0 4m44s

NAME DESIRED CURRENT READY AGE
replicaset.apps/simple-echo-66f7fffb 3 3 3 4m44s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/simple-echo 3/3 3 3 4m44s

디플로이먼트의 리비전을 확인해보자

1
2
3
4
$ kubectl rollout history deployment simple-echo
deployment.apps/simple-echo
REVISION CHANGE-CAUSE
1 kubectl.exe apply --filename=simple-echo-deployment.yaml --record=true

현재 리비전은 1이다.

결과적으로 쿠버네티스는 디플로이먼트를 활용해 애플리케이션을 배포합니다.