현대 오토에버 SW 스쿨 - 클라우드/쿠버네티스
[쿠버네티스] - Deployment 와 service 사용 & ConfigMap
yongyongMom
2024. 11. 4. 10:42
SMALL
1. Deployment 와 Service 사용
1)Deployment
- 파드 배포에 관한 객체
- 단순히 파드를 배포하는 것 뿐 아니라 몇 개의 파드를 실행할 지 결정하는 것도 가능
- Deployment를 이용해서 pod 배포
- nginx-deploy.yml 파일을 생성하고 작성
- yaml 파일의 정보를 가지고 파드를 생성
- Deployment로 배포한 replicas 에 설정한 파드의 개수를 유지할려고 하기 때문에 파드를 삭제하면 다시 생성해서 파드의 개수를 유지
- Pod로 만들면 삭제해도 복구가 되지 않음
- labels
- 레이블이란 오브젝트에 키-값 쌍으로 리소스를 식별하고 속성을 지정하는데 사용을 하는데 일종의 카테고리라고 할 수 있음
- 아래 처럼 사용
release: v1, v2
environment: dev, production
tier: frontend, backend
app: webapp, middleware
- 다른 객체와 연결을 할 때 label이 매핑이 되어야 함
- Deployment 나 ReplicaSet은 파드를 직접적인 관계를 맺지 않고 자신의 레이블과 일치하는 파드가 개수만 맞게 존재하면 됨
- 수동으로 레이블을 변경하게 되면 그 레이블에 맞게 파드가 생성되어야 된다고 판단
- 파드 확인: 파드가 2개 추가 된 것을 확인할 수 있습니다.
- Deployment 나 ReplicaSet은 pod를 직접 관리하지 않기 때문에 레이블이 변경되면 변경된 레이블 아래 pod가 존재해야 한다고 판단
- 파드 확인: 새로 만들어진 파드 2개가 소멸됨
- 맨 처음 nginx가 Deployment로 레이블을 생성해서 2개의 파드를 만들고 nginx-1로 labels를 수정하면 이 경우는 Deployment가 새로 만들어지는 것이 아니고 labels만 추가가 되서 Deployment 1개 와 새로운 labels 1개가 존재해서 총 4개의 파드가 존재하지만 변경한 labels를 nginx로 변경을 하면 labels에 nginx-1이 사라지기 때문에 다시 2개의 파드만 있으면 됩니다.
- Deployment가 자신의 내부 객체를 직접 관리하지 않고 이름을 통해서 연결되는 구조를 느슨한 결합이라고 합니다.
2) Service
- 기본적으로 파드는 같은 노드에 떠 있는 파드끼리만 통신이 가능
- 다수의 노드에 떠 있는 파드 간의 통신이나 외부와의 통신을 위해서는 CNI 플러그 인이 필요한데 이 때 파드에 위치한 서비스를 외부에서 접속할려면 서비스를 이용해야 합니다.
- 외부에서 파드에 접근하기 위해서는 포트포워딩 하는 방법이 있습니다.
- kubectl port-forward 파드이름 외부포트:내부포트
- 하나의 노드 안에 있는 파드끼리는 통신이 가능
- 파드 와 파드끼리 IP를 안다면 통신이 가능
- 파드는 고정된 위치에 있는 것이 아니고 소멸되었다가 다른 곳에서 만들어지는 동적인 개념
- 파드 간의 통신: IP 이용
- 외부에서 서비스 이름으로 접근할 수 있도록 포트를 외부로 개방하기
- type
- ClusterIP: 기본값으로 클러스터 내부의 다른 리소스들과 통신이 가능합니다. 이 때 IP 뿐 아니라 Service 이름으로도 통신이 가능
- NodePort: 외부에서 노드 IP의 특정 포트로 들어오는 요청을 감지해서 해당 포트와 연결된 파드로 트래픽을 전달하는 것으로 이를 설정하면 ClusterIP 도 자동으로 설정됩니다.
- LoadBalancer: LoadBalancer를 제공하는 Public Cloud 와 연결할 때 사용하는데 NodePort 와 ClusterIP는 자동 설정
- ExternalName: selector 부분에 lables를 사용하지 않고 Domain Name을 직접 사용하고자 하는 경우 사용
3) 롤백
- 디플로이먼트는 기본적으로 롤링 업데이트 와 함께 롤백도 지원
- 롤백은 업데이트에 문제가 생겼을 때 이전 버전으로 바꿀 수 있는 기능
4) ReplicaSet
- 일정한 개수의 동일한 파드가 항상 실행되도록 관리해주는 객체
- 필요한 이유는 서비스의 지속성 때문
- 노드의 하드웨어에서 발생하는 장애 등의 이유로 파드를 사용할 수 없을 때 다른 노드에서 다시 생성해서 사용자에게 중단없는 서비스를 제공할 수 있습니다.
5) Daemon Set
- 모든 노드에 파드를 실행할 때 사용
- 레플리카셋이 특정 개수의 파드를 유지하고자 할 때 사용하는 것이라면 데몬셋은 모든 노드에 파드를 배포할 때 사용
- 모니터링이나 로그 수집에 이용
- kind는 DaemonSet을 적용하면 되고 tier label을 이용해서 어떤 목적인지를 밝히는 경우가 많습니다.
- prom/node-exporter 이미지를 가지고 DaemonSet 생성
6)Job
- 종류
- job: 하나 이상의 파드가 특정한 파드의 정상적인 상태를 유지할 수 있도록 관리
- 노드에 문제가 발생해서 특정 파드에 문제가 발생하면 정상적인 서비스를 할 수 있도록 새로운 파드를 다시 만드는 역할을 수행
- cronjob: 주기적으로 어떤 액션을 발생시키는 잡
- 어떤 액션을 얼마나 자주 발생시킬 지는 매니페스트에서 정의
- cronjob의 매니페스트에는 schedule 과 command 라는 항목이 추가가 됩니다.
- 이미지를 사용할 때 아무런 옵션도 주지 않으면 이미지를 계속 다운로드 받을 수 있기 때문에 cronjob의 경우는 imagePullPolicy 속성을 이용해서 없을 때만 다운로드 받도록 해주어야 합니다.
- pod를 생성하는 작업은 pod를 만들 때는 이미지를 다운로드 받기 때문에 별문제가 없습니다.
- schedule 속성의 값을 설정하는 방법은 linux 의 crontab 가 동일
- 5개의 항목(분 시 요일(0-6) 월 일)을 설정
- 크론잡
- NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
hi */1 * * * * <none> False 3 50s 3m27s
- NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
- NAME: cronjob의 이름
- SCHEDULE: 스케쥴링 내용
- TIMEZONE: 타임 존 설정 내용
- SUSPEND: 지연 여부
- ACTIVE: 수행한 횟수
- LAST SCHEDULE: 마지막으로 수행되고 경과된 시간
- AGE: 만들어져서 서비스된 시간
2. ConfigMap 과 Secret
1) 개요
- kubenetes 객체가 사용하기 위한 데이터를 저장하기 위한 객체
- 환경 변수와 같은 데이터는 대부분 실행 중에는 변하지 않음
- 실행하기 직전에 변할 수 있는 문자열
- 또는 외부로 노출되어서는 안되는 데이터
- ConfigMap 이나 Secrets 은 스스로 기능을 하지는 않고 적은 양의 데이터를 저장하는 것이 목적
2) ConfigMap
- 문자열 상수를 이용해서 만들 수 있고 파일의 내용을 읽어서 만들 수 있음
- 문자열 상수 (리터럴)을 가지고 생성
kubectl create configmap [map name] --from-literal=[키]=[값]
kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java
kubectl delete configmap my-config
kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java --from-literal=URL=http://localhost:8000
kubectl get configmap my-config
kubectl describe configmap my-config
- 파일에서 읽어서 만들기
- 데이터를 저장하는 yaml 파일 생성하고 작성
echo Hello Config >> configmap_test.html kubectl create configmap configmap-file --from-file configmap_test.html
- 다른 yaml 파일에서 가져다 사용할 떄는 최상단에 작성
envFrom: - configMapRef: name: ConfigMap 이름
- 데이터를 저장하는 yaml 파일 생성하고 작성
- 이후부터는 ConfigMap 이름에 해당하는 데이터를 사용할 때에는 key 만 입력하면 됨
3) secret 만들기
kubectl create secret generic “secret이름” --from-literal=키=값…
- kubectl create secret generic: Kubernetes에서 일반적인 Secret 객체를 생성하는 명령어
- <secret-name>: 생성할 Secret의 이름을 지정
- --from-literal=<key>=<value>: key-value 쌍으로 Secret 데이터를 직접 입력합니다. 여러 쌍을 지정할 수 있음
- 이유
반응형
LIST