kubernetes오브젝트

kubernetes 시스템 내에서 영속성을 가지느 오브젝트 클러스터의 의도한 상태를 나타내기 위해 오브젝트를 이용 status 필드는 kubernetes 시스템과 컴포넌트에 의한 오브젝트의 현재 상태를 나타내며, kubernetes control plane은 이 status를 사용자가 의도한 상태와 일치시키기 위해 끊임없이 / 능동적으로 관리

의도한 상태

오브젝트에 대한 기본적인 정보와 의도한 상태를 기술한 오브젝트 spec을 제시 오브젝트 생성을 위한 kubernetes api 요청은 json 형식 정보를 포함 대부분의 경우 정보를 .yaml 파일로 kubectl에 제공 kubectl은 api요청이 이루어질때, json 형식으로 정보를 변환

kubectl apply 선언적 형태 declarative 오브젝트가 없으면 create 하고 있으면 replace하는 등 더 유연하고 지능적으로 동작

kubectl create, replace 명령적 형태 declaraive 오브젝트가 없으면 create하고 ,있으면 replace 하는 등 더 유연하고 지능적으로 동작

yaml의 기본 구조

apiVersion string kind string metadata dictionary spec dictionary status dictionary

status 오브젝트읭 실제 상태를 기술 쿠버네티스 컨트롤 플레인은 오브젝트의 실제 상태에 일치시키기 방향으로 동작

클러스터관련 오브젝트

node (workernode)

워크로드가 돌아가는 컨테이너를 배치하는 물리(가상)머신 control plane에 의해 관리 일반적인 운영환경에서는 multi node로 운영 각 노드는 kubelet container runtime kube-proxy 가 포함 node의 상태 node의 condition필드에서 확인 가능

k cordon schedulingdisabled k uncordon

k drain

namespace

동일 물리 클러스터를 기반으로 하는 복수의 가상 클러스터를 지원하는 개념 클러스터를 논리적으로 나누고 액세스를 제한하여 리소스를 생성 관리 논리적으로 구분이 되지만 격리가 되는 것은 아님 격리를 위해서는 network policy와 같은 다른 오브젝트를 추가로 사용 해야함

예시 기본 namespace defualt pod deployment가 생성될때 기본적으로 생성되는 namespace kube-system dns kube-proxy 나 kubernetess dashboard처럼 시스템 제어 리소스가 사용하는 namespace kube-public 전체클러스터 리소스에 대한 가시성을 제공하는 경우 사용

custome namespace promethesus, argo, istio 등등의 시스템 관련 솔루션들은 독자 namespace를 할당 microservice별로 namespace를 할당하여 논리적으로 분리

namespace& resource quota yaml구조

k api-resources –namespaced=true k api-resources –namespaced=false

pod

컨테이너 실행관련 오브젝트 최소단위 쿠버네티스 객체 docker 컨테이너와는 조금 다르게, pod는 하나 이상의 컨테이너를 포함간으 애플리케이션 컨테이너 하나또느 다수 스토리지 네트워크등의 정보를 포함

pod의 디자인 패턴

sidecat adapter ambassador

pod yaml 구조

apiVersion: v1 kind: Pod metadata: name: app namespacee: app labels: app: myapp type: front-end spec: containers: - name: nginx image: nginx - name: redis image: redis tolerations: - key: “spp” operator: “equal” value: “blue” effect: “NoSchedule” 특정노드에 배치 nodeAffinity affinity: nodeeAffinity: requiredDuringSchedulingIgnoreDuringExecution: nodeSelectorTerms: - matchExpressions: - key: size operator: In value: - Large - Medum

resource requirement가 있는 경우 reesource정의가 없는 경우 제한없이 cpu/mem사용 limit을 넘어서는 경우 k8s는 cpu throttlee을 하고 memory의 경우에는 limit을 넘어 쓸수있지만 지속되면 termnate 시켜버린다

k run nginx –image=nginx k run nignx2 –image=nginx –dry-run=client -o yaml > pod.yaml

k label pods nginx app=front-end k get pod –show-lables

apply

replicaset

pod의 레플리카를 생성하고 지정한 pod 수를 유지하는 리소스 기존의 replicaset controlleer에서 replicasetㅇ으로 변경 가용성과 탄력성

replicaset yaml구조

apiVersion: app/v1 kind: Replicaset metadata: name: replicatset labels: app: app type: front-end spec: template: metadata: name: app labels: app: myapp type: front-end spec: containers: - name: nginx-container image: nginx selector: matchLabels: type: front-end

deployment

복제된 REPlicated 애플리케이션 pod를 관리하는 오브젝트 롤링 업데이트나 롤백 등을 구현하는 리소스 Replicaset상위

deployment yaml구조

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80

deployment 배포전략

Recreate
rollingupdate

  • maxunavailable
  • maxsurge

deamonset

클러스터의 각 노드에 pod를 하나씩 띄울때 사용하는 오브젝트 로그수집기를 실행하거나 노드를 모니터링 하는 모니터링용 데몬등 클러스터 전체에 항상 실행시켜 두어야하는 pod를 실행하는데 사용 가장 대표적인 daemonset kube-proxy, fliuent-bit

