July
25th,
2021
해당 내용은 책 <컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커>에 나오는 내용이며 이는 개인적으로 공부하기 위해서 게시하는 글임을 알립니다.
레플리카셋으로 파드 수 관리하기
많은 사용자를 대상으로 웹 서비스를 하려면 다수의 파드가 필요하다. 그래서 쿠버네티스에서는 다수의 파드를 만드는 레플리카셋 오브젝트를 제공한다.
디플로이먼트로 생성한 파드여야 replica 옵션을 사용할 수 있다.
//sysnet4admin/echo-hname은 도커 허브에서 해당되는 이미지를 가져온다
kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname
통해서 디플로이먼트를 생성한다.
kubectl scale deployment echo-hname --replicas=3
위 명령을 통해 replica 셋을 생성할 수 있지만 한꺼번에 여러 개의 파드를 만드려면 YAML 파일로 작성해야 한다. 이러한 파일을 오브젝트 스펙(spec)이라 한다.
echo-hname.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-hname
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: echo-hname
image: sysnet4admin/echo-hname
위 내용을 하나하나 알아가 보자.
echo-hname.yaml
#apiVersion: API 버전을 명시한다
#이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
#명시한다. apps/v1에서는 .spec.selector 와 .metadata.labels 이
#설정되지 않으면 .spec.template.metadata.labels 은 기본 설정되지 않는다.
#그래서 이것들은 명시적으로 설정되어야 한다. 또한 apps/v1 에서는
#디플로이먼트를 생성한 후에는 .spec.selector 이 변경되지 않는 점을 참고한다.
apiVersion: apps/v1
#어떤 종류의 오브젝트를 생성하고자 하는지 명시한다.
kind: Deployment
#이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여
#오브젝트를 유일하게 구분지어 줄 데이터이다.
#디플로이먼트 이름(name)은 echo-hname이다.
#차후에 이 디플로이먼트를 delete할 때 이 이름으로 지운다.
metadata:
name: echo-hname
#오브젝트에 첨부된 카와 값의 쌍이다. 레이블은 오브젝트 특성을
#식별하는 데 사용되어 사용자에게 중요하지만
#코어 시스템에 직접적인 의미는 없다.
labels:
app: nginx
#오브젝트에 대해 어떤 상태를 의도하는지 명시한다.
spec:
#필드에 따라 디플로이먼트는 3개의 레플리카 파드를 생성
replicas: 3
#(.spec.selector)디플로이먼트가 관리할 파드를 찾는 방법을 정의한다.
#이 사례에서는 파드 템플릿(아래 명시된 template)에 정의된 레이블(app:nginx)을
#선택한다. 그러나 파드 템플릿(아래 명시된 template을 말함) 자체의 규칙이 만족되는 한,
#보다 정교한 선택 규칙의 적용이 가능하다.
selector:
matchLabels:
app: nginx
#template 필드에는 다음 하위 필드가 포함된다
template:
#파드는 .metadata.labels 필드를 사용해서
#app: nginx레이블을 붙인다
metadata:
#이 레이블을 담으로써 위에 selector에서 관리할 파드를 찾을 수 있다.
labels:
app: nginx
#.template.spec 필드는 파드가 도커 허브의
#sysnet4admin/echo-hname 이미지를 실행하는
#nginx 컨테이너 1개를 실행하는 것을 나타낸다
#컨테이너 1개를 생성하고 .spec.template.spec.containers[0].name 필드를
#사용해서 echo-hname 이라는 이름을 붙인다.
#즉 컨테이너의 이름이 echo-hname이 된다. describe deployment 명령어로 확인 가능
spec:
#파드는 여러 개의 컨테이너를 가질 수 있는데 여기서는 하나만 선언한 것
#container name은 echo-hname 동일한 pod 내에서 유일한 이름을 가져야 합니다.
containers:
- name: echo-hname
#컨테이너 이미지는 도커허브에 있는 sysnet4admin/echo-hname을 가져온다.
#docker image는 docker registry에서 pull을 받아 오게 되는데,
#docker registry가 명시되어 있지 않다면 docker 공식 public registry인
#docker hub(https://hub.docker.com)에서 해당 image를 가져오게 됩니다.
# 만약 private docker registry를 사용한다면 docker image 이름 앞에 해당
#url을 명시해 줘야 하며 k8s에서는 remote docker registry와 통신은 http가
#아닌 https로만 하게 되어 있어서 private docker registry에 반드시 TLS 인증서를 설치해둬야 합니다.
image: sysnet4admin/echo-hname
그리고 이제
kubectl create -f echo-hname.yaml
명령으로 실행해본다.