1.2. 本文为了快速创建应用,使用集群的
admin
账号登录,在项目中创建工作负载和服务时可通过
编辑 yaml
的方式,或使用 KubeSphere 右下角的
工具箱
打开
web kubectl
并使用以下命令和 yaml 文件创建一个 Production 版本的应用并暴露给集群外访问。如下创建 Production 版本的
deployment
和
service
。
$ kubectl apply -f production.yaml -n ingress-demo
deployment.extensions/production created
service/production created
其中用到的 yaml 文件如下:
production.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: production
labels:app: production
spec:replicas:1selector:matchLabels:app: production
template:metadata:labels:app: production
spec:containers:-name: production
image: mirrorgooglecontainers/echoserver:1.10ports:-containerPort:8080env:-name: NODE_NAME
valueFrom:fieldRef:fieldPath: spec.nodeName
-name: POD_NAME
valueFrom:fieldRef:fieldPath: metadata.name
-name: POD_NAMESPACE
valueFrom:fieldRef:fieldPath: metadata.namespace
-name: POD_IP
valueFrom:fieldRef:fieldPath: status.podIP
apiVersion: v1
kind: Service
metadata:name: production
labels:app: production
spec:ports:-port:80targetPort:8080protocol: TCP
name: http
selector:app: production
1.3. 创建 Production 版本的应用路由 (Ingress)。
$ kubectl apply -f production.ingress -n ingress-demo
ingress.extensions/production created
其中用到的 yaml 文件如下:
production.ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: production
annotations:kubernetes.io/ingress.class: nginx
spec:rules:-host: kubesphere.io
http:paths:-backend:serviceName: production
servicePort:80
2.2. 访问 Production 版本的应用需确保当前项目已开启了网关,在
外网访问
下打开网关,类型为
NodePort
。
2.3. 如下访问 Production 版本的应用,注意以下命令需要在 SSH 客户端中执行。
$ curl --resolve kubesphere.io:30205:192.168.0.88 kubesphere.io:30205
# 注意,加上 --resolve 参数则无需在本地配置 /etc/hosts 中的 IP 与域名映射,否则需要预先在本地配置域名映射,其中 192.168.0.88 是项目内的网关地址。
Hostname: production-6b4bb8d58d-7r889
Pod Information:
node name: ks-allinone
pod name: production-6b4bb8d58d-7r889
pod namespace: ingress-demo
pod IP: 10.233.87.165
Server values:
server_version=nginx: 1.12.2 - lua: 10010
Request Information:
client_address=10.233.87.225
method=GET
real path=/
query=request_version=1.1request_scheme=http
request_uri=http://kubesphere.io:8080/
Request Headers:
accept=*/*
host=kubesphere.io:30205
user-agent=curl/7.29.0
apiVersion: extensions/v1beta1
x-forwarded-for=192.168.0.88
x-forwarded-host=kubesphere.io:30205
x-forwarded-port=80
x-forwarded-proto=http
x-original-uri=/
x-real-ip=192.168.0.88
x-request-id=9596df96e994ea05bece2ebbe689a2cc
x-scheme=http
Request Body:
-no body in request-
第三步:创建 Canary 版本
参考将上述 Production 版本的
production.yaml
文件,再创建一个 Canary 版本的应用,包括一个 Canary 版本的
deployment
和
service
(为方便快速演示,仅需将
production.yaml
的 deployment 和 service 中的关键字
production
直接替换为
canary
,实际场景中可能涉及业务代码变更)。
第四步:Ingress-Nginx Annotation 规则
基于权重 (Weight)
基于权重的流量切分的典型应用场景就是
蓝绿部署
,可通过将权重设置为 0 或 100 来实现。例如,可将 Green 版本设置为主要部分,并将 Blue 版本的入口配置为 Canary。最初,将权重设置为 0,因此不会将流量代理到 Blue 版本。一旦新版本测试和验证都成功后,即可将 Blue 版本的权重设置为 100,即所有流量从 Green 版本转向 Blue。