从零开始学习k8s-09多实例部署
背景
我们的无状态应用,一般会根据流量进行多实例的部署,以便提升吞吐量。我们之前练习的都是单个实例Pod
,而k8s
的多实例部署支持的类型是Deployment
。
Deployment
可以帮助我们快速的部署多个实例,并且方便的升级,弹性伸缩。
开始
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在这里,我们指定创建一个类型是Deployment
的应用,并且这个应用会创建两个Pod
,Pod
的内容在template
里面。我们保存为third.yaml
然后执行命令:
kubectl apply -f third.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-5d59d67564-6jbcz 1/1 Running 0 83s
nginx-deployment-5d59d67564-kl47k 1/1 Running 0 83s
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m8s
2
3
4
5
6
7
8
9
10
可以看到,我们创建了两个nginx
实例,但是在后面都在了一个随机生成的ID号。而我们查看deployment
的时候,则可以看到有一个deployment
被创建了。而deployment
和这两个pod
的关系,则通过label: app: nginx-deployment
来关联。
deployment
会持续监控label: app: nginx-deployment
的数量,如果发现少了,会新增至2个,如果多了,则会删除至两个,总而言之,会保证匹配的pod
数量一定是我们yaml文件指定的2个。
升级镜像
如果要升级镜像,我们只需要把原来yaml
文件的image
从1.7.9
改成1.8
,然后执行
kubectl apply -f third.yaml
这里注意,我们创建和更新,用的都是apply
这个子命令。这样的设计是考虑到我们不用关心底层是创建还是更新还是删除。我们只指定一个最终的目标,剩下的事全部由k8s
帮我们搞定。
我们通过describe
子命令看看deployment
到底做了什么。
kubectl describe deployment nginx-deployment
Name: nginx-deployment
.......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set nginx-deployment-5d59d67564 to 2
Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set nginx-deployment-64c9d67564 to 1
Normal ScalingReplicaSet 3s deployment-controller Scaled down replica set nginx-deployment-5d59d67564 to 1
Normal ScalingReplicaSet 3s deployment-controller Scaled up replica set nginx-deployment-64c9d67564 to 2
2
3
4
5
6
7
8
9
10
这里可以看到Events
里面告诉我们,两个镜像被一个接一个的更新,最终更新成2个了。
这个时候,我们通过describe
子命令再查看pod
的时候,就发现镜像被更新成1.8
了。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 6m19s kubelet Pulling image "nginx:1.8"
Normal Pulled 6m6s kubelet Successfully pulled image "nginx:1.8" in 12.43853753s
Normal Created 6m6s kubelet Created container nginx
Normal Started 6m6s kubelet Started container nginx
Normal Scheduled 5m2s default-scheduler Successfully assigned default/nginx-deployment-64c9d67564-v9pmf to vm-198-75-centos
2
3
4
5
6
7
8
删除
我们试试删除一个Pod
来模拟某一个容器挂掉的情况。
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-64c9d67564-v9pmf 1/1 Running 0 8m41s
nginx-deployment-64c9d67564-w8km6 1/1 Running 0 8m27s
kubectl delete pod nginx-deployment-64c9d67564-v9pmf
pod "nginx-deployment-64c9d67564-v9pmf" deleted
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-64c9d67564-vdsvz 1/1 Running 0 4s
nginx-deployment-64c9d67564-w8km6 1/1 Running 0 8m39s
2
3
4
5
6
7
8
9
10
11
我们可以看到,nginx-deployment-64c9d67564-v9pmf
确实是被删除了,但是马上又被重新创建了一个新的出来。
也就是说,一旦发现服务崩溃容器消失等情况,k8s会帮我们重新创建一个出来。
小结
这里可以看到,通过deployment
可以保证我们的实例永远处于我们指定的数量(前提是资源足够)。
使用deployment
可以保证我们存活的计算资源一定是符合我们要求的。