Kubernetes 不支持内置的蓝绿部署。目前最好的方式是创建新的 deployment,然后更新应用程序的service 以指向新的 deployment 部署的应用
部署绿色版本环境(充当第一版代码做的镜像运行的Pod)
[root@k8s-master1-60 deployment]# cat tomcat-lv.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-lv
namespace: default
labels:
app: tomcat-lv
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-lv
template:
metadata:
labels:
app: tomcat-lv
spec:
containers:
- image: janakiramm/myapp:v2
imagePullPolicy: IfNotPresent
name: tomcat-lv
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
periodSeconds: 5
tcpSocket:
port: 80
readinessProbe:
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
periodSeconds: 5
tcpSocket:
port: 80
resources:
limits:
cpu: '2'
memory: 4Gi
requests:
cpu: '1'
memory: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-lv
namespace: default
spec:
selector:
app: tomcat-lv
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
#执行部署
[root@k8s-master1-60 deployment]# kubectl apply -f tomcat-lv.yaml
#查看创建的pod标签
[root@k8s-master1-60 deployment]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
tomcat-lv-55f8644f5-j5sjc 1/1 Running 0 5h58m app=tomcat-lv,pod-template-hash=55f8644f5
#查看service信息
[root@k8s-master1-60 deployment]# kubectl get svc tomcat-lv
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat-lv NodePort 10.99.3.149 <none> 80:31232/TCP 30s
#浏览器访问绿板本:http://集群节点IP:31232 显示如下
部署蓝版本环境(充当第二版代码做的镜像运行的Pod)
[root@k8s-master1-60 deployment]# cat tomcat-lan.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-lan
namespace: default
labels:
app: tomcat-lan
spec:
replicas: 1
selector:
matchLabels:
app: tomcat-lan
template:
metadata:
labels:
app: tomcat-lan
spec:
containers:
- image: janakiramm/myapp:v1
imagePullPolicy: IfNotPresent
name: tomcat-lan
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
periodSeconds: 5
tcpSocket:
port: 80
readinessProbe:
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 1
periodSeconds: 5
tcpSocket:
port: 80
resources:
limits:
cpu: '2'
memory: 4Gi
requests:
cpu: '1'
memory: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-lan
namespace: default
spec:
selector:
app: tomcat-lan
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
#执行部署
[root@k8s-master1-60 deployment]# kubectl apply -f tomcat-lan.yaml
[root@k8s-master1-60 deployment]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
tomcat-lan-694444f9d4-2xnt7 1/1 Running 0 6h4m app=tomcat-lan,pod-template-hash=694444f9d4
tomcat-lv-55f8644f5-j5sjc 1/1 Running 0 6h app=tomcat-lv,pod-template-hash=55f8644f5
#可以看到两个版本都存在了
#查看service信息
[root@k8s-master1-60 deployment]# kubectl get svc tomcat-lan
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat-lan NodePort 10.99.77.85 <none> 80:30557/TCP 6h4m
#浏览器访问蓝板本 http://集群节点IP:30557 显示如下
切换tomcat-lv的service的选择标签切换到蓝版本的标签
[root@k8s-master1-60 deployment]# kubectl set selector service tomcat-lv app=tomcat-lan
#访问测试 http://集群节点IP:31232 显示如下
原先绿色版本已经正式切换蓝色版本的Pod上面