目录
- Replication Controller和ReplicaSet
- 无状态服务Deployment概念
- Deployment的创建
- Deployment的更新
- Deployment的回滚
- Deployment扩容和缩容
- Deployment更新暂停和恢复
- Deployment更新注意事项
- 有状态应用管理StatefulSet概念
- 创建一个StatefulSet应用
Replication Controller和ReplicaSet
Replication Controller(复制控制器,RC)和ReplicaSet(复制集,RS)是两种简单部署Pod的方式。在生产环境中,主要使用更高级的Deployment等方式进行Pod的管理和部署。
- Replication Controller
- ReplicaSet
Replication Controller
Replication Controller(简称RC)可确保Pod副本数达到期望值,也就是RC定义的数量。换句话说,Replication Controller可确保一个Pod或一组同类Pod总是可用。
如果存在的Pod大于设定的值,则Replication Controller将终止额外的Pod。如果太小,Replication Controller将启动更多的Pod用于保证达到期望值。与手动创建Pod不同的是,用Replication Controller维护的Pod在失败、删除或终止时会自动替换。因此即使应用程序只需要一个Pod,也应该使用Replication Controller或其他方式管理。Replication Controller类似于进程管理程序,但是Replication Controller不是监视单个节点上的各个进程,而是监视多个节点上的多个Pod。
定义一个Replication Controller的示例如下。
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
ReplicaSet
ReplicaSet是支持基于集合的标签选择器的下一代Replication Controller,它主要用作Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持标签选择器。在实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等。
定义一个ReplicaSet的示例如下:
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
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
# If your cluster config does not include a dns service, then to
# instead access environment variables to find service host
# info, comment out the 'value: dns' line above, and uncomment the
# line below.
# value: env
ports:
- containerPort: 80
查看一下使用Deployment来自动管理ReplicaSet
[root@k8s-master01 ~]# kubectl get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 2d
[root@k8s-master01 ~]# kubectl get deploy -n kube-system metrics-server -oyaml
message: ReplicaSet "metrics-server-64c6c494dc" has successfully progressed.
查看ReplicaSet
[root@k8s-master01 ~]# kubectl get rs -n kube-system
NAME DESIRED CURRENT READY AGE
metrics-server-64c6c494dc 1 1 1 2d
如果我们改动了一个参数,做了滚动升级,它就会重新生成一个rs,这个rs可以被回滚,而rc是不支持回滚的,我们一般使用高级的功能比如Deployment和DaemonSet去管理我们的rc或rs,再通过rs管理我们的pod
Replication Controller和ReplicaSet的创建删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet进行管理Pod。
无状态服务Deployment概念
用于部署无状态的服务,这个最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。
Deployment的创建
手动创建
[root@k8s-master01 ~]# kubectl create deployment nginx --image=nginx:1.15.2
deployment.apps/nginx created
导出到nginx-deploy.yaml
[root@k8s-master01 ~]# kubectl get deployment nginx -o yaml > nginx-deploy.yaml
查看nginx-deploy.yaml
[root@k8s-master01 ~]# vim nginx-deploy.yaml
删除status以下的内容,修改副本数
replicas: 2 #副本数
更新配置
[root@k8s-master01 ~]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx replaced
查看副本数
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-66bbc9fdc5-vtk4n 1/1 Running 0 16m
nginx-66bbc9fdc5-x87z5 1/1 Running 0 34s
以上是使用文件的方式管理,也可以使用edit
[root@k8s-master01 ~]# kubectl edit deploy nginx
# 把副本数改回1
replicas: 1
查看副本数
[root@k8s-master01 ~]# kubectl get po
NAME READY STATU