k8s之代码发布

1 常见的发布策略

- 灰度发布/金丝雀发布
	描述:
		升级过程中,先升级一部分服务,在逐步升级其他的。
		
	特点:
		在升级过程中存在旧版本和新版本共存的现象。

- 蓝绿部署 
	描述:
		同时有两套环境。
		
	特点:
		只有一套环境对外提供服务,另一套环境空跑。

- A/B测试 
	描述:
		相比于灰度发布而言,A/B测试的发布策略更加细粒度,比如基于用户实现精准控制升级。
		
	特点:
		可以向让一部分用户升级,而后在逐步升级。

2 灰度发布

	- A.使用deploy部署旧版本;
	- B.Server关联旧版本;
	- C.使用deploy部署新版本;
	- D.逐渐修改新旧版本的副本数量来达到灰度发布的效果;
		2.1 部署旧版本 
[root@master231 01-huidu]# cat 01-deploy-old.yaml
apiVersion:  apps/v1
kind: Deployment
metadata:
  name: deploy-old
spec:
  replicas: 3
  selector:
    matchLabels:
      apps: xiuxian
  template:
    metadata:
      labels:
        apps: xiuxian
        version: v1
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/cmy-k8s/apps:v1
        name: c1
[root@master231 01-huidu]# 
[root@master231 01-huidu]# kubectl apply -f  01-deploy-old.yaml

		2.2 svc关联旧版本 
[root@master231 01-huidu]# cat 02-svc-xiuxian.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-xiuxian
spec:
  ports:
  - port: 80	
  selector:
    apps: xiuxian
  type: ClusterIP

		2.3 部署新版本 
[root@master231 01-huidu]# cat 03-deploy-new.yaml
apiVersion:  apps/v1
kind: Deployment
metadata:
  name: deploy-new
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: xiuxian
  template:
    metadata:
      labels:
        apps: xiuxian
        version: v2
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/cmy-k8s/apps:v2
        name: c1



kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
deploy-new-845ffc675b-gw25f   1/1     Running   0          3m50s   10.100.140.93    worker233   <none>           <none>
deploy-new-845ffc675b-qxqvj   1/1     Running   0          2m35s   10.100.203.163   worker232   <none>           <none>
deploy-old-568cf47956-tzmxz   1/1     Running   0          5m33s   10.100.203.160   worker232   <none>           <none>
deploy-old-568cf47956-wsbcb   1/1     Running   0          5m33s   10.100.140.92    worker233   <none>           <none>

逐步修改新旧pod数量,直到更新完成


3 蓝绿部署

1.蓝绿部署实现思路
	- A.部署老版本;
	- B.svc指向老版本的Pod;
	- C.部署新版本;
	- D.svc指向新版本的Pod;
	2.1 部署旧版本
[root@master231 02-blue-green]# cat 01-deploy-old.yaml
apiVersion:  apps/v1
kind: Deployment
metadata:
  name: deploy-old
spec:
  replicas: 3
  selector:
    matchLabels:
      apps: blue
  template:
    metadata:
      labels:
        apps: blue
        version: v1
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/cmy-k8s/apps:v1
        name: c1

2.2 svc关联旧版本
[root@master231 02-blue-green]# cat 02-svc-xiuxian.yaml 
apiVersion: v1
kind: Service
metadata:
  name: svc-xiuxian
spec:
  ports:
  - port: 80	
  selector:
    apps: blue
  type: ClusterIP

kubectl apply -f svc-xiuxian.yaml
service/svc-xiuxian created
[root@master-231 /oldboyedu/manifests/update/02-blue-greeen]# kubectl get svc,pod
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/kubernetes    ClusterIP   10.200.0.1       <none>        443/TCP   7d22h
service/svc-xiuxian   ClusterIP   10.200.197.116   <none>        80/TCP    8s

NAME                              READY   STATUS    RESTARTS   AGE
pod/deploy-old-6f675ff948-gmpbt   1/1     Running   0          53s
pod/deploy-old-6f675ff948-khtvh   1/1     Running   0          53s
pod/deploy-old-6f675ff948-nqzn5   1/1     Running   0          53s


		2.3 部署新版本 
[root@master231 02-blue-green]# cat 03-deploy-new.yaml 
apiVersion:  apps/v1
kind: Deployment
metadata:
  name: deploy-new
spec:
  replicas: 3
  selector:
    matchLabels:
      apps: green
  template:
    metadata:
      labels:
        apps: green
        version: v2
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/cmy-k8s/apps:v2
        name: c1

 kubectl get svc,pod -o wide
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes    ClusterIP   10.200.0.1       <none>        443/TCP   7d22h   <none>
service/svc-xiuxian   ClusterIP   10.200.197.116   <none>        80/TCP    107s    apps=blue

NAME                              READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/deploy-new-5b64647c7f-h46pj   1/1     Running   0          11s     10.100.140.97    worker233   <none>           <none>
pod/deploy-new-5b64647c7f-sncxz   1/1     Running   0          28s     10.100.140.96    worker233   <none>           <none>
pod/deploy-new-5b64647c7f-wmk6r   1/1     Running   0          11s     10.100.203.168   worker232   <none>           <none>
pod/deploy-old-6f675ff948-gmpbt   1/1     Running   0          2m32s   10.100.140.94    worker233   <none>           <none>
pod/deploy-old-6f675ff948-khtvh   1/1     Running   0          2m32s   10.100.140.95    worker233   <none>           <none>
pod/deploy-old-6f675ff948-nqzn5   1/1     Running   0          2m32s   10.100.203.159   worker232   <none>           <none>

切换流量至新版本
kubectl describe -f svc-xiuxian.yaml
Name:              svc-xiuxian
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          apps=green
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.197.116
IPs:               10.200.197.116
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.100.140.96:80,10.100.140.97:80,10.100.203.168:80
Session Affinity:  None
Events:            <none>

注意,同时只有一个版本对外提供服务

4 CICD


#!/bin/bash

# 登录 Harbor(确保密码安全,不要硬编码)
docker login -u admin -p 1 harbor.cmy.cn 

function update() {
    # 检查 Harbor 认证
    docker login -u admin -p 1 harbor.cmy.cn 

    # 构建并推送镜像
    docker build -t harbor.cmy.cn/yiliao/app:${gittag} .
    docker push harbor.cmy.cn/yiliao/app:${gittag} 


    export KUBECONFIG=/root/admin.conf

    

    # 更新 Deployment
    kubectl set image deploy yiliao yiliao=harbor.cmy.cn/yiliao/app:${gittag} 

    # 检查状态
    kubectl get svc,deploy,pods -o wide
}

function rollback() {

    export KUBECONFIG=/root/admin.conf

    kubectl set image deploy yiliao yiliao=harbor.cmy.cn/yiliao/app:${gittag} 

    # 检查状态
    kubectl get svc,deploy,pods -o wide
}

case "$choose" in
    update)    update ;;
    rollback)  rollback ;;
esac
上一篇
下一篇