apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app # deployment의 이름
labels:
app: nginx-app # deployment의 label
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80
위 yaml 파일을 실행했을 때의 결과 (kubectl apply -f deployment.yaml
)
> kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 21s
--
> kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-app-f9d85f7f6 1 1 1 25s
--
> kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-app-f9d85f7f6-hkxg2 1/1 Running 0 29s
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app # deployment의 label
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app # deployment가 관리하는 label
template:
metadata:
labels:
app: nginx-app # replica set, pod에 부여되는 label
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80
label은 object에 부여되는 key, value 값이다. 속성을 식별하는 역할을 한다.
selector.matchLabels
)와 rs, pod에 부여되는 label의 값(template.metadata
)은 같아야 한다. 다르면 실행이 안된다.selector
does not match template labels
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app2 # 수정
template:
metadata:
labels:
app: nginx-app2 # 수정
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80
> kubectl get rs --show-labels
NAME DESIRED CURRENT READY AGE LABELS
nginx-app-76dc4c94c4 1 1 1 14s app=mylabel,pod-template-hash=76dc4c94c4
> kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-app-76dc4c94c4-wjkjz 1/1 Running 0 101s app=mylabel,pod-template-hash=76dc4c94c4
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app # container name
image: nginx
ports:
- containerPort: 80
Container의 이름으로 Pod의 이름과는 다르다. Cotainer 이름을 nginx-app2로 바꿨을 때 다음과 같다.
> kubectl describe pod nginx-app-745f746788-mx8q2
Name: nginx-app-745f746788-mx8q2
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m9s default-scheduler Successfully assigned default/nginx-app-745f746788-mx8q2 to minikube
Normal Pulling 2m8s kubelet Pulling image "nginx"
Normal Pulled 2m6s kubelet Successfully pulled image "nginx" in 2.178144199s
Normal Created 2m6s kubelet Created container nginx-app2
Normal Started 2m6s kubelet Started container nginx-app2
컨테이너의 이름은 무슨 의미가 있을까?
kubectl rollout restart deployment/my-deployment -c my-container
kubectl logs <pod-name> -c <container-name>
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app # 컨테이너 1
image: nginx
ports:
- containerPort: 80
- name: nginx-app2 # 컨테이너 2
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 81
위 파일을 적용하면 하나의 파드 안에 2개의 image (nginx, simple-container-app)이 들어간다.
> kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-5f6f64fc6f-zx5mk 2/2 Running 0 118m
> kubectl describe pod nginx-app-5f6f64fc6f-zx5mk
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 20s default-scheduler Successfully assigned default/nginx-app-5f6f64fc6f-zx5mk to minikube
Normal Pulling 20s kubelet Pulling image "nginx"
Normal Pulled 17s kubelet Successfully pulled image "nginx" in 2.13241259s
Normal Created 17s kubelet Created container nginx-app
Normal Started 17s kubelet Started container nginx-app
Normal Pulling 17s kubelet Pulling image "arisu1000/simple-container-app:latest"
Normal Pulled 15s kubelet Successfully pulled image "arisu1000/simple-container-app:latest" in 2.101710998s
Normal Created 15s kubelet Created container nginx-app2
Normal Started 15s kubelet Started container nginx-app2
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80 # here
파드 안에 있는 nginx 이미지에 접근하기 위해서 80번 포트를 사용
https://blog.yevgnenll.me/k8s/deployment-declaration-update-application
deployment의 기본 업데이트 전략은 Rolling Update
출처) https://gracefullight.dev/2019/12/27/kubernetes-rolling-update/
출처) https://gracefullight.dev/2019/12/27/kubernetes-rolling-update/
kubectl apply -f
로 갱신kubectl rollout history
를 통해 revision 기록을 볼 수 있다. > kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
> kubectl get rs,pod -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-deployment-556d4bf7cb 3 3 2 19s nginx-deployment nginx:1.9.8 app=nginx-deployment,pod-template-hash=556d4bf7cb
replicaset.apps/nginx-deployment-dfcbd5fd6 1 1 1 3m25s nginx-deployment nginx app=nginx-deployment,pod-template-hash=dfcbd5fd6
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-556d4bf7cb-6bt7g 1/1 Running 0 8s 172.17.0.5 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-8xsjn 1/1 Running 0 19s 172.17.0.4 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-b2n2j 0/1 ContainerCreating 0 4s <none> minikube <none> <none>
pod/nginx-deployment-dfcbd5fd6-8v4gj 1/1 Running 0 3m25s 172.17.0.8 minikube <none> <none>
---
> kubectl get rs,pod -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-deployment-556d4bf7cb 3 3 3 20s nginx-deployment nginx:1.9.8 app=nginx-deployment,pod-template-hash=556d4bf7cb
replicaset.apps/nginx-deployment-dfcbd5fd6 0 0 0 3m26s nginx-deployment nginx app=nginx-deployment,pod-template-hash=dfcbd5fd6
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-556d4bf7cb-6bt7g 1/1 Running 0 9s 172.17.0.5 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-8xsjn 1/1 Running 0 20s 172.17.0.4 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-b2n2j 1/1 Running 0 5s 172.17.0.2 minikube <none> <none>
pod/nginx-deployment-dfcbd5fd6-8v4gj 1/1 Terminating 0 3m26s 172.17.0.8 minikube <none> <none>
---
> kubectl get rs,pod -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-deployment-556d4bf7cb 3 3 3 22s nginx-deployment nginx:1.9.8 app=nginx-deployment,pod-template-hash=556d4bf7cb
replicaset.apps/nginx-deployment-dfcbd5fd6 0 0 0 3m28s nginx-deployment nginx app=nginx-deployment,pod-template-hash=dfcbd5fd6
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-556d4bf7cb-6bt7g 1/1 Running 0 11s 172.17.0.5 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-8xsjn 1/1 Running 0 22s 172.17.0.4 minikube <none> <none>
pod/nginx-deployment-556d4bf7cb-b2n2j 1/1 Running 0 7s 172.17.0.2 minikube <none> <none>
kubectl rollout undo deployment/app --to-revision=1
> kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 <none>
3 <none>
> kubectl rollout undo deployment/nginx-deployment --to-revision=1
error: unable to find specified revision 1 in history
> kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 3/3 1 3 36m nginx-deployment nginx:111.11.0 app=nginx-deployment