.yaml파일에 각 속성에 대해 이해하기
폴더생성
master Node에 접속해 디렉토리를 생성
mkdir -p /root/k8s-local-volume/1231
.yaml의 metadata에 있는 labels 파헤치기
우리는 옷을 사던 어떤 제품을 사면 해당 제품에 label
을 볼 수 있습니다. 이 label
들은 이 제품이 어떤 제품인지에 대한 명세
를 해주는 부분이지요. metadata
에 있는 label
s안에 내용들도 마찬가지 입니다.
다른 Ojbect들끼리의 연결에도 중요한 역할을 하니 잘 알아 두어야 합니다. 아래 이미지를 보시면 selector
를 이용해서 해당 Object의 labels
의 정보로 어떤 Object가 어떤 Object에 연결될 것인지를 판단하게 됩니다.
그럼 각각 무엇을 나타내는지 알아 볼까요??
part-of
- 어플리케이션의 전체적인 이름
component
- 구성요소
- 해당 어플리케이션이 어떤것으로 만들어져 있는지, 구성되어 있는지를 명세합니다.
- ex)
prometheus
name
- 어플리케이션의 이름
- ex)
prometheus
instance
- 인스턴스 식별자
- 목적에 따라 여러개를 작성할 수 있다.
- ex) k8s, k8s-1, k8s-2, k8s-rule, ...
version
- 버전
- App버전 변경시에는 수정이 필요
Cluster를 기준으로 labels를 파헤쳐보기
우리는 위에서 Namespace
를 기준으로 labels
를 어떻게 사용하는지 어떻게 연결하고 어디에 필요한지를 알아보았습니다.
하지만, 이것은 Namespace
에 Object에 국한된 것이 아닌 Cluster
에서도 포함이 되는데요.
실제 예로 PV
는 Namespace
에 속하지 않고 Cluster
영영에 속하게 됩니다.
PV
에서는 selector
가 아닌 nodeAffinity
속성으로 Master Node
와 연결 시킵니다.Pod
1의 경우에는 nodeSelector
속성으로 Master Node
와 연결을 시키죠.
또한, labels
속성 값들 앞에 prefix를 붙여 사용 할 수도 있습니다.
보통 도메인주소를 붙이는데 다양한 툴을 공부할 때에 해당 도메인을 많이 보시게 될겁니다.
selector
- selctor는 Object에 따라 다양한 방식으로 존재하는데요. 방식이 다양한만큼 작성법도 다릅니다.
일반적인 selector
selector:
part-of: k8s-anotherclass
commponent: backend-server
name: api-server
instance: api-tester-1231
PVC의 selector
selector:
matchLabels:
instance: api-tester-1231-files
PV의 selector
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpresstions:
- {key: kuebernetes.io/hostname, operator: in, values: [k8-master]}
Pod의 selector
nodeSelector:
kubernetes.io/hostname: k8s-master
Namespace
- Cluster level의 Object를 그루핑해주는 역할
metadata
- name
- Namespace의 이름
apiVersion: v1
kind: Namespace
metadata:
name: anotherclass-123
labels:
part-of: k8s-anotherclass
managed-by: dashboard
Deployment
- Pod를 만들고 Upgrade를 해주는 역할
metadata
- namespace
- 위에서만든 namespace에 소속시키기 위한 metadata
- name
- Deployment의 이름이되고 이 이름은 같은 Object타입이라면 고유값으로 작성(중복 X)
replicas
- Pod을 몇개 만들껀지 결정
template
- Pod를 어떻게 구성할지에 대한 내용
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: anotherclass-123
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
strategy:
type: RollingUpdate
template:
metadata:
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
spec:
# Pod를 띄울 Node를 선택
nodeSelector:
kubernetes.io/hostname: k8s-master
containers:
- name: api-tester-1231
# docker hub(이미지 보관소)에 있는 이미지 선택
image: 1pro/api-tester:v1.0.0
ports:
- name: http
containerPort: 8080
# application의 환경변수와 관련된 부분
envFrom:
## 환경변수의 값을 제공해주는 역할
- configMapRef:
name: api-tester-1231-properties
# App이 잘 기동되어 있는지 체크하다가 기동안되면 App 재기동하는 역할
# 성공시 밑의 readinessProbe와 livenessProbe를 실행시키
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 36
# App의 트래픽을 연결할건지에 대한 속성
readinessProbe:
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
# App이 정상이 아니면 재시작을 시킬것인지 판단하는 속성
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 10
failureThreshold: 3
# Pod하나 사용할 리소스자원을 정해주는 역할
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "200m"
# Pod내부에 만들어지는 디렉토리
volumeMounts:
- name: files # volumes의 name과 연결되는 이름
mountPath: /usr/src/myapp/files/dev
- name: secret-datasource # volumes의 name과 연결되는 이름
mountPath: /usr/src/myapp/datasource
volumes:
- name: files # volumeMounts의 name과 연결되는 이름
persistentVolumeClaim:
claimName: api-tester-1231-files
- name: secret-datasource # volumeMounts의 name과 연결되는 이름
secret:
secretName: api-tester-1231-postgresql
Service
- Pod한테 트래픽을 연결시켜주는 역할
apiVersion: v1
kind: Service
metadata:
namespace: anotherclass-123
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
Configmap, Secret
환경변수 선언방식
- data :
base64
인코딩된 데이터를 수동으로 입력해야함 - stringData :
plain text
형태로 정의 할 수 있으며 자동으로bsae64
로 인코딩되어 저장 - data 또는 stringData아래에 계층을 하나로 나누면 해당 파일 이름으로 파일이 생성되어 적용됩니다.
Configmap
- Pod에 환경변수를 제공하는 역할
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"
Secret
- Pod에 좀 더 중요한 값을 제공하는 역할
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
stringData:
application-security.yaml:
ddriver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://prostgresql:5431"
username: "username_test"
password: "password_test"
PVC(Persistent Volume Claim), PV(Persistent Volume)
PVC
- 사용자가 요청하는 스토리지의 요구 사항
- 예를 들어보겠습니다. 우리는 10Gb가 할당된 PV를 5개의 Pod에서 나눠서 사용 할 수 있습니다. 이럴 경우 PVC를 각각 Pod에 작성하여 storage를 2Gb씩 나눠서 사용 할 수 있도록 명세하는 것이죠.
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:
# volume의 용량을 정의
storage: 2G
# 접근 권한 설정(읽기, 쓰기, 읽기 & 쓰기)
accessModes:
- ReadWriteMany
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
PV
- Cluster level의 Object로 실제 Volume을 지정하는 역할
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를 Volume으로 사용하겠다는 의미
local:
# 미리 폴더를 만들어 두어야함
path: "/root/k8s-local-volume/1231"
# 대상 Node를 선택하는 것
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}
HPA
- 부하에 따라 Pod를 늘려주고 줄여주는 스케일링 역할
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
kind: Deployment
name: api-tester-1231
# 최소 몇개의 Pod를 가지고 있을 것인지
minReplicas: 2
# 최대 몇개의 Pod를 가지고 있을 것인지
maxReplicas: 4
# 스케일 out 조건 설정
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
# 동작 상세 설정
behavior:
scaleUp:
stabilizationWindowSeconds: 120
적용하기
- 위의 .yaml파일의 내용을 Kubernetes Dashboard를 통해 설치할 수 있습니다.
- 1번을 클릭하고 2번에 .yaml파일의 내용을 복붙한다음에 3번인 업로드를 클릭하시면 됩니다.
삭제하기
- 위에서 사용한 Object를 삭제하고 싶다면 아래 명령어를 입력하세요.
# namespace에 있는 모든 것을 삭제
kubectl delete ns anotherclass-123
# pv삭제
kubcetl delete pv api-tester-1231-files
이 글은 인프런의 일프로님 강의를 기반으로 작성되었습니다.
'FrameWorks > Kubernetes' 카테고리의 다른 글
[Kubernetes] Application 기능 이해하기 - Configmap, Secret (0) | 2025.03.10 |
---|---|
[Kubernetes] Application 기능 이해하기 - Pod(Probe) (0) | 2025.03.09 |
[Kubernetes] 쿠버네티스에 모니터링 시스템 설치하기(feat. Prometheus, Loki-stack) (0) | 2025.03.07 |
[Kubernetes] RedHat계열을 이용한 쿠버네티스 설치 (1) | 2025.03.06 |
Kubernetes에서 NFS와 PV,PVC,를 이용한 데이터 관리하기 (0) | 2024.06.27 |
댓글