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-end
kubectl 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: pink
Docker ์์ docker run -e APP_COLOR=pink simple-webapp-color
์ผ๋ก Container ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฌํ๋ฏ์ด ์์ฒ๋ผ Pod definition file ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
๊ด๋ฆฌํด์ผ ํ ํ๊ฒฝ๋ณ์๊ฐ ๋ง์ด์ง ๊ฒฝ์ฐ 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-config
ConfigMap ์ ์์ฑํ ๋ค์ 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: cGFzd3Jk
apiVersion: 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-secret
Secret ์ ๋ค๋ฃฐ ๋ 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 ํ๊ฒ ์์ฑ๋ ๊ฐ๋ฅํ๋ค.
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-agent
Pod ๋ ๋ณดํต 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 ํ๊ฒ ๋ฐฐํฌํ ์ ์๊ธฐ์ ์์ ๊ฐ์ด ํ์ผํ์์ผ๋ก ์์ฑํด์ค์ผํ๋ค.