k8s 金丝雀发布

金丝雀就是灰度发布,一边发布新的版本,一边删除旧的版本,不会全部删除旧的版本

当所有新的版本没有问题,所有旧的版本全部下线

我们以普罗米修斯为例

安装ingress

kubectl apply -f http://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/k8s/download/ingress-nginx-1.5.1.yaml

部署v1版本

一个文件吧pod svc 和cm 都部署了

cat > deploy-prometheus-v1.yaml <<-'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      version: v1
  template:
    metadata:
      labels:
        app: prometheus
        version: v1
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus
        ports:
        - name: http
          protocol: TCP
          containerPort: 9090
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: config
          subPath: prometheus.yml
      volumes:
      - name: config
        configMap:
          name: prometheus-v1
---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: prometheus
    version: v1
  name: prometheus-v1
data:
  prometheus.yml: |-
    # 测试v1
    global:
      scrape_interval: 15s 
      evaluation_interval: 15s 
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        static_configs:
          - targets: ["localhost:9090"]
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-v1
spec:
  type: ClusterIP
  ports:
  - port: 8000
    protocol: TCP
    name: http
    targetPort: 9090
  selector:
    app: prometheus
    version: v1
EOF

执行

kubectl apply  -f deploy-prometheus-v1.yaml 

查看pod svc cm

kubectl get pods -o wide

kubectl get svc

kubectl get cm

部署v2版本 

主要是把标签和名字改成v2其他的内容都是不变的

cat > deploy-prometheus-v2.yaml <<-'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      version: v2
  template:
    metadata:
      labels:
        app: prometheus
        version: v2
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus
        ports:
        - name: http
          protocol: TCP
          containerPort: 9090
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: config
          subPath: prometheus.yml
      volumes:
      - name: config
        configMap:
          name: prometheus-v2
---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: prometheus
    version: v2
  name: prometheus-v2
data:
  prometheus.yml: |-
    # 测试v2
    global:
      scrape_interval: 15s 
      evaluation_interval: 15s 
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        static_configs:
          - targets: ["localhost:9090"]
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-v2
spec:
  type: ClusterIP
  ports:
  - port: 8000
    protocol: TCP
    name: http
    targetPort: 9090
  selector:
    app: prometheus
    version: v2
EOF

 执行

kubectl apply  -f deploy-prometheus-v2.yaml

查看pod svc cm

kubectl get pods -o wide

kubectl get svc

kubectl get cm

 

部署ingress-v1版本

就是可以通过浏览器访问service的端口

service下面的name 一定要绑定service的name

port的number 一定要和service.port端口一样

创建ingress文件 

cat > ingress-prometheus-v1.yaml <<-'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-prometheus-v1
  annotations:
    #直接映射至根路径
    ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
   - http:
      paths:
      - backend:
          service:
            name: prometheus-v1
            port: 
              number: 8000
        path: /
        pathType: Prefix
EOF

执行

kubectl apply -f ingress-prometheus-v1.yaml
kubectl get ingress

 然后用ingress提供的端口访问,也通过节点的ip 在浏览器访问

http://192.168.10.108:31266/

部署ingress-v2版本

v2版本就是我们的新的版本,在这里开启灰度发布

内容都一样,就是添加了annotations下面的一些配置,和名字改了改

cat > ingress-prometheus-v2.yaml <<-'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-prometheus-v2
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    #开启灰度发布
    nginx.ingress.kubernetes.io/canary: "true"
    #如果请求头附加Region属性,则强制走v2
    nginx.ingress.kubernetes.io/canary-by-header: "Region"
    #v2版本权重
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: prometheus-v2
            port: 
              number: 8000
        path: /
        pathType: Prefix
EOF

执行

kubectl apply -f ingress-prometheus-v2.yaml 

查看ingress

kubectl get ingress

可以通过任意节点的ip 在浏览器访问 ingress提供的31266端口

http://192.168.10.107:31266/

强制走v2 新版本

请求头附加Region属性,则强制走v2

while  sleep 0.2;do curl  -H 'Region:always' http://192.168.10.108:31266&& echo "";done

 

当v2新版本测试没问题的话,就可以把v1的版本删除掉了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值