kubectl [command][TYPE] [NAME][flags]
kubelet(데몬)에게 실행 요청 전달 ex. 노드1의 kublet아, 너가 nginx 하나를 실행해주면 좋겠어POD라고 부름클러스터 하나를 여러 개의 논리적인 단위(컨트롤플레인+ 워커노드)로 나눠서 사용 (물리적인 실제 장비는 1개)

출처: https://youtu.be/pfkx8KDAZyk?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=489
목적: 용도에 따라 실행해야 하는 앱을 구분할 때
ex. real/stage/alpha 를 각각 namespace로 분리
명령어: kubectl create namespace [blue/oragne/green]
장점
베이스 namespace를 바꿀 수 있음
default namespace임current-context 확인 함 -> 새로 등록한 context가 아닐 경우, 컨텍스트 변경해달라는 명령어 날려야 함namespace 삭제하기
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: orange
spec:
목표

출처: https://youtu.be/0rYt3PcggzA?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=270

apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- name: nginx-container
image: nginx:1.14
imagePullPolicy: AlwaysPorts:
- containerPort:90
protocol: TCP컨테이너 간 유기적인 관계를 가지고, 연동이 되어 동작하는 방식 ex. 웹서버에 쌓이는 로그 수집하는 애플리케이션
describe 명령어로 살펴보기Pending 상태 -> ContainerCreating -> running or SucceededFailedTerminating (Pod 종료시킬 때의 상태)부제: kubelet으로 컨테이너 진단하기
(컨테이너 진단해서, 건강하지 않으면, restart하는 기능)
livenessProbe) apiVersion: v1
kind: Pod
metadata:
name: webserver
spec:
containers:
- name: nginx-container
image: nginx:1.14
livenessProbe:
httpGet:
path: /
port: 80
애플리케이션마다 건강상태 판단 방법이 다르지 않나? 어떻게 각 특성마다 지원하지?
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
출처: 쿠버네티스 공홈
목표: infra container(pause) 이해하기
api 서버없이, 특정 워커 노드에 있는 kubelet 데몬에 의해 직접 관리되는 컨테이너
static Pod Path) 디렉토리에 k8s yaml 파일 저장하는 순간 실행됨static pod directory에서 yaml파일을 실행컨트롤플레인의 스케쥴러가 컨테이너를 실행할 워커노드를 고를 때, 어떻게 고를까?!
cpu-xxx, mem-yyy 가 보장되는 곳에 배치시켜주세요!pending 상태가 됨apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-env
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
env:
- name: MYVAR
value: "testvalue"
resources:
requests:
memory: 500Mi
cpu: 200m
limits:
memory: 1Gi
cpu: 1
쿠버네티스가 제공해주는 컨트롤러 종류
각 컨트롤러마다 어떤 역할을 하는지 확인해보기!
kubectl create deployment webui --imgae=nginx --replicas=3
출처: https://youtu.be/5X3t6VJH2vQ?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=819
목표
기본구성
// Pod-Definition
apiVersion: v1
kind: Pod
metadata:
name: rc-nginx
labes:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
// ReplicationController-Definition
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui //selector를 꼭 포함해야 함
spec:
containers:
- name: nginx-container
image: nginx:1.14
ReplicationController 와 같은 역할하는 컨트롤러
ReplicationController 보다 풍부한 selector 지원
selector:
matchLabels:
component: redis //여기까지만 쓰면, replication controller와 동일함
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: Notln, values: [dev]}
matchExpressions 연산자
casecade=false 옵션을 넣으면, 연쇄적으로 동작하는 것들을 막아줌
출처: https://youtu.be/L5LDBWrP6QU?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=93
apiVersion: apps/v1
kind: Deployment //롤링업데이트 기능 사용하지 않으면, replicaset과 동일함
metadata:
name: deploy-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
파드 인스턴스를 점진적으로 새로운 것으로 업데이트하여 -> 디플로이먼트 업데이트가 서비스 중단 없이 이루어질 수 있도록 해줌
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
annotations:
kubernetes.io/change-cause: version 1.15
spec:
progressDeadlineSeconds: 600
revisionHistoryLimit: 10
strategy:
rollingUpdate:
maxSurge: 25% //replicas 의 몇 퍼센트를 롤링업데이트 시 생성할지 ex. replica가 3이면, 3+1해서 배포시 공존하는 파드는 4대까지(업데이트된거 running되면 한개 죽임)
maxUnavailable: 25%
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
labels:
app: webui
spec:
containers:
- name: web
image: nginx:1.15
ports:
- containerPort: 80
이전 업데이트 기록 출력
이미지 교체하면서 롤링업데이트
바로 전 단계로 롤백
특정 단계로 롤백
노드 당 1개를 보장하니, replica 설정이 필요없음애플리케이션(컨테이너)특성마다 컨트롤러 종류를 다르게 쓰면 좋을듯.

ex. 매월 1일 아침 9시 정각에 job을 실행해줘
== 0 9 1 * * (분 시 일 월 요일)
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500 //500초안에 이 잡을 실행시키지 못하면, 취소
# concurrencyPolicy: Allow // 러닝 중인 잡이 여러개여도 괜찮음
concurrencyPolicy: Forbid // 러닝 중인 잡이 여러개이면 안됨
jobTemplate:
spec:
template: //job definition과 동일
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 10; echo Bye
restartPolicy: Never
apiVersion: v1
kind: Service
metadata:
name: headless-service
spec:
type: ClusterIP
clusterIP: None // 이게 none이면, headless service라는 의미
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80

출처: https://youtu.be/ilQSgu8qt0o?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=1078
학습목표

출처: https://youtu.be/y5-u4jtflic?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=563
파드, 컨트롤러, 서비스와 같은 종류의 api임
http나 https를 통해 클러스터 내부의 서비스를 외부로 노출
예시: nginx ingress controller
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: marvel-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: marvel-service
servicePort: 80
- path: /pay
backend:
serviceName: pay-service
servicePort: 80
key-value 한 쌍으로 적용
label
metadata:
labels:
rel: stable // 예시
name: mainui // 예시
envirment: dev // 예시
selector
selector:
matchLabels:
key: value
matchExpressions:
- {key: name, operator:In, values: [mainui]}
- {key: rel, operator:NotIn, values: ["beta", "canary"]}
명령어
rel이 beta값인 파드만 보여줘라!apiVersion: v1
kind: Pod
metadata:
name: label-pod-demo
labels:
name: mainui
rel: stable
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
학습목표: 워커노드에 label 설정

출처: https://youtu.be/1UlMwsSN45Y?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=308
특정 노드를 선택해서 파드 생성 yaml 파일
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselector
spec:
nodeSelector: // 다른 노드들이 아무리 한가해도, 이 조건을 만족시키는 노드에 파드 생성됨
gpu: "true"
disk: ssd
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
만약에, nodeSelector 기준에 맞는 노드가 없을경우?
-> 파드 상태가 pending 으로 유지됨
key-value 를 통해 리소스의 특성 기록기록할 용도로 사용annotaions:
builder: "burrito"
buildDate: "20221110"
imageRegistry: https://hub.docker.com/ apiVersion: v1
kind: Pod
metadata:
name: pod-annotation
annotations:
builder: "burrito"
buildDate: "20221110"
imageRegistry: https://hub.docker.com/
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
학습목표: 레이블을 이용한 카나리 배포
이전버전 80%, 새버전 20%와 같이 기준을 정해 새버전과 기존버전을 함께 동작시켜 전체 운영환경 모니터링, 서비스 동작 모니터링
출처: https://youtu.be/u588KXtBoKU?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=406
학습목표
목적: 컨테이너 구성 정보를 한 곳에 모아서 관리하기

출처: https://youtu.be/xyGTvkKzrB4?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=135
환경변수, 볼륨마운트를 통한 저장소(?)
kubectl create configmap [CONFIG_NAME][--from-file=source] [--from-literal=key1=value1]

출처: https://youtu.be/xyGTvkKzrB4?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=402
생성한 ConfigMap의 key를 pod의 컨테이너에 적용
apiVersion: v1
kind: Pod
metadata:
name: genid-stone
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: ttabae-config
key: INTERVAL
name: fakeid
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
생성한 ConfigMap 전체 key를 pod의 컨테이너에 적용
apiVersion: v1
kind: Pod
metadata:
name: genid-boy
spec:
containers:
- image: smlinux/genid:env
envFrom:
- configMapRef:
name: ttabae-config
name: fakeid
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
생성한 ConfigMap의 key를 pod의 컨테이너에 볼륨 마운트 하기
apiVersion: v1
kind: Pod
metadata:
name: genid-volume
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: ttabae-config
key: INTERVAL
name: fakeid-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
volumes:
- name: html
emptyDir: {}
- name: config
configMap:
name: ttabae-config
items:
- key: nginx-config.conf
path: nginx-config.conf

출처: https://youtu.be/aW2RAVnOHFY?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&t=178
base64로 인코딩해서 한 곳에 모아서 관리kubectl create secret [Available Commands] name [flags][options]
정의된 secret을 pod의 컨테이너에 전달하는 방법