해당 글은 일프로 님의 인프런 강의 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2의 내용을 정리한 글입니다.
해당 글에 사용된 내용, 사진 및 그림은 모두 강의와 강의 자료에 포함된 내용입니다.
apiVersion: v1
kind: Namespace
metadata:
name: anotherclass-123
labels:
part-of: k8s-anotherclass
managed-by: dashboard
apiVersion: apps/v1
kind: Deployment
metadata:
# Deployment를 지정한 Namespace에 소속시킴
namespace: anotherclass-123
# 하나의 Namespce 안에서 동일한 종류의 파드는 이름이 중복되어서는 안 됨
name: api-tester-1231
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
# 두 개의 파드 생성
replicas: 2
# Deployment 기능의 핵심
# 업데이트 방식
strategy:
type: RollingUpdate
# template 내용을 토대로 파드 생성
template:
metadata:
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
spec:
# 파드를 띄울 노드 선택
nodeSelector:
kubernetes.io/hostname: k8s-master
containers:
- name: api-tester-1231
# DockerHub에서 다운로드 받을 컨테이너 이미지
image: 1pro/api-tester:v1.0.0
ports:
- name: http
containerPort: 8080
# 애플리케이션 환경 변수와 관련된 설정
envFrom:
# key-value로 환경 변수를 제공해주는 역할
- configMapRef:
name: api-tester-1231-properties
# 애플리케이션이 잘 기동되었는지 확인하는 용도
# 실패 시 재기동
# 기동이 정상적으로 된 경우 readinessProbe, livenessProbe 트리거하는 속성
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 24
# 애플리케이션에 트래픽을 연결할지 결정하는 속성
# 실패 시 연결 해제
readinessProbe:
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
# 애플리케이션이 정상이 아닌 경우 재시작시킬지 판단하는 속성
# 실패 시 재기동
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 10
failureThreshold: 3
# 파드에 할당할 리소스 설정
resources:
# 메모리와 CPU 할당
requests:
memory: "100Mi"
cpu: "100m"
# 최대로 사용할 수 있는 메모리와 CPU 용량
# 설정하지 않을 시 파드가 노드의 자원을 모두 사용할 수도 있음
limits:
memory: "200Mi"
cpu: "200m"
# 볼륨 관련 속성
volumeMounts:
# volumeMounts의 name과 volumes의 name이 매칭됨
- name: files
# 파드 내부에 만들어지는 디렉토리
# PVC로 연결됨
mountPath: /usr/src/myapp/files/dev
- name: secret-datasource
mountPath: /usr/src/myapp/datasource
volumes:
- name: files
# volumeMounts에서 지정한 name과 연결되는 실제 Object
persistentVolumeClaim:
claimName: api-tester-1231-files
- name: secret-datasource
secret:
secretName: api-tester-1231-postgresql
apiVersion: v1
kind: Service
metadata:
# Service를 지정한 Namespace에 소속시킴
namespace: anotherclass-123
# Deployment와 이름이 동일하지만 종류가 다른 Object이므로 허용됨
name: api-tester-1231
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
selector:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
ports:
- port: 80
targetPort: http
nodePort: 31231
type: NodePort
apiVersion: v1
kind: ConfigMap
metadata:
namespace: anotherclass-123
name: api-tester-1231-properties
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
# 환경 변수로 지정된 값의 내용
data:
spring_profiles_active: "dev"
application_role: "ALL"
postgresql_filepath: "/usr/src/myapp/datasource/postgresql-info.yaml"
---
apiVersion: v1
kind: Secret
metadata:
namespace: anotherclass-123
name: api-tester-1231-postgresql
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
# 지정한 key로 파일을 생성하고 그 내용으로 value를 세팅
stringData:
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: anotherclass-123
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: kubectl
spec:
resources:
requests:
# PVC 저장 공간
storage: 2G
# 읽기/쓰기 모드 설정
# 필수 값
accessModes:
- ReadWriteMany
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
version: 1.0.0
managed-by: dashboard
spec:
capacity:
storage: 2G
volumeMode: Filesystem
accessModes:
- ReadWriteMany
# 지정한 path를 볼륨으로 사용하겠다는 의미
local:
path: "/root/k8s-local-volume/1231"
# 대상 노드
# nodeSelector와 동일하게 Master Node를 지정한다는 의미
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
namespace: anotherclass-123
name: api-tester-1231-default
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
scaleTargetRef:
apiVersion: apps/v1
# Deployment 지정
kind: Deployment
name: api-tester-1231
# 최소 2개의 파드 유지
minReplicas: 2
# 최대 4개의 파드까지 생성 가능
maxReplicas: 4
# 파드가 스케일링되기 위한 조건
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
# CPU가 평균보다 60% 늘어나면 스케일 아웃을 적용하는 조건
averageUtilization: 60
behavior:
scaleUp:
# 파드가 늘어난 뒤 120초 동안 추가적으로 파드가 증가하지 않도록 제한
stabilizationWindowSeconds: 120