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 ํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์—†๊ธฐ์— ์œ„์™€ ๊ฐ™์ด ํŒŒ์ผํ˜•์‹์œผ๋กœ ์ƒ์„ฑํ•ด์ค˜์•ผํ•œ๋‹ค.

References