[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!
피드백 부탁드립니다. (- -)(_ _) 꾸벅
[ Configuration 파일의 3가지 구성요소 ]
1. metadata : 리소스의 라벨, 이름 등을 지정함
2. specificaion : 각 컴포넌트에 대한 상세 설명. 어떤 오브젝트 종류인지에 따라 다른 내용을 담는다.
3. status : 쿠버네티스가 자동으로 생성, 자신의 원하는 상태가 되도록 현재 상태를 기술
예를 들어 spec에 replicas가 2라고 명시되어 있지만 현재 상태인 status에는 1개 밖에 생성이 안됐기 때문에, 목표 상태로 맞추기 위해 replicas를 하나 더 생성하게 되는 것이다.
이외에 apiVersion은 스크립트를 실행하기 위한 쿠버네티스 API 버전을 명시하고
Kind는 리소스의 종류를 명시한다. (POD, Service, ReplicaSet, Deployment)
자세한 apiVersion과 Kind는 아래 링크 확인
[ Status는 어디에 저장될까? ]
실제로 마스터 노드의 etcd는 해당 클러스터의 뇌 역할을 담당한다. etcd는 분산 key-value 저장소라 어떤 항목이 어떤 값인지 짝으로 저장할 수 있다. worker node의 상황이 바뀌는 것을 보고 kubelet을 통해 key-value store에 저장되어 controller가 status를 spec에 맞게 맞히려고 노력한다.
[ YAML 이란? ]
인간 친화적인 data serialization 표준.
들여쓰기로 구분하기 때문에 매우 중요하며 많은 programming language에서 널리 쓰인다.
Key-Value, Array/List, Dictionary/Map을 쓸 때의 YAML 표기법은 아래와 같다
Dictionary에서는 space 4칸을 뛴 형태로 dictionary 값들을 기입하지만, space 1칸을 뛰면 그 상위 항목의 하위 dictionary로 들어갈 수 있다.
다음과 같이 Fruits의 List로 Banana, Grape를 표시할 수 있으며, 각각의 List들은 Dictionary로 Calories, Fat, Carbs를 딕셔너리 요소로 포함하고 있다.
또한 순서도 중요하다.
Dictionary = Unordered (순서가 상관 없는)
List = Ordered (순서가 상관 있는)
[ Labels & Selectors ]
Labels : Pod와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 오브젝트의 특성을 식별하는데 있어 사용자에게 중요하지만, 시스템에 직접적인 의미는 없다.
Selectors : Label을 기반으로 오브젝트를 어떻게 선택하는지에 대한 방법의 표현이다.
예를 들어 위와 같은 오브젝트에 Key-Value로 Label을 지정하고, Selector로 env: dev인걸 선택하면
다음과 같이 env가 dev인 것들만 나오게 된다는 뜻이다.
[ yaml 예제 ]
예제1) nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- .metadata.name 필드에 따라 nginx-deployment 이름으로 디플로이먼트가 생성된다.
- .spec.replicas 필드에 따라 디플로이먼트는 3개의 레플리카 파드를 생성한다.
- .spec.selector 필드는 디플로이먼트가 관리할 파드를 찾는 방법을 정의한다. 이 사례에서는 파드 템플릿에 정의된 레이블(app: nginx)을 선택한다. 그러나 파드 템플릿 자체의 규칙이 만족되는 한, 보다 정교한 선택 규칙의 적용이 가능하다.
- template 필드에는 다음 하위 필드가 포함되어있다.
- 파드는 .metadata.labels 필드를 사용해서 app: nginx 라는 레이블을 붙인다.
- 파드 템플릿의 사양 또는 .template.spec 필드는 파드가 도커 허브의 nginx 1.14.2 버전 이미지를 실행하는 nginx 컨테이너 1개를 실행하는 것을 나타낸다.
- 컨테이너 1개를 생성하고, .spec.template.spec.containers[0].name 필드를 사용해서 nginx 이름을 붙인다.
아래 명령을 이용하여 yaml 파일로 명시한 시방서로 디플로이먼트를 생성한다.
$ kubectl apply -f nginx-deployment.yaml
예제2) tomcat-deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: tomcat-deployment
spec:
selector:
matchLabels:
app: tomcat
replicas: 4
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:9.0
ports:
- containerPort: 8080
nodeSelector:
storageType: ssd
nginx 예제와 비슷하지만 nodeSelector는 이미지를 가져다가 설치할 때 노드의 SSD에 설치하라고 지정하는 selector이다.
마찬가지로 아래 명령을 이용하여 yaml 파일로 명시한 시방서로 디플로이먼트를 생성한다.
$ kubectl apply -f tomcat-deployment.yaml
참고) YAML 문법이 맞는지 검사하는 사이트
onlineyamltools.com/validate-yaml
'클라우드 > 쿠버네티스' 카테고리의 다른 글
쿠버네티스 ContainerCreating 상태에서 멈출 시 해결방법 (1) | 2021.06.17 |
---|---|
[Kubernetes] 6. 쿠버네티스 Service란? (NodePort, nginx 실습) (2) | 2021.05.09 |
[Kubernetes] 4. 쿠버네티스 Minikube 설치 및 간단한 배포 (0) | 2021.04.29 |
[Kubernetes] 2-1. 쿠버네티스 기초 개념 (Cluster, Pod, Node, Deployment) (0) | 2021.04.29 |
[Kubernetes] 3. 쿠버네티스 web Minikube 실습해보기 (0) | 2021.04.26 |