kgneng2 / blokg

blog
MIT License
0 stars 0 forks source link

쿠버네티스 kubernetes k8s #22

Open kgneng2 opened 4 years ago

kgneng2 commented 4 years ago

overview

kubernetes 는 왜 hot 한가?

컨테이너는 뭘까요?

image

image

그럼 이제 쿠버네티스는 뭘까요?

image

좀 더 자세한 아키텍쳐는 아래에서 진행한다.

쿠버네티스 오브젝트

Pod

여러 프로세스 실행시 왜 한개의 컨테이너 보다 다수의 컨테이너가 유리할까?

Service

Volume

ASIS

image

TOBE

image

Volume 종류

그럼 영구 스토리지는 어떻게 써?

Namespace

Label

Architecture

image

마스터

API 서버

Etcd

스케쥴러

컨트롤러 매니져

Replication Controller

노드

Kubelet

Kube-proxy

### Container runtime (컨테이너 런타임)
Pod를 통해서 배포된 컨테이너를 실행하는 컨테이너 런타임이다. 컨테이너 런타임은 보통 도커 컨테이너를 생각하기 쉬운데, 도커 이외에도 rkt (보안이 강화된 컨테이너), Hyper container 등 다양한 런타임이 있다.

### cAdvisor
cAdvisor는 각 노드에서 기동되는 모니터링 에이전트로, 노드내에서 가동되는 컨테이너들의 상태와 성능등의 정보를 수집하여, 마스터 서버의 API 서버로 전달한다.
이 데이타들은 주로 모니터링을 위해서 사용된다.

그래서 어떻게 배포해야하나?

k8s에서 application 실행 과정

  1. image registry push
  2. k8s api 서버에 description submit

pod 생성과정

image

kubectl

ReplicaSet 명세를 yml파일로 정의하고 kubectl 도구를 이용하여 API Server에 명령을 전달 API Server는 새로운 ReplicaSet Object를 etcd에 저장

Kube Controller

Kube Controller에 포함된 ReplicaSet Controller가 ReplicaSet을 감시하다가 ReplicaSet에 정의된 Label Selector 조건을 만족하는 Pod이 존재하는지 체크 해당하는 Label의 Pod이 없으면 ReplicaSet의 Pod 템플릿을 보고 새로운 Pod(no assign)을 생성. 생성은 역시 API Server에 전달하고 API Server는 etcd에 저장

Scheduler

Scheduler는 할당되지 않은(no assign) Pod이 있는지 체크 할당되지 않은 Pod이 있으면 조건에 맞는 Node를 찾아 해당 Pod을 할당

Kubelet

Kubelet은 자신의 Node에 할당되었지만 아직 생성되지 않은 Pod이 있는지 체크 생성되지 않은 Pod이 있으면 명세를 보고 Pod을 생성 Pod의 상태를 주기적으로 API Server에 전달

배포방법

image

rc를 안쓰는 이유는 replicaset은 특정라벨이 없거나 해당값과 관계없이 특정 라벨 키를 포함하는 포드 매치 가능 하며 한개만 매칭이 가능한 반면 여러개 가능함.

Deployment

1. 기존 포드 제거후 새 포드 연결 -> 짧은시간의 다운타임이 발생하지만 가장 간단한 방법 (기존에하던방식..)
2. 새것을 시작하고 다 끝나면 오래된 포드 삭제 -> 많은 하드웨어 리소스 소모 

blue/green 배포

롤링 업데이트

deployment

Reference

kubernetes 교육 정리

-https://pages.oss.navercorp.com/naver-container-cluster/docs/

컨테이너

docker

k8s

도커는 한개의 노드에서 컨테이너를 실행시키는데 k8s 는 여러 노드에서 도커 이미지를 실행시킬수있도록 해주기때문에 쓴다 그래서 docker orchestration 라고 부른다.

Scheduling
여러 호스트에 컨테이너를 분배하고 컨테이너나 호스트의 장애 시 재분배 한다.
Networking
여러 호스트에 분산된 컨테이너간의 네트워크와 L4/L7 등을 지원한다.
Logging
동적으로 분산되어 뜨고 내리는 컨테이너들의 로그를 조회할 수 있게 해준다.
Monitoring
동적으로 분산되어 뜨고 내리는 컨테이너들의 모니터링 정보를 수집한다.
Storage
여러 호스트간을 이동하며 운영되는 컨테이너가 접근할 리모트 스토리지를 제공한다.

kubetctl create (create) apply (update)

basic object 로는 pod, service, volume, namespace 등이 있으며 여기에 대한 자세한 내용은 문서를 참고한다.

ncc 서비스 신청시, namespace 로 구분하며 ncc 자체적으로 관리해주며, 따로 클러스터를 구축해주는건 아니다.

pod

deployment

카나리 배포 : 조금씩 조금씩 배포하는 방법. 이걸 많이 사용해야한다?

service

StatefulSet

ConfigMap

예제

apiVersion: v1
kind: Service
metadata:
  name: oneshot-service-${USER}
  labels:
    app.kubernetes.io/instance: oneshot-service-${USER}
spec:
  ports:
  - port: 8080 // L4 port 임 
    name: web
  selector:
    app.kubernetes.io/instance: oneshot-deploy-${USER}
    app.kubernetes.io/version: blue
