Open kgneng2 opened 4 years ago
command, args
설정 값을 통해 docker 의 CMD, ENTRYPOINT를 재정의 가능한데 command는 보통 안씀$ 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
https://dzone.com/articles/configuring-spring-boot-on-kubernetes-with-configm
JVM 옵션을 베어메탈에서 돌릴땐 적용했는데 Container 환경에선 이걸 적용해야되나 싶어서 찾아보게 되었음
https://medium.com/adorsys/jvm-memory-settings-in-a-container-environment-64b0840e1d9e
-XX:MaxRAMPercentage
이걸 사용하면 -Xmx, -Xms 무시한다-XX:+UseCGroupMemoryLimitForHeap
을 필요한다.apiVersion: v1
kind: Pod
metadata:
name: memory-demo-2
namespace: mem-example
spec:
containers:
- name: memory-demo-2-ctr
image: polinux/stress
resources:
requests:
memory: "50Mi"
limits:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
이렇게 되면 OOM으로 죽게 된다.
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 24s
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
아 뭐가 이렇게 많아..
우리가 앞에서 살펴본 skaffold.yaml 파일이 파이프라인 설정 파일에 해당한다. 컨테이너 빌드 및 레지트리 등록, 테스트 및 컨테이너 배포 일련의 파이프라인에 대한 행동을 정의한다.
~/.skaffold/config 파일에 저장되어 있는 정보로 skaffold의 기본 설정 정보를 정의한다. 예를 들어 디폴트 도커 레지스트리 경로등을 정의한다.
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
차트(chart) : 쿠버네티스 애플리케이션을 만들기위해 필요한 정보들의 묶음입니다.
컨피그(config) : 배포 가능한 객체들을 만들기 위해 패키지된 차트에 넣어서 사용할 수 있는 설정들을 가지고 있습니다.
릴리즈(release) : 특정 컨피그를 이용해서 실행중인 차트의 인스턴스 입니다.
app.kubernetes.io/version: blue
삭제
overview
kubernetes 는 왜 hot 한가?
컨테이너는 뭘까요?
그럼 이제 쿠버네티스는 뭘까요?
좀 더 자세한 아키텍쳐는 아래에서 진행한다.
쿠버네티스 오브젝트
Pod
여러 프로세스 실행시 왜 한개의 컨테이너 보다 다수의 컨테이너가 유리할까?
Service
Volume
ASIS
TOBE
Volume 종류
그럼 영구 스토리지는 어떻게 써?
Namespace
Label
Architecture
마스터
API 서버
Etcd
스케쥴러
컨트롤러 매니져
Replication Controller
노드
Kubelet
Kube-proxy
그래서 어떻게 배포해야하나?
k8s에서 application 실행 과정
pod 생성과정
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에 전달
배포방법
Deployment
blue/green 배포
롤링 업데이트
kubectl rolling-update $v1 $v2 --image=$v2_image
deployment
kubectl get pods
진행시 뒤에 name-asdf 값이 붙는데 이는 pod template의 hash값을 의미한다Reference
kubernetes 교육 정리
-https://pages.oss.navercorp.com/naver-container-cluster/docs/
컨테이너
docker
k8s
도커는 한개의 노드에서 컨테이너를 실행시키는데 k8s 는 여러 노드에서 도커 이미지를 실행시킬수있도록 해주기때문에 쓴다 그래서 docker orchestration 라고 부른다.
kubetctl create (create) apply (update)
basic object 로는 pod, service, volume, namespace 등이 있으며 여기에 대한 자세한 내용은 문서를 참고한다.
ncc 서비스 신청시, namespace 로 구분하며 ncc 자체적으로 관리해주며, 따로 클러스터를 구축해주는건 아니다.
pod
무슨말이지?deployment
service
StatefulSet
ConfigMap
예제
L4, ingress
3.6 storage || vm pm ,
Nube vs Ceph
helm
리얼 배포
ncc 결론