Deployment
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
The apiVersion field is the first required field, and it specifies the API endpoint on the API server which we want to connect to; it must match an existing version for the object type defined. The second required field is kind , specifying the object type - in our case it is Deployment , but it can be Pod, ReplicaSet, Namespace, Service, etc. The third required field metadata , holds the object’s basic information, such as name, annotations, labels, namespaces, etc. Our example shows two spec fields (spec and spec.template.spec ). The fourth required field spec marks the beginning of the block defining the desired state of the Deployment object. In our example, we are requesting that 3 replicas, that is 3 instances of the Pod, are running at any given time. The Pods are created using the Pod Template defined in spec.template . A nested object, such as the Pod being part of a Deployment, retains its metadata and spec and loses its own apiVersion and kind - both being replaced by template . In spec.template.spec , we define the desired state of the Pod. Our Pod creates a single container running the nginx:1.14.2 image from Docker Hub.
$ kubectl apply -f nginx-deployment.yaml
ReplicaSet
frontend.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# modify replicas according to your case
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
$ kubectl apply -f frontend.yaml
DeploymentとReplicaSetの関係
DeploymentによりReplicaSetが作成される。
kubectl create deployment
イメージ更新による新規レプリカセット作成とロールバック
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-deployment-em-
Create a deployment with the specified name.
$ kubectl create deployment NAME --image=image -- [COMMAND] [args...]
ex)
deployment mynginx
の作成
$ kubectl create deployment mynginx --image=nginx
上記コマンドで作成された Deployment, ReplicaSet, Pod
のリスト
$ kubectl get deploy,rs,po -l app=mynginx
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mynginx 1/1 1 1 2m27s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mynginx-654f8684f8 1 1 1 2m27s
NAME READY STATUS RESTARTS AGE
pod/mynginx-654f8684f8-whcsv 1/1 Running 0 2m27s
レプリカセットの作成(Podのレプリカを3つ作成)
$ kubectl scale deploy mynginx --replicas=3
作成されたレプリカ replicaset.apps/mynginx-654f8684f8
(3つのPod)の確認
$ kubectl get deploy,rs,po -l app=mynginx
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mynginx 3/3 3 3 9m23s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mynginx-654f8684f8 3 3 3 9m23s
NAME READY STATUS RESTARTS AGE
pod/mynginx-654f8684f8-6frj5 1/1 Running 0 30s
pod/mynginx-654f8684f8-7j7vg 1/1 Running 0 30s
pod/mynginx-654f8684f8-whcsv 1/1 Running 0 9m23s
kubectl rollout
$ kubectl rollout history deployment/mynginx
deployment.apps/mynginx
REVISION CHANGE-CAUSE
1 <none>
$ kubectl rollout history deployment/mynginx --revision=1
deployment.apps/mynginx with revision #1
Pod Template:
Labels: app=mynginx
pod-template-hash=654f8684f8
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
nginx
イメージのバージョン変更・アップデート(リビジョン2)
$ kubectl set image deployment mynginx nginx=nginx:1.21-alpine
deployment.apps/mynginx image updated
ロールアウト履歴
$ kubectl rollout history deployment/mynginx
deployment.apps/mynginx
REVISION CHANGE-CAUSE
1 <none>
2 <none>
$ kubectl rollout history deployment/mynginx --revision=2
deployment.apps/mynginx with revision #2
Pod Template:
Labels: app=mynginx
pod-template-hash=574494d858
Containers:
nginx:
Image: nginx:1.21-alpine
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
レプリカセットが更新したイメージを反映しているか確認(変更したイメージに基づき新規レプリカセット replicaset.apps/mynginx-654f8684f8
が作成される)
$ kubectl get deploy,rs,po -l app=mynginx
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mynginx 3/3 3 3 34m
NAME DESIRED CURRENT READY AGE
replicaset.apps/mynginx-574494d858 3 3 3 4m10s
replicaset.apps/mynginx-654f8684f8 0 0 0 34m
NAME READY STATUS RESTARTS AGE
pod/mynginx-574494d858-5kflv 1/1 Running 0 4m10s
pod/mynginx-574494d858-7cw4x 1/1 Running 0 3m28s
pod/mynginx-574494d858-b7ksw 1/1 Running 0 3m44s
リビジョン1へのロールバック
$ kubectl rollout undo deployment mynginx --to-revision=1
deployment.apps/mynginx rolled back
ロールバックするとリビジョン1が消去されてリビジョン3に移行します。
$ kubectl rollout history deployment/mynginx
deployment.apps/mynginx
REVISION CHANGE-CAUSE
2 <none>
3 <none>
元のレプリカセット replicaset.apps/mynginx-654f8684f8
に戻ったことを確認
$ kubectl get deploy,rs,po -l app=mynginx
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mynginx 3/3 3 3 48m
NAME DESIRED CURRENT READY AGE
replicaset.apps/mynginx-574494d858 0 0 0 17m
replicaset.apps/mynginx-654f8684f8 3 3 3 48m
NAME READY STATUS RESTARTS AGE
pod/mynginx-654f8684f8-99vj5 1/1 Running 0 2m1s
pod/mynginx-654f8684f8-ch8rk 1/1 Running 0 93s
pod/mynginx-654f8684f8-xjwpq 1/1 Running 0 108s