[1] 강의 환경 구성하기
▶ master node에 접속해서 디렉토리 생성
[root@k8s-master ~]# mkdir -p /root/k8s-local-volume/1231
▶ dashboard 접속 > Namespace [모든 네임스페이스] > [+] 버튼 > [입력을 통해 생성] > yaml 파일 붙여넣기 > 업로드
▶ Namespace
- 네임스페이스는 오브젝트들을 그루핑하는 역할을 함
apiVersion: v1
kind: Namespace
metadata:
name: anotherclass-123
labels:
part-of: k8s-anotherclass
managed-by: dashboard
▶ Deployment
- 파드를 만들고 업그레이드를 해주는 역할
- 네임스페이스에 소속
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:
nodeSelector:
kubernetes.io/hostname: k8s-master
containers:
- name: api-tester-1231
image: 1pro/api-tester:v1.0.0 # 컨테이너 허브에 저장되어 있는 이미지를 가져다가 사용
ports:
- name: http
containerPort: 8080
envFrom: # 어플리케이션 환경변수랑 관련이
- configMapRef:
name: api-tester-1231-properties
startupProbe: # 앱이 잘 작동되고 있는지 감시하다가 잘 안되면 readinessProbe/livenessProbe 실행
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: # 파드 하나에 이정도의 리소스를 사용할거다를 정하는 것
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "200m"
volumeMounts:
- name: files # 아래의 volumes의 name이 매칭되서 실제 PersistentVoumeClaim에 연결
mountPath: /usr/src/myapp/files/dev # 파드 내부에 만들어지는 디렉터리
- name: secret-datasource
mountPath: /usr/src/myapp/datasource
volumes:
- name: files
persistentVolumeClaim:
claimName: api-tester-1231-files
- name: secret-datasource
secret:
secretName: api-tester-1231-postgresql
▶ Service
- 서비스는 파드가 외부와 통신할 수 있도록 클러스터 내부에서 고정적인 IP를 갖는 서비스(Service)를 이용하도록 하고 있다.
- https://seongjin.me/kubernetes-service-types/ (참고자료)
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
- ConfigMap을 보면 파드에 환경변수 값을 제공하는 역할
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
stringData:
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
▶ PVC, PV
- 저장공간
- PV는 Namespace 클러스터 레벨의 오브젝트이다.
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:
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
local:
path: "/root/k8s-local-volume/1231"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}
▶ HPA
- 부하에 따라 스케일링 서비스를 제공해주는 오브젝트
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
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
behavior:
scaleUp:
stabilizationWindowSeconds: 120
[2] Object 그려보며 이해하기
▶ Object
- 부하에 따라 스케일링 서비스를 제공해주는 오브젝트
Kubernetes Another-Class Object
▶ Label / Selector / Naming
Label
쿠버네티스 오브젝트를 식별하기 위한 key/value 쌍의 메타정보 / 쿠버네티스 리소스를 논리적인 그룹으로 나누기 위해 붙이는 이름표
Selector
Label을 이용해 쿠버네티스 리소스를 필터링하고 원하는 리소스 집합을 구하기 위한 label query
Label을 이용해 쿠버네티스 리소스를 선택하는 방법(Label query)
Naming
쿠버네티스(Kubernetes)에서는 리소스를 관리하기 위해 네이밍 규칙을 따르는 것이 좋습니다. 쿠버네티스에서 네이밍은 관리 및 유지 보수를 용이하게 만들며, 다른 사용자 및 동료들이 쉽게 이해할 수 있도록 도와줍니다.
Kubernetes Another-Class Labels, Selector, Naming
[3] 강의에서 배포한 Object 삭제
▶ kubectl 명령
[root@k8s-master ~]# kubectl delete ns anotherclass-123
[root@k8s-master ~]# kubectl delete pv api-tester-1231-files
위 자료는 쿠버네티스 어나더 클래스(지상편) - Sprint1의 강의를 듣고 정리한 자료입니다.
https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%96%B4%EB%82%98%EB%8D%94-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A7%80%EC%83%81%ED%8E%B8-sprint1/dashboard