部署分为有状态部署和无状态部署,也就是有状态服务和无状态服务,而其区别在于是否有实时的数据需要存储。

无状态服务对象-Deployment,用于部署无状态的服务,一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。其可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。其服务部署结构模型是Deployment->ReplicaSet->Pod;Deployment工作在ReplicaSet之上,用于管理无状态应用,通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作,也就是说,Deployment 控制器实际操纵的是ReplicaSet 对象,而不是 Pod 对象

有状态服务-statefuleset用于管理有状态应用程序的工作负载API对象。比如在生产环境中,可以部署ElasticSearch集群、MongoDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等,其解决了有状态服务使用容器化部署的一个问题,保证pod的hostname重启/重建后不变,通过hostname维护关联数据。其服务部署结构模型是Statefulset->ReplicaSet->Pod;Statefulset也是工作在Replicaset之上,用于管理有状态服务。有状态部署的产品设置通无状态部署

Deployment

用于部署无状态的服务,这个最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

Deployment创建

手动创建:kubectl create deployment nginx --image=nginx:1.15.2

导出yaml 文件

kubectl get deployment nginx -oyaml > nginx-deploy.yaml

文件内容改动后可以replace 操作相当于重启

kubectl replace -f nginx-deploy.yaml

也可以直接在线编辑改动,用edit

kubectl edit deployment nginx

deployment 的更新

更改deployment 的镜像并记录:

kubectl set image deployment nginx nginx=nginx:1.15.3 --record

deployment 扩容与伸缩

#扩容
kubectl scale --replicas=3 deploy nginx
#缩容
kubectl scale --replicas=2 deploy nginx

StatefulSet有状态应该用管理

StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用StatefulSet部署方式的,可以给每个Eureka实例创建一个唯一且固定的标识符,并且每个Eureka实例无需配置多余的Service,其余Spring Boot应用可以直接通过Eureka的Headless Service即可进行注册。

Eureka的statefulset的资源名称是eureka,eureka-0 eureka-1 eureka-2

Service:headless service,没有ClusterIP eureka-svc

Eureka-0.eureka-svc.NAMESPACE_NAME eureka-1.eureka-svc …

statefulset

基本概念

StatefulSet主要用于管理有状态应用程序的工作负载API对象。比如在生产环境中,可以部署ElasticSearch集群、MongoDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。

和Deployment类似,一个StatefulSet也同样管理着基于相同容器规范的Pod。不同的是,StatefulSet为每个Pod维护了一个粘性标识。这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,在重新调度时也会保留,一般格式为StatefulSetName-Number。比如定义一个名字是Redis-Sentinel的StatefulSet,指定创建三个Pod,那么创建出来的Pod名字就为Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。而StatefulSet创建的Pod一般使用Headless Service(无头服务)进行通信,和普通的Service的区别在于Headless Service没有ClusterIP,它使用的是Endpoint进行互相通信,

Headless一般的格式为:

statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local

statefulset 注意事项

一般StatefulSet用于有以下一个或者多个需求的应用程序:
需要稳定的独一无二的网络标识符。
需要持久化数据。
需要有序的、优雅的部署和扩展。
需要有序的自动滚动更新。
如果应用程序不需要任何稳定的标识符或者有序的部署、删除或者扩展,应该使用无状态的控制器部署应用程序,比如Deployment或者ReplicaSet。

StatefulSet是Kubernetes 1.9版本之前的beta资源,在1.5版本之前的任何Kubernetes版本都没有。
Pod所用的存储必须由PersistentVolume Provisioner(持久化卷配置器)根据请求配置StorageClass,或者由管理员预先配置,当然也可以不配置存储。
为了确保数据安全,删除和缩放StatefulSet不会删除与StatefulSet关联的卷,可以手动选择性地删除PVC和PV(关于PV和PVC请参考2.2.12节)。
StatefulSet目前使用Headless Service(无头服务)负责Pod的网络身份和通信,需要提前创建此服务。
删除一个StatefulSet时,不保证对Pod的终止,要在StatefulSet中实现Pod的有序和正常终止,可以在删除之前将StatefulSet的副本缩减为0。

DaemonSet

daemonset 是什么?

DaemonSet:守护进程集,缩写为ds,在所有节点或者是匹配的节点上都部署一个Pod。

使用DaemonSet的场景

Ø 运行集群存储的daemon,比如ceph或者glusterd

Ø 节点的CNI网络插件,calico

Ø 节点日志的收集:fluentd或者是filebeat

Ø 节点的监控:node exporter

Ø 服务暴露:部署一个ingress nginx