在这一讲里,我们可以一起探讨下如何在Kubernetes集群中以Deployment 的形式部署Pods,但在那之前,我们再了解一个Kubernetes object,也即是Replication set。
Replication set
上一篇博文我们讲到了Replication controller(下称RC),在功能性方面,Replication set与RC非常相似。然而Replication set是一个更新的Kubernetes object, 它有一个额外的特点,也就是set based selectors。 这个额外的特点意味着我们能够根据一组值过滤键。
以下是两种selectors的对比,
Equality-based selectors:
该selector允许按键和值过滤,其中匹配的对象应满足所有指定的标签。
Set-based selectors:
该selector允许您有一系列的值,而您只需要满足其中几个值而不需要全部满足。
为什么我们需要Deployment?
我们已经有了Replication controller也有了 Replication set,为什么还需要一个Deployment呢?因为Deployment可以帮助我们执行rolling updates 以及 rollbacks。Rolling updates是指您修改或更新您pod实列的某些内容。而rollbacks是指回归到之前的版本。
看看我们这次的定义文件
ginx_deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 5
selector:
matchLabels:
app: newnginx
template:
metadata:
labels:
app: newnginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
和之前几个博文的定义文件相似的配置我就略过了,我们看下主要异同的地方。首先是apiVersion, 这里需要定义为apps/v1, 其次是kind,我们需要定义为Deployment, 也就是以Deployment 的形式部署Pods。replicas被指定为5,说明我希望有5个pods可以被运行,之后就是matchLabels,这里您需要指定labels,这里我指定了个app: newnginx。需要注意的是再template下也有个labels,那个labels是指pods的labels。
Rolling updates 以及 Rollbacks
考虑下这个情景,我们都希望我们的应用程序一直保持运行状态,且一直保持高可用状态。同时,开发者还会要求更新以及创建各种版本的应用程序。所以Rolling updates是一个能帮助我们开发者在开发期间对应用程序进行更新时不让应用程序出现downtime(停机时间)的特点。Rollbacks是一个让您的应用程序回到某个版本的回滚过程。
我们先修改下我们之前创建的nginx_service.yml文件,修改后的内容如下:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
type: NodePort
ports:
- port: 80
selector:
app: newnginx
对比后可以知道,我只是修改了selector的内容。
此时您如果打开浏览器NodePort 地址访问您的nginx应用程序,出现的结果应该和您之前看到的没什么不同。
接下来我们修改下nginx_deployment.yml的内容
piVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 5
selector:
matchLabels:
app: newnginx
template:
metadata:
labels:
app: newnginx
spec:
containers:
- name: my-nginx
image: anjucoursera1/nginxcourseraapp
ports:
- containerPort: 80
在上面我们修改所用到的image。然后我们等待所有的pods都更新完成。
您可以通过这条命令查看更新的进度
kubectl get deployment
当输出如下时,说明更新完毕:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 5/5 5 5 67m
在没更新完成之前,您刷新浏览器应该显示的都是未更新前的内容。在更新完后,您的输出应该如下:
尝试下Rollbacks
我们可以让应用程序的版本回到旧版
输入以下命令:
kubectl rollout history deploy nginx-deployment
输出应该如下:
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
此时我们输入下列命令可以将应用程序回归到旧版:
kubectl rollout undo deploy nginx-deployment --to-revision-1
输出是:
deployment.apps/nginx-deployment rolled back
回退完成后,此时刷新浏览器,便可以看到旧版内容了。
连载就到这里结束了。谢谢您能看到这里。