三种常见的项目发布方式:
蓝绿发布:
金丝雀发布(灰度发布):
滚动发布:
应用程序升级,面临的最大的问题,就是新旧业务的更换,立项--定稿--需求发布--开发--测试--发布,测试之后上线,再完美也会有文题,为了不让发生的问题影响所有用户,上述的三种发布方式
蓝绿发布:
把应用服务集群标记为两个组,分为蓝组和绿组,先升级蓝组,要把蓝组从负载均衡当中移除,绿组继续提供服务,蓝组升级完毕,再把绿组从负载均衡当中移除,绿组升级,然后都加入回负载均衡当中去,完成对外服务
蓝绿发布的特点:
- 一旦出现问题,问题的影响范围很大
- 发布策略简单
- 基于现在的云计算微服务,用户无感知
- 升级和回滚比价方便
缺点:
- 在发布升级的过程中,只有一部分集群对外提供服务,可能会使得集群的负载能力下降,响应变慢,需要注意给集群增加负载能力(一般来说没什么特殊需求)
- 短时间内可能会浪费一定的资源成本
金丝雀发布(灰度发布):
Deployment控制器创建的服务,才可以使用这种发布方式,滚动更新,暂停,发布非过程中,暂时停止,只有一部分的pod先升级,其他的pod还是处于老的版本,只有一部分用户可以访问新的版本,绝大多数用户还是在老版本,确定无问题之后后,再把剩下的老版本,升级新的版本,把暂停取消,继续发布,如果有问题,可以立即回滚,暂停不是回滚,一旦取消暂停只能全部升级完成之后,再回滚
暂停之后不能回滚,必须全部更新完成之后,一起回滚回去
灰度发布的特点:
- 自动化要求比较高,对运维人员要求比较高
- 方便发现问题,及时解决,影响范围比较小
- 用户无感知,可以实现一个平滑过渡,比较节约资源
- 发布策略比较复杂
- 不易回滚,必须要全部发布成功之后才能回滚
滚动更新:是的deployment的默认方式,
演示
创建:
kubectl set image deployment nginx nginx=nginx:1.24 --record && kubectl rollout pause deployment nginx
等待一段时间:
查看回滚状态:
查看版本
回滚,只能全部升级完成之后,一起回滚
回滚:
查看版本
声明式资源管理方法(YAML文件):
特点:
- 适合对资源的修改操作,这是陈述式的弱项
- 声明式管理依赖于YAML文件,所有的内容都在YAML文件之中
- 编辑好的YAML文件,还是要依靠陈述式的命令,发布到k8s集群当中
如何发布呢,三种方式:
Create:只能创建,不能更新,从指定YAML文件中读取配置,创建服务,不能更新
Apply -f:既然可以创建资源对象也可以更新资源对象,如果YAML文件更改了,apply可以直接更新资源对象
Delete -f:删除YAML文件当中的声明的资源对象
YAML文件如何生成呢:
- 手打
- 可以根据已有的资源
演示根据已有的资源:
强制执行yml文件--force
演示service文件
同理pod也行:
常见到的YAML文件格式:
- deployment的YAML文件 daemonset statefulset
- Service的YAML文件
- 不急于控制器的pod的YAML文件
K8s当中支持两种声明式的资源管理方式:
- YAML格式,用于配置和管理资源对象
- Json格式,主要用于在api接口间的消息传递
Command
Args
定义容器运行的命令参数,类型与docker的CMD和entrypoint
Args可以理解docker中的cmd,给command传参
Command和args都会覆盖原容器的标准输出(CMD和ENTRYPOINT)
YAML文件怎么写:
查看创建格式
编写yml文件:
查看模板:
Deployment的YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
namespace: guoqi
labels:
wdf: nginx1
spec:
replicas: 3
selector:
matchLabels:
wdf: nginx1
template:
metadata:
labels:
wdf: nginx1
spec:
containers:
- name: nginx
image: nginx:1.10
# posts:
# - containerPort: 80
查看service模板:
kubectl explain service
service的yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: guoqi
labels:
wdf: nginx1
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
wdf: nginx1
Pod的YAML
查看格式
apiVersion: v1
kind: Pod
metadata:
name: centos1
namespace: guoqi
spec:
restartPolicy: Always
containers:
- name: centos
image: centos:7
详细查看信息:
kubectl describe pod -n guoqi centos1
查看日志:
kubectl logs -n guoqi centos1
Command;Args
定义容器运行的命令参数,类似与docker的CMD和ENTRYPOINT
Args可以理解docker中的cmd,给command传参
Command和args都会覆盖原容器的标准输出(CMD和ENTRYPOINT)
如何定义多条命令:
建议格式,多个命令写在一行
不能同时有两个command,command和ARG不能同时出现,除非你要传参,都会容器的标准输出(CMD和enterpoint)
总结今天的内容:
三种发布方式
蓝绿发布:
灰度发布(重点):,基于deployment的滚动发布方式,使用了一个机制pause,resume继续,回滚:所有都升级完成之后才可以回滚
滚动发布:
三种YAML格式:
Deployment:
Service:
Pod: