Канарскую публикацию можно реализовать, указав аннотацию, поддерживаемую Nginx Ingress, для ресурса Ingress.
Для сервиса необходимо создать два Ingress, один из которых — обычный Ingress , а другой — nginx.ingress.kubernetes.io/canary: "true"
Ingress с фиксированной аннотацией, называемый Canary Ingress.
Canary Ingress обычно представляет собой новую версию сервиса, и выпуски canary в различных сценариях могут быть реализованы путем настройки вместе с аннотациями стратегий сегментации трафика.
Ниже приводится подробное введение в соответствующие аннотации:
-
nginx.ingress.kubernetes.io/canary-by-header
Указывает, что если указанное имя заголовка включено в заголовок запроса и значение равноalways
, запрос будет перенаправлен в соответствующую серверную службу, определенную Ingress. Если значениеnever
не пересылается, его можно использовать для отката к старой версии. Если это любое другое значение, аннотация игнорируется. -
nginx.ingress.kubernetes.io/canary-by-header-value
Аннотация может использоватьсяcanary-by-header
в качестве дополнения, а заголовок запроса может быть указан как пользовательское значение, включая, помимо прочего,always
илиnever
. Если значение заголовка запроса соответствует указанному настраиваемому значению, запрос будет перенаправлен в соответствующую серверную службу, определенную Ingress. Если это любое другое значение, аннотация будет игнорироваться. -
nginx.ingress.kubernetes.io/canary-by-header-pattern
Как иcanary-by-header-value
в случае с , разница состоит в том, что в аннотации используются регулярные выражения для сопоставления значения заголовка запроса, а не просто для фиксации определенного значения. Если аннотацияcanary-by-header-value
существует одновременно, она будет игнорироваться. -
nginx.ingress.kubernetes.io/canary-by-cookie
Подобноcanary-by-header
, эта аннотация используется для файлов cookie, поддерживает толькоalways
иnever
. -
nginx.ingress.kubernetes.io/canary-weight
Указывает процент трафика, выделенного Canary Ingress, диапазон значений: [0–100]. Например, если для него установлено значение 10, это означает, что 10 % трафика будет выделено внутренней службе, соответствующей Canary Ingress. - Правила Canary сортируются по приоритету следующим образом: canary-по заголовку -> canary-by-cookie -> canary-weight.
В зависимости от различных сценариев существует четыре типа выпусков в оттенках серого:
//第一种,所有的请求都会被转发到灰度(Canary)版本
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "always"
//第二种,所有的请求都不会被转发到灰度(Canary)版本
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "never"
//第三种,如果请求的header头包含"user-id: user_1",该请求会被转发到灰度(Canary)版本
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "user_id"
nginx.ingress.kubernetes.io/canary-by-header-value: "user_1"
//第四种,如果请求的header头包含"user-id: user_2"或"user-id: user-3"或"user-id: user4",该请求会被转发到灰度(Canary)版
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "user_id" #在networking.k8s.io/v1中,canary-by-header的值尽量不用使用下划线“_”。如果使用了,请求头中要使用中横线“-”代替。
nginx.ingress.kubernetes.io/canary-by-header-pattern: "user_2|user-3|user4"
1. Разверните службу версий синей среды.
1、Карта конфигурации
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-blue-config
data:
nginx.conf: |-
worker_processes 1;
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 1024;
}
http {
ignore_invalid_headers off;
server {
listen 80;
location / {
access_by_lua '
local header_str = ngx.say("blue")
';
}
}
}
2、Развертывание
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-blue
labels:
dce.daocloud.io/app: nginx-blue
annotations:
dce.daocloud.io/last-replicas: '1'
deployment.kubernetes.io/revision: '3'
kubernetes.io/change-cause: update YAML
spec:
replicas: 1
selector:
matchLabels:
dce.daocloud.io/component: nginx-blue
template:
metadata:
name: nginx-blue
labels:
dce.daocloud.io/app: nginx-blue
dce.daocloud.io/component: nginx-blue
annotations:
dce.daocloud.io/parcel.egress.burst: '0'
dce.daocloud.io/parcel.egress.rate: '0'
dce.daocloud.io/parcel.ingress.burst: '0'
dce.daocloud.io/parcel.ingress.rate: '0'
dce.daocloud.io/parcel.net.type: calico
spec:
volumes:
- name: nginx-blue-config
configMap:
name: nginx-blue-config
defaultMode: 420
containers:
- name: nginx-blue
image: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'
resources:
limits:
cpu: 500m
memory: '314572800'
requests:
cpu: 200m
memory: '314572800'
volumeMounts:
- name: nginx-blue-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
3、Сервис
kind: Service
apiVersion: v1
metadata:
name: nginx-blue-default
labels:
dce.daocloud.io/app: nginx-blue
annotations:
io.daocloud.dce.serviceSelectorType: service
spec:
ports:
- name: nginx-nginx-default-80680-80
protocol: TCP
port: 80
targetPort: 80
nodePort: 31046
selector:
dce.daocloud.io/component: nginx-blue
clusterIP: 172.31.69.137
type: NodePort
sessionAffinity: None
externalTrafficPolicy: Cluster
4. Измените содержимое модуля.
cd /usr/local/openresty/nginx/html/
ls
50x.html index.html
echo "Hello Blue" > index.html
cat index.html
Hello Blue
2. Разверните службу версий зеленой среды.
1、Карта конфигурации
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-green-config
data:
nginx.conf: |-
worker_processes 1;
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 1024;
}
http {
ignore_invalid_headers off;
server {
listen 80;
location / {
access_by_lua '
local header_str = ngx.say("green")
';
}
}
}
2、Развертывание
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-green
labels:
dce.daocloud.io/app: nginx-green
annotations:
deployment.kubernetes.io/revision: '5'
kubernetes.io/change-cause: update YAML
spec:
replicas: 1
selector:
matchLabels:
dce.daocloud.io/component: nginx-green
template:
metadata:
name: nginx-green
labels:
dce.daocloud.io/app: nginx-green
dce.daocloud.io/component: nginx-green
env: green
annotations:
dce.daocloud.io/parcel.egress.burst: '0'
dce.daocloud.io/parcel.egress.rate: '0'
dce.daocloud.io/parcel.ingress.burst: '0'
dce.daocloud.io/parcel.ingress.rate: '0'
dce.daocloud.io/parcel.net.type: calico
dce.daocloud.io/parcel.net.value: default-ipv4-ippool
spec:
volumes:
- name: nginx-green-config
configMap:
name: nginx-green-config
defaultMode: 420
containers:
- name: nginx-green
image: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'
resources:
limits:
cpu: 500m
memory: '314572800'
requests:
cpu: 200m
memory: '314572800'
volumeMounts:
- name: nginx-green-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
3、Сервис
kind: Service
apiVersion: v1
metadata:
name: nginx-green-default
labels:
dce.daocloud.io/app: nginx-green
annotations:
io.daocloud.dce.serviceSelectorType: service
spec:
ports:
- name: nginx-nginx-default-15833-80
protocol: TCP
port: 80
targetPort: 80
nodePort: 35218
selector:
dce.daocloud.io/component: nginx-green
clusterIP: 172.31.207.22
type: NodePort
sessionAffinity: None
externalTrafficPolicy: Cluster
4. Измените содержимое модуля.
cd /usr/local/openresty/nginx/html/
ls
50x.html index.html
echo "Hello Green" > index.html
cat index.html
Hello Green
3. Установите вход
1. Вход в синюю среду
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: nginx-blue-ingress
labels:
dce.daocloud.io/app: nginx-blue
annotations:
nginx.ingress.kubernetes.io/use-port-in-redirects: 'true'
spec:
rules:
- host: nginx.ms-sit.xxxxxx.net
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
serviceName: nginx-blue-default
servicePort: 80
2. Зеленая среда Проникновение
Дело 1:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: nginx-green-ingress
labels:
dce.daocloud.io/app: nginx-green
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: 'true'
nginx.ingress.kubernetes.io/canary-by-header: env
nginx.ingress.kubernetes.io/canary-by-header-pattern: green
spec:
rules:
- host: nginx.ms-sit.xxxxxx.net
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
serviceName: nginx-green-default
servicePort: 80
Случай 2:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: nginx-green-ingress
ingress
labels:
dce.daocloud.io/app: nginx-green
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: 'true'
nginx.ingress.kubernetes.io/canary-by-header: Cookie
nginx.ingress.kubernetes.io/canary-by-header-pattern: bu=xxxcn|bu=xxxsg
spec:
rules:
- host: nginx.ms-sit.aswatson.net
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
serviceName: nginx-green-default
servicePort: 80
4. Тест
Дело 1:
Случай 2: