Rolling Updates and Rollbacks
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: nginx
spec:
template:
metadata:
name: myap-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx:1.7.1
replicas: 3
selector:
matchLabels:
type: front-endkubectl create -f deployment-definition.yml
kubectl get deployments
์์ ๊ฐ์ด nginx:1.7.1 ์ ํธ์คํ
ํ๋ Deployment Object ๊ฐ ์๋ค๊ณ ํด๋ณด์.
kubectl apply -f deployment-definiton.yml
kubectl set image deployment/myapp-deployment nginx=nginx:1.9.1
๋ง์ฝ ๋ฒ์ ์ 1.9.1 ๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ ์ถ์ ๊ฒฝ์ฐ yaml ํ์ผ์ ์์ ํ ๋ค apply ํ๊ฑฐ๋ set ๋ช
๋ น์ด๋ฅผ ํตํด ์ ์ฒด Container ์ ๋ฒ์ ์ ์
๊ทธ๋ ์ด๋ ํ ์ ์๋ค.
K8s ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Container ๋ฅผ ํ๋์ฉ ์ ๊ทธ๋ ์ด๋ํ๋ Rolling Update ๋ฅผ ๋ฐฐํฌ์ ๋ต์ผ๋ก ์ฌ์ฉํ๊ณ , ์ ์ฒด Container ๋ฅผ ๋ด๋ฆฌ๊ณ ๋ค์ ๋์ฐ๋ Recreate ์ ๋ต๋ ์ฌ์ฉํ ์ ์๋ค.
kubectl get replicasets
K8s ์์ Container ๋ฒ์ ์ ์ ๊ทธ๋ ์ด๋ํ ๋ Deployment Object ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ReplicaSet ์ ์์ฑํ์ฌ ์๋ก์ด ๋ฒ์ ์ Container ๋ค์ ํ๋์ฉ ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์ ๋ช ๋ น์ด๋ฅผ ์ณ๋ณด๋ฉด 2๊ฐ์ ReplicaSet ์ด ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
kubectl rollout status deployment/myapp-deployment
kubectl rollout history deployment/myapp-deployment
kubectl rollout undo deployment/myapp-deployment
Configure Applications
Configuring Command and Arguments on applications
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-sleeper-pod
spec:
containers:
- name: ubuntu-sleeper
image: ubuntu-sleeper
command: ["sleep2.0"]
args: ["10"]Docker Container ๋ฅผ ์คํํ ๋ Command ์ Argument ๋ฅผ ์ ๋ฌํ๋ฏ์ด ์์ฒ๋ผ Pod definition file ์ Command ์ Argument ๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
kubectl run webapp-green --image=kodekloud/webapp-color -- --color=green
๋ช ๋ น์ด๋ก Argument ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ์ ๋ฌํ ์ ์๋ค.
Configuring Environment Variables
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
env:
- name: APP_COLOR
value: pinkDocker ์์ docker run -e APP_COLOR=pink simple-webapp-color ์ผ๋ก Container ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฌํ๋ฏ์ด ์์ฒ๋ผ Pod definition file ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
ConfigMap
๊ด๋ฆฌํด์ผ ํ ํ๊ฒฝ๋ณ์๊ฐ ๋ง์ด์ง ๊ฒฝ์ฐ ConfigMap ์ ํตํด ํ๊ฒฝ๋ณ์๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
kubectl create configmap \
app-config --from-literal=APP_COLOR=blue \
--from-literal=APP_MOD=prod
์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ง์ ConfigMap ์ ์์ฑํ๊ฑฐ๋,
kubectl create configmap \
app-config --from-file=app_config.properties
์ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ผ์ ๋ฐํ์ผ๋ก ConfigMap ์ ์์ฑํ ์ ์๊ณ ,
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
APP_MODE: prod๋๋ yaml ํ์ผ ํํ๋ก ์ ์ํ ํ ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: app-configConfigMap ์ ์์ฑํ ๋ค์ envFrom ํ๋๋ฅผ ํตํด Pod ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฃผ์
ํด์ค ์ ์๋ค.
env:
- name: APP_COLOR
valueFrom:
configMapKeyRef:
name: app-config
key: APP_COLOR
์ด์ธ์๋ ConfigMap ์์ ํ๋์ ํ๊ฒฝ๋ณ์๋ง ์ฃผ์ ํ๊ฑฐ๋,
volumes:
- name: app-config-volume
configMap:
name: app-config
ํ์ผ ํํ๋ก ์ฃผ์ ์ญ์ ๊ฐ๋ฅํ๋ค.
Configuring Secrets
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: bX1zcWw=
DB_User: cm9vdA==
DB_Password: cGFzd3JkapiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: app-secretSecret ์ ๋ค๋ฃฐ ๋ ConfigMap ๊ณผ ๋น์ทํ๊ฒ Secret Object ๋ฅผ ์ฌ์ฉํ์ฌ Pod ์ ์ฃผ์ ํด์ค ์ ์๋ค.
kubectl create secret generic app-secret \
--from-literal=DB_Host=mysql \
--from-literal=DB_User=root \
--from-literal=DB_Password=paswrd
๋ง์ฐฌ๊ฐ์ง๋ก Imperative ํ๊ฒ ์์ฑ๋ ๊ฐ๋ฅํ๋ค.
ConfigMap ๊ณผ Secret ์ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธํ๋ ์ด์
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "prod"
APP_VER: "1.0"
---
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: busybox
command:
- sleep
- 3600
volumeMounts:
- name: config-volume
mountPath: "/etc/config"
volumes:
- name: config-volume
configMap:
name: app-config
ConfigMap ๊ณผ Secret ์ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธํ๋ฉด ํด๋น ๋ฐ์ดํฐ๊ฐ Pod ์ ํน์ ๋๋ ํฐ๋ฆฌ์ ํ์ผ ํํ๋ก ์ ์ฅ๋๋ค. ์ด๋ k8s ๋ด๋ถ์ ์ผ๋ก tmpfs(๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ํ์ผ์์คํ )์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ง์ดํ ํ๋ ๋ฐฉ์์ด๋ค. ํ๊ฒฝ๋ณ์์ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ํ๊ฒฝ๋ณ์์ ์ง์ ์ฌ์ฉ๋๋ค. ํ์ผ๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ฉด ์ฌ๋ฌ ์ด์ ์ด ์กด์ฌํ๋ค.
๋ณด์ ๊ฐํ
kubectl exec -it pod-name -- env | grep SECRET_
ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Pod ๋ด๋ถ์์ ๊ฐ์ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
cat /proc/$(pgrep -f app)/environ
๋ ํ๋ก์ธ์ค ๋ด๋ถ์ ํ๊ฒฝ๋ณ์๊ฐ ๋จ์์์ด ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
Secret ์ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธํ๋ฉด ๋จ์ ํ์ผ๋ก ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ์ ๊ทผ ๊ถํ์ ์ ์ ํ์ฌ ๋ณด์์ ๊ฐํํ ์ ์๋ค.
์ค์๊ฐ ๋ณ๊ฒฝ ๋ฐ์
k8s ๋ synlink ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์๋์ผ๋ก ๊ต์ฒดํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์์ํ์ง ์๊ณ ๋ ์ ์ฉ๋๋ค.
์ผ๊ด๋ ๊ด๋ฆฌ
์ฌ๋ฌ Pod ์์ ๋์ผํ ConfigMap ๋๋ Secret ์ ๊ณต์ ํ ์ ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด ์ด์์ด ํธ๋ฆฌํด์ง๋ค.
์ฉ๋ ์ ํ
ํ๊ฒฝ๋ณ์ ๋ฐฉ์์ ์์คํ ์ ๋ฐ๋ผ ๊ธธ์ด ์ ํ์ด ์์ผ๋ ๋ณผ๋ฅจ์ ์ ํ์ด ์๋ค. TLS ์ธ์ฆ์, SSH ํค ๋ฑ ๊ธธ์ด๊ฐ ๊ธด ๊ฐ๋ค์ ํ๊ฒฝ๋ณ์๋ก ์ฌ์ฉํ ์ ์์ ๋ ์ ์ฉํ๋ค.
Multi-Container Pods
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
labels:
name: simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- ContainerPort: 8080
- name: log-agent
image: log-agentPod ๋ ๋ณดํต 1๊ฐ์ Container ๋ฅผ ํฌํจํ์ง๋ง ์ฌ๋ฌ๊ฐ์ Container ๋ฅผ ํฌํจํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ์ด๋ Log Agent ์ ๊ฐ์ Helper Container ๋ฅผ ํจ๊ป ์๋ช ์ฃผ๊ธฐ์ ํฌํจํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ํจ์ด๋ค. ์์ฒ๋ผ 2๊ฐ์ Container ๋ฅผ ํฌํจํ์ฌ Pod ๋ฅผ ๋ฐฐํฌํ ์ ์๋ค.
Multi-Container Pods Design Patterns
๋ค์์ Container ๋ฅผ ํฌํจํ Pod ๋ฅผ ๋ฐฐํฌํ ๋ ๋ฐ๋ฅด๋ ๋์์ธ ํจํด์ด๋ค. ์ Log Agent ๋ Sidecar Pattern ์ ์์๋ค.
- Sidecar Pattern
- Adapter Pattern
- Ambassador Pattern
InitContainers
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: 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; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']Pod ๋ฅผ ๋ฐฐํฌํ ๋ ์ผํ์ฑ ์์
์ด ํ์ํ ๊ฒฝ์ฐ initContainers ๋ฅผ ํตํด ๊ตฌ์ฑํ ์ ์๋ค. Pod ์ ๋ฉ์ธ Container ๋ initContainers ์์
์ด ์๋ฃ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ์คํจํ ๊ฒฝ์ฐ ๊ณ์ Pod ๋ฅผ ์๋ก ๋ง๋ ๋ค.
Self-Healing Applications
K8s ๋ ReplicaSet ๊ณผ Replicate Controller ๋ฅผ ํตํด Pod ์ ์๋์ ๋ณด์ฅํ๋ค.
Horizontal Pod Autoscaler (HPA)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx
resources:
requests:
cpu: "250m"
limits:
cpu: "500m"ํธ๋ํฝ์ด ๋ง์์ ธ CPU ์ฌ์ฉ๋์ด limit ์ ๊ฐ๊น์์ง๊ธฐ ์ ์ ์คํ ์ค์ผ์ผ๋ง์ ํตํด ๋ถํ๋ฅผ ๋ถ์ฐํ ์ ์๋ค.
kubectl autoscale deployment my-app --cpu-percent=50 --min=1 --max=10
kubectl get hpa
kubectl delete hpa my-app
์ ๋ช ๋ น์ด๋ก HPA ๋ฅผ ์ง์ ์์ฑํ ์๋ ์๊ณ ,
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50์์ ๊ฐ์ด ํ์ผ์ ํตํด ์์ฑํ ์๋ ์๋ค.
Vertical Pod Autoscaling (VPA)
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vertical-pod-autoscaler.yaml
VPA ๋ Pod ์ ํ๋์จ์ด ๋ฆฌ์์ค๋ฅผ ์คํ ์ค์ผ์ผ๋งํ๋ Object ๋ก K8s ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ๋ฐฐํฌํด์ผ ํ๋ค.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "my-app"
minAllowed:
cpu: "250m"
maxAllowed:
cpu: "2"
controlledResources: ["cpu"]๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์๋ Object ์ด๋ค๋ณด๋ Imperative ํ๊ฒ ๋ฐฐํฌํ ์ ์๊ธฐ์ ์์ ๊ฐ์ด ํ์ผํ์์ผ๋ก ์์ฑํด์ค์ผํ๋ค.