$ cat Service.yaml | envsubst | kubectl create -f -
service/oneshot-service-albamc created
$ kubectl describe svc oneshot-service-${USER}
Name:              oneshot-service-albamc
Namespace:         edu
Labels:            app.kubernetes.io/instance=oneshot-service-albamc
Annotations:       <none>
Selector:          app.kubernetes.io/instance=oneshot-deploy-albamc,app.kubernetes.io/version=blue
Type:              ClusterIP
IP:                172.24.2.45
Port:              web  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.106.238.95:8080,10.106.95.248:8080 //실제로 배포한 pod들의 ip를 보여준다.
Session Affinity:  None
Events:            <none>

L4, ingress

3.6 storage || vm pm ,

Nube vs Ceph

helm

리얼 배포


ncc 결론

kgneng2 commented 4 years ago

ConfigMap 이란?

ConfigMap 생성 방법

$ kubectl create -f abc.yaml

apiVersion: v1
data:
  send.url: "send.navercorp.com"
  send.roomId: "12345"
kind: ConfigMap
metadata:
  name : dev-stream # 이름을 통해 참조함.

$ kubectal create configmap dev-stream --from-file = application.conf

configmap in spring boot

https://dzone.com/articles/configuring-spring-boot-on-kubernetes-with-configm

kgneng2 commented 4 years ago

Container Resource 관리에 대해서

JVM 옵션을 베어메탈에서 돌릴땐 적용했는데 Container 환경에선 이걸 적용해야되나 싶어서 찾아보게 되었음

JVM Memory Settings in a Container Environment

https://medium.com/adorsys/jvm-memory-settings-in-a-container-environment-64b0840e1d9e

Assign Memory Resources to Containers and Pods

reference

kgneng2 commented 4 years ago

YAML 작성 방법

apiVersion: apps/v1  # for versions before 1.9.0 use apps/v1beta2 보통 다 apps/v1을 지원함.
kind: Deployment # k8s object/resource type 
metadata: # kind의 metadata  
  name: stream-gate-dsp-v1.0.0-master 
  namespace: plumber
  annotations:
    description: er-dsp event to cq broker dsp_imp_master, dsp_cq_master
spec: # 상세스팩 기입 
  selector:
    matchLabels:
      app: stream-gate-dsp-master
  replicas: 5 # tells deployment to run 2 pods matching the template
  template: 
    metadata:
      labels:
        app: stream-gate-dsp-master
    spec:
      containers:  # container 상세스팩 기입
        - name: stream-gate-dsp-master
          terminationMessagePath: /data/log/stream-gate-termination
          terminationMessagePolicy: File
          imagePullPolicy: Always
          args: ["service/stream-gate-dsp-master.properties", "service/log4j2-default.xml", "dsp-save"]
          image: dev.registry.navercorp.com/bizcloud/stream-gate-sspclient:1.2.7.1
          volumeMounts: # volume 정보 기입
            - name: log-path
              mountPath: log
            - name: state-path
              mountPath: /data/log/kafka-streams
      volumes: # volume spec 기입
        - name: log-path
          hostPath:
            path: /data/log/stream-gate
            type: Directory
        - name: state-path
          hostPath:
            path: /data/log/kafka-streams
            type: Directory
kgneng2 commented 4 years ago

deploy platform

overview

아 뭐가 이렇게 많아..

Skaffold

image

Skaffold 설정 파일의 구조

Pipeline config

우리가 앞에서 살펴본 skaffold.yaml 파일이 파이프라인 설정 파일에 해당한다. 컨테이너 빌드 및 레지트리 등록, 테스트 및 컨테이너 배포 일련의 파이프라인에 대한 행동을 정의한다.

Global config

~/.skaffold/config 파일에 저장되어 있는 정보로 skaffold의 기본 설정 정보를 정의한다. 예를 들어 디폴트 도커 레지스트리 경로등을 정의한다.

image

builder

tagger

test

deploy

요점 정리(?)

profile

apiVersion: skaffold/v1beta11
kind: Config
build:
 artifacts:
 - image: gcr.io/terrycho-personal/node-example
   context: backend
   sync:
     manual:
     # Sync all the javascript files that are in the src folder
     # with the container src folder
     - src: 'src/**/*.js'
       dest: .
profiles:
- name : dev
 build:
   local:
     push: false
- name : production

how to use

required

quick start

google cloud code

how to use

required

의견

helm

차트(chart) : 쿠버네티스 애플리케이션을 만들기위해 필요한 정보들의 묶음입니다.
컨피그(config) : 배포 가능한 객체들을 만들기 위해 패키지된 차트에 넣어서 사용할 수 있는 설정들을 가지고 있습니다.
릴리즈(release) : 특정 컨피그를 이용해서 실행중인 차트의 인스턴스 입니다.

Reference

kgneng2 commented 2 years ago

Blue / Green Deploy

  1. Service 생성
  2. Blue Deployment
  3. Green Deployment
  4. kubectl edit svc // app.kubernetes.io/version: blue 삭제
  5. Service 수정 후 apply //Blue endpoint 삭제

blue/green deploy 란?

image

추후 고민점

Inplace deploy