deamonset yaml 구조

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
        # these tolerations are to have the daemonset runnable on control plane nodes
        # remove them if your control plane nodes should not run pods
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
      containers:
        - name: fluentd-elasticsearch
          image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
          resources:
            limits:
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - name: varlog
              mountPath: /var/log
      # it may be desirable to set a high priority class to ensure that a DaemonSet Pod
      # preempts running Pods
      # priorityClassName: important
      terminationGracePeriodSeconds: 30
      volumes:
        - name: varlog
          hostPath:
            path: /var/log

pascal case

k get ds k get pod -A -l app=mornitorinh-agen -o wide

service

pod 집합과 같은 어플리케이션에 접근경로나 seervice discovery를 제공 pod을 외부 네트원크에 연결하록 pod으로의 연결을 로드밸런싱하는 네트워크 오브젝트 하나의 microservice 단위 서비스이름.네임스페이스.svc.cluster.local이라는 fqdn이 생성 service에 ㅇ연결되는 pod는 label selector를 통해 정의

service:clusterip

kubernetes 클러스터 내부에서만 통신이 가능한 internalnetwork 가상 ip가 할당 service-pod 간통신은 kube-proxy가 담당 서비스 디버깅이나 테스트시 보통사용

service:nodeport

nat을 이용해 클러스터 내 node에 고정ㅇ된 port를 갖는 ip로 service 노출 외부 트래피긍ㄹ 서비스에 전달하는 가장 기본적인 방법 클러스터 외부에서 접근은:: port 사용범위 30000-32767

servicee: loadbalancer

클라우드 공급자의 로드밸런서를 이용해 servicee를 외부로 노출 외부 로드밸런서를 사용하기 때문에 spof에 강함 l4 l7 레이어를 통해 servcie 노출

service 타입 yaml 구조

spec:
  type: ClusterIP
  ports:
    - targetPort:80
      port:80
  selector:
    app: myapp
    type: backend

spec:
  type: NodePort
  port:
    - targetPort: 80
      port: 80
      NodePort: 30000
  selector:
    app: myapp
    type: front

spec:
  type: Loadbalancer
  ports:
    - targetPort: 80
      port: 80
      Nodeport: 30000
  selector:
    app: myapp
    type: proxy

service 생성

k create ddeployment nignx-svc –image=nginx

service 네트워킹

pod끼리 ddirect 통신을 하도록 구성하는 경우는 드물고, 대부분 서비스를 통화게 됨 pod가 노드레벨인 반면 service는 cluster 레벨으이 오브젝트

ingress

service tpye은 아니지만 service앞에서 smart router 및 entry point역할을 하는 오브젝트 외부에서 접근 가능한 url load balancing ssl termination 등을 통해 service에 대한 http 기반 접근을 제공 클러스터에 하나 이상의 실행중인 ingress controller가 필요 aws-lb-controller, nginx ingrees why ingreess? 대외 webapp을 만들었다고 가정했을때 단순히 NODeport를 이용해 서비스를 노출하면 사용자가 3

환경변수

개별 컨테이너에서 설정해야하는 내용을 화경변수로 전달 timezone db접속정보등 pod 정의 파일에 환경 변수를 지정하거나 설정 파일을 마운트하여 전달

configmap

워크로드에 필요한 설정정보를 key-value 형태로 저장할수있는 데이터 오브젝트 간단한 환경변수부터 nginx.conf와 같은 설정 파일도 저장 가능

Secret

워크로드에 필요한 민감 정ㅇ보를 key-value 형태로 저장할수있는 데이터 오브젝트 basee64인코딩 상태로 저장

secret yaml 구조

apiVersion: v1 etcd

volume

스토리지 볼륨을 추상화하여 pod와 느슨하게 결합시킨 리소스 오브젝트의 형태가 아닌 Pod 내에서 정의 볼륨 플러그인 hostPath nfs iscsi cephfs emptyDir

volum yaml 구조

volume 의 한계

컨테이너 자신만 접근 가능한 비영구적 볼륨이기 때문에 컨테이너가 재시작할때 유지 할수없음 kubernetes 클러스터 레벨에서 볼륨을 관리하기 어려움 volume이 변경될때마다 해당 volume을 사용하는 모든 pod의 설정 변경 필요

Persistent Volume

추상화도딘 가상의 volume 오브젝트로, 별도로 정의 및 생성하여 pod와 연결

Persistent Volume Claim (PVC)

pv를 요청하는 오브젝트 용량 label 등을 기반으로 pv에 대한 요청이 들어오면 스케줄러가 현재 가지고 있는 pv에서 적당한 볼륨을 할당

storageclass

사용할 스토리지의 클래스를 정의 각 프로바이더가 제공하는 볼륨의 종류에따라 고유한 파라미터를 가짐

dynamic provisioning

on-demand로 스토리지 볼류을 자동 생성할수 있는 매커니즘 storageclass를 기반으로 동작하여

serviceaccount

사람이 아닌 machine이 사용하는 account 사용자 어카운트는 kubernetes 관리 대상이 아님 pod 내 프로세스를$$