金丝雀就是灰度发布,一边发布新的版本,一边删除旧的版本,不会全部删除旧的版本
当所有新的版本没有问题,所有旧的版本全部下线
我们以普罗米修斯为例
安装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 在浏览器访问
部署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端口
强制走v2 新版本
请求头附加Region属性,则强制走v2
while sleep 0.2;do curl -H 'Region:always' http://192.168.10.108:31266&& echo "";done
当v2新版本测试没问题的话,就可以把v1的版本删除掉了