Infra, DevOps/인프런 k8s 복습인증

[일프로님 k8s 복습인증] 4. Object 그려보며 이해하기

philo0407 2024. 1. 24. 16:16

 

이 글은 일프로 선생님의 쿠버네티스 어나더 클래스 지상편을 수강하고
복습 메뉴얼을 가이드에 따라 작성한 포스팅입니다
코드는 이곳에 있습니다.
사실 이번 편은 개인적으로 실전에 부딫치면서 알게 된 사실이 많아 세심하게 정리를 하지 않았습니다.  ㅠㅠ
죄송합니다.

 

 

파레토의 법칙은 20%의 인구가 80%를 대변한다는 법칙이다.

 

이번 강의 또한 그렇다 20%의 오브젝트가 거의 전체를 대변한다

 

정말 정성이 가득한 우리 일프로님... ㅠㅠ (그림을 보니 복습이 하기 싫어진ㄷ.. 읍읍)

 

이때 그림에서

 

Cluster Level Object에는

Namespace, PV가 있고

 

Namespace Level Object에는

그 외 오브젝트 (Pod, Service, PVC 등이 속한다)

 

 

Namespace

Object를 그룹핑하는 역할이다

 

Deployment

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:
      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:
            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
              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
속성 명 설명
replicas pod를 만들 갯수
strategy 배포 방식이다
teplate pod에 대한 명세
teplate.image pod의 컨테이너 이미지 태그

 

 

속성 명 설명
envFrom configmap과 연결
startupProbe app이 잘 기동됐는지 체크. 기동이 안 되면 App을 재기동한다
readinessProbe app에 트래픽을 연결할 건지 결정하는 속성
app이 외부 트래픽을 받을 준비가 되었는지를 확인하는 역할
livenessProbe app이 정상이 아니면 재시작을 시킬 건지 판단
resources pod에 CPU랑 memory를 할당
limit :  최대 자원 사용량. 이 속성을 지정하지 않으면 pod가 노드의 자원을 모두 사용한다
volumeMounts mountPath: pod 내부와 연결될 path (PVC, Secret 등과 연결)

 

 

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

 

속성 명 설명
type 외부 트래픽과 연결할 타입
예) ClientIP, NodePort, LoadBalencer
ports port: 서비스 자체의 포트
targetPort: 서비스가 바라보는 대상의 포트
nodeport: 외부 트래픽이 바라보는 노드의 포트 (NodePort 타입에만 있는 속성)
selector 서비스가 트래픽을 연결한 대상 pod들 (라벨로 타겟팅한다)

 

 

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"

 

pod의 환경 변수 값을 제공하는 역할

 

Secret

- 코드 -

더보기
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"

pod에 보안상 중요한 값을 제공하는 역할

 

PV  ( Persistent 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
  local:
    path: "/root/k8s-local-volume/1231"
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}

pod가 사용할 실제 volume을 지정

local과 cloud용 타입이 나뉜다

 

 

PVC  ( Persistent Volume Claim )

- 코드 -

더보기
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

PV와 연결되어 사용된다

 

 

HPA (Horizontal Pod Autoscaler)

- 코드 -

더보기
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

부하에 따라 pod를 늘려주고 줄여주는 스케일링 역할

 

pod내의 모든 container의 cpu가 평균 60% 이상일 때 scale up 한다

단, 바로 하지는 않고 120초 후에 scale up 한다 (behavior 속성)

(추후 HPA 세부 강의에서 또 진행하실 예정이다 !)

 

 

라벨링 컨벤션 | Tips

위 그림은 프로메테우스의 라벨링 예시이다

 

 

 

설명
part-of 애플리케이션의 전체 이름 kube-prometheus
component 구성요소 prometheus
name 애플리케이션 이름 prometheus
instance 인스턴스 식별자 prometheus-k8s
version 버전 2.44.0

 

 

오브젝트 네이밍 예시

오브젝트 타입 네이밍 예시 설명
Service api-tester-1231-internal  내부 오브젝트 셀렉터
Service api-tester-1231-external 외부 셀렉터
HPA api-tester-1231-event 특정 이벤트에 대한 수평 확장
ConfigMap init-data 앱 초기화 (ex. 프로메테우스)

 

 

Label의 종류

- 정보

- 기능 (selector에 의해 select될때)

 

즉, 

- 정보와 기능성 역할하는 라벨과

- 정보만 역할만 하는 라벨 2가지가 있다

 

라벨의 prefix

app.kubernetes.io/part-of 등