蓝绿发布
不关闭旧环境的情况下启动新环境,通过更新service将流量切换到新环境上。
发布更新
1、在原有的deployment运行基础上,新建deployment的yaml文件,文件内容为新版本标签及应用镜像‘
2、启动新deployment的yaml
3、更改原service的yaml
4、通过命令更新启动新service
此时新旧两个deployment都处于启动状态,但service发布的的新的deployment下pod
回退更新
通过命令指定service到旧版本
验证
具体操作
============================================================
旧deployment如下
#vim codeus-abc-deployment-v3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: codeus-abc-v3
namespace: codeus
spec:
replicas: 3
selector:
matchLabels:
project: codeus
app: abc
version: v3
template:
metadata:
labels:
project: codeus
app: abc
version: v3
spec:
imagePullSecrets:
- name: registry-key
containers:
- name: abc
image: xxxxx/codeus-abc/codeus-abc-k8s-cs:latest
imagePullPolicy: Always
ports:
- containerPort: 8088
name: web
protocol: TCP
resources:
limits:
cpu: 600m
memory: 2Gi
requests:
cpu: 300m
memory: 100Mi
livenessProbe:
httpGet:
path: /
port: 8088
initialDelaySeconds: 180
timeoutSeconds: 20
readinessProbe:
httpGet:
path: /
port: 8088
initialDelaySeconds: 180
timeoutSeconds: 20
volumeMounts:
- name: codes
mountPath: /root/codes
- name: host-time
mountPath: /etc/localtime
volumes:
- name: codes
hostPath:
path: /data/codeus-abc/codes
- name: host-time
hostPath:
path: /etc/localtime
启动
kubectl create -f codeus-abc-deployment-v3.yaml
kubectl create -f codeus-abc-service-v3.yaml
===========================================================================
检查一切没有问题后开始做更新操作
===========================================================================
新deployment
# cat codeus-abc-deployment-v4.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: codeus-abc-v4 #这里发生变化
namespace: codeus
spec:
replicas: 3
selector:
matchLabels:
project: codeus
app: abc
version: v4 #这里发生变化
template:
metadata:
labels:
project: codeus
app: abc
version: v4 #还有这里发生变化
spec:
imagePullSecrets:
- name: registry-key
containers:
- name: abc
image: xxxxx/codeus-abc/codeus-abc-k8s-cs:latest
imagePullPolicy: Always
ports:
- containerPort: 8088
name: web
protocol: TCP
resources:
limits:
cpu: 600m
memory: 2Gi
requests:
cpu: 300m
memory: 100Mi
livenessProbe:
httpGet:
path: /
port: 8088
initialDelaySeconds: 180
timeoutSeconds: 20
readinessProbe:
httpGet:
path: /
port: 8088
initialDelaySeconds: 180
timeoutSeconds: 20
volumeMounts:
- name: codes
mountPath: /root/codes
- name: host-time
mountPath: /etc/localtime
volumes:
- name: codes
hostPath:
path: /data/codeus-abc/codes
- name: host-time
hostPath:
path: /etc/localtime
启动新的deployment
kubectl create -f codeus-abc-deployment-v4.yaml
此时有新旧两套deployment在运行
执行更新,将service切换到新的deployment上
# kubectl -n codeus patch service abc -p '{"spec":{"selector":{"version":"v4"}}}'
service/abc patched 有此输出表示更新完成
-n codeus 用于指定命名空间
回退更新
# kubectl -n codeus patch service abc -p '{"spec":{"selector":{"version":"v3"}}}'
service/abc patched
运行一段时间后,确认新版本没有问题后删除旧版本,以节省NODE资源
# kubectl -n codeus delete deploy codeus-abc-v3
deployment.extensions "codeus-abc-v3" deleted
更新结束。。。
可以用jenkins发布
下面是一段在jenkins中构建后操作的一部分
整体流程就是:
拉取代码 > 打包 > 发送包到指定位置 > 执行构建后操作
> 制作镜像
> 上传镜像
> 通过更改后的yaml文件创建新pod
cp $de_yaml codeus-deployment-$W_VERSION$BUILD_NUMBER.yaml
sed -i "s/codeus-v1/codeus-$W_VERSION$BUILD_NUMBER/g" codeus-deployment-$W_VERSION$BUILD_NUMBER.yaml
sed -i "s/version: v1/version: $W_VERSION$BUILD_NUMBER/g" codeus-deployment-$W_VERSION$BUILD_NUMBER.yaml
sed -i "s#codeus-image#docker.wecode123.com/codeus_k8s/codeus-$W_VERSION$BUILD_NUMBER#g" codeus-deployment-$W_VERSION$BUILD_NUMBER.yaml
/opt/kubernetes/bin/kubectl create -f codeus-deployment-$W_VERSION$BUILD_NUMBER.yaml