一.理解标签与service中的endpoint
1.建立一个service
bash
[root@k8s-master services]# kubectl create service clusterip --tcp 80:80 testservice --dry-run=client -o yaml >> testservice.yaml
[root@k8s-master services]# vim testservice.yaml
-------------------------------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
labels:
app: testservice
name: testservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: webserver
type: ClusterIP
-------------------------------------------------------------------------------------------
[root@k8s-master services]# kubectl apply -f testservice.yaml
service/testservice created
[root@k8s-master ~]# watch -n 1 "kubectl describe svc testservice ; kubectl get pods --show-labels "
可以看到endpoints为空

2.建立pod并测试pod是否可以被testservice暴漏
当标签与service选择器上的标签不同,pod不会被暴漏
bash
[root@k8s-master services]# kubectl run webserver --image myapp:v1 --dry-run=client -o yaml > webserver.yml
[root@k8s-master services]# vim webserver.yml
-------------------------------------------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: myapp:v1
name: webserver
-------------------------------------------------------------------------------------------
[root@k8s-master services]# kubectl apply -f webserver.yml
查看监控,可以看到endpoints依旧为空

更改标签后看监控,可以看到endpoints出现了
bash
[root@k8s-master services]# kubectl label pods webserver app=webserver
pod/webserver labeled


二.利用service暴漏控制器
1.监控
bash
[root@k8s-master ~]# watch -n 1 "kubectl describe svc webservice ; kubectl get deploy --show-labels;kubectl get pods -o wide --show-labels "
2.生成控制器和service的组合yaml
bash
[root@k8s-master services]# kubectl create service clusterip --tcp 80:80 webservice --dry-run=client -o yaml >> webservice.yaml
[root@k8s-master services]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml >>webservice.yaml
[root@k8s-master services]# vim webservice.yaml
-----------------------------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: webcluster
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
-----------------------------------------------------------------------------------------
3.生成控制器和service
bash
[root@k8s-master services]# kubectl apply -f webservice.yaml

尝试访问

四.service的ipvs模式
1.在所有节点中安装ipvsadm工具
bash
[root@k8s-master ~]# for name in 100 10 20 200
> do
> ssh -l root 172.25.254.$name "dnf install ipvsadm -y"
> done
2.配置集群中的kube-proxy
bash
[root@k8s-master ~]# kubectl -n kube-system edit cm kube-proxy
59 mode: "ipvs"
configmap/kube-proxy edited

bash
[root@k8s-master services]# kubectl -n kube-system delete pods kube-proxy-2bq67 kube-proxy-fffq7 kube-proxy-rcdgn
pod "kube-proxy-2bq67" deleted from kube-system namespace
pod "kube-proxy-fffq7" deleted from kube-system namespace
pod "kube-proxy-rcdgn" deleted from kube-system namespace
效果

五.Sevice的ClusterIP 类型
1.clusterip
bash
[root@k8s-master services]# vim webservice.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: webcluster
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master services]# kubectl apply -f webservice.yaml
service/webservice created
deployment.apps/webcluster created

2.在k8s集群内部解析
bash
[root@k8s-master services]# kubectl -n kube-system get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
calico-typha ClusterIP 10.101.113.193 <none> 5473/TCP 46h
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 8d

3.clusterIP的headless模式
此模式下service不会被分配一个ip,而是直接把endpoints上的ip直接通过dns裸漏
bash
[root@k8s-master services]# vim webservice.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: webcluster
type: ClusterIP
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master services]# kubectl apply -f webservice.yaml
service/webservice created
deployment.apps/webcluster created
可以发现没有vip

查看解析

六.service的nodeport模式
1.生成nodeport
bash
[root@k8s-master services]# vim nodeport.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
nodePort: 30951 #指定端口,如不写会从30000~32767之间随机分
selector:
app: webcluster
type: NodePort #nodeport模式
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master services]# kubectl apply -f nodeport.yaml
service/webservice created
deployment.apps/webcluster created
2.查看策略

访问

4.端口破限
bash
[root@k8s-master services]# vim nodeport.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
nodePort: 44444 #书写范围外的端口
selector:
app: webcluster
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master services]# kubectl apply -f nodeport.yaml
deployment.apps/webcluster unchanged
The Service "webservice" is invalid: spec.ports[0].nodePort: Invalid value: 44444: provided port is not in the valid range. The range of valid ports is 30000-32767
[root@k8s-master services]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
42 - --service-node-port-range=30000-50000
[root@k8s-master services]# kubectl -n kube-system delete pods all
[root@k8s-master services]# kubectl apply -f nodeport.yaml
service/webservice created
deployment.apps/webcluster created

七.loadbalancer
1.建立service
bash
[root@k8s-master services]# vim loadbalancer.yml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: webservice
name: webservice
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: webcluster
type: LoadBalancer #指定模式
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
[root@k8s-master services]# kubectl apply -f loadbalancer.yml
service/webservice created
deployment.apps/webcluster created

2.构建metalLB
上传镜像
bash
[root@k8s-master services]# tar zxf metallb-v0.16.1.tar.gz
[root@k8s-master metaLLB]# docker load -i metallb-v0.16.1.tar
[root@k8s-master metaLLB]# docker tag quay.io/metallb/controller:v0.16.1 reg.timinglee.org/metallb/controller:v0.16.1
[root@k8s-master metaLLB]# docker tag quay.io/metallb/speaker:v0.16.1 reg.timinglee.org/metallb/speaker:v0.16.1
[root@k8s-master metaLLB]# docker push reg.timinglee.org/metallb/controller:v0.16.1
[root@k8s-master metaLLB]# docker push reg.timinglee.org/metallb/speaker:v0.16.1
更改kube-proxy
bash
[root@k8s-master mateLLB]# kubectl edit configmap -n kube-system kube-proxy
configmap/kube-proxy edited
59 mode: "ipvs"
60 ipvs:
61 strictARP: true
[root@k8s-master mateLLB]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-697886855d-5whcs 1/1 Running 0 24m
coredns-697886855d-wcrt5 1/1 Running 0 24m
etcd-k8s-master 1/1 Running 1 (3d23h ago) 24m
kube-apiserver-k8s-master 1/1 Running 0 24m
kube-controller-manager-k8s-master 1/1 Running 2 (27m ago) 24m
kube-proxy-57bhn 1/1 Running 0 24m
kube-proxy-854kz 1/1 Running 0 24m
kube-proxy-cnq7t 1/1 Running 0 24m
kube-proxy-s9plr 1/1 Running 0 24m
kube-scheduler-k8s-master 1/1 Running 2 (27m ago) 24m
[root@k8s-master mateLLB]# kubectl -n kube-system delete pods kube-proxy-57bhn kube-proxy-854kz kube-proxy-cnq7t kube-proxy-s9plr
pod "kube-proxy-57bhn" deleted from kube-system namespace
pod "kube-proxy-854kz" deleted from kube-system namespace
pod "kube-proxy-cnq7t" deleted from kube-system namespace
pod "kube-proxy-s9plr" deleted from kube-system namespace
[root@k8s-master mateLLB]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-697886855d-5whcs 1/1 Running 0 25m
coredns-697886855d-wcrt5 1/1 Running 0 25m
etcd-k8s-master 1/1 Running 1 (3d23h ago) 25m
kube-apiserver-k8s-master 1/1 Running 0 25m
kube-controller-manager-k8s-master 1/1 Running 2 (27m ago) 25m
kube-proxy-c6snt 1/1 Running 0 2s
kube-proxy-m7wdg 1/1 Running 0 2s
kube-proxy-p94tw 1/1 Running 0 2s
kube-proxy-pdbxw 1/1 Running 0 2s
kube-scheduler-k8s-master 1/1 Running 2 (27m ago) 25m
更改metallb的配置文件
bash
[root@k8s-master metaLLB]# vim 1-metallb-native.yaml
2136: image: metallb/controller:v0.16.1
2233: image: metallb/speaker:v0.16.1
[root@k8s-master metaLLB]# vim 2-metallb-confmap.yml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 172.25.254.50-172.25.254.99
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
[root@k8s-master metaLLB]# kubectl apply -f 2-metallb-confmap.yml -f 1-metallb-native.yaml
验证

八.extrnalname
bash
[root@k8s-master services]# vim extrnalname.yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: extrnalname
name: extrnalname
spec:
selector:
app: extrnalname
type: ExternalName
externalName: www.timinglee.org
[root@k8s-master services]# kubectl apply -f extrnalname.yaml
service/extrnalname created
[root@k8s-master services]# kubectl get svc extrnalname
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
extrnalname ExternalName <none> www.timinglee.org <none> 5s
九.ingress七层代理
1.ingress部署
下载deploy文件
bash
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.15.1/deploy/static/provider/baremetal/deploy.yaml
准备ingress所需镜像
bash
[root@k8s-master ingress-v1.5.1]# docker load -i ingress-v1.15.1.tar
[root@k8s-master ingress-v1.5.1]# docker tag registry.k8s.io/ingress-nginx/controller:v1.15.1 reg.timinglee.org/ingress-nginx/controller:v1.15.1
[root@k8s-master ingress-v1.5.1]# docker push reg.timinglee.org/ingress-nginx/controller:v1.15.1
[root@k8s-master ~]# docker tag registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.9 reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.6.9
[root@k8s-master ~]# docker push reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.6.9
更改deploy.yaml
bash
[root@k8s-master ingress-v1.5.1]# vim deploy.yaml
444: image: ingress-nginx/controller:v1.15.1
547: image: ingress-nginx/kube-webhook-certgen:v1.6.9
603: image: ingress-nginx/kube-webhook-certgen:v1.6.9
365 type: LoadBalancer
通过deplay.yaml部署ingress
bash
[root@k8s-master ingress-v1.5.1]# kubectl apply -f deploy.yaml

2.ingress功能的基本实现
建立ingress代理的微服务
bash
#业务1
[root@k8s-master services]# kubectl create deployment myappv1 --image myapp:v1 --replicas 2 --dry-run=client -o yaml > myappv1.yaml
[root@k8s-master services]# kubectl create service clusterip servicev1 --tcp 80:80 --dry-run=client -o yaml >> myappv1.yaml
[root@k8s-master services]# vim myappv1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myappv1
name: myappv1
spec:
replicas: 2
selector:
matchLabels:
app: myappv1
template:
metadata:
labels:
app: myappv1
spec:
containers:
- image: myapp:v1
name: myapp
---
apiVersion: v1
kind: Service
metadata:
labels:
app: servicev1
name: servicev1
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: myappv1
type: ClusterIP
#业务2
[root@k8s-master services]# vim myappv2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: myappv2
name: myappv2
spec:
replicas: 2
selector:
matchLabels:
app: myappv2
template:
metadata:
labels:
app: myappv2
spec:
containers:
- image: myapp:v2
name: myapp
---
apiVersion: v1
kind: Service
metadata:
labels:
app: servicev2
name: servicev2
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: myappv2
type: ClusterIP
[root@k8s-master services]# kubectl apply -f myappv2.yaml
deployment.apps/myappv2 created
service/servicev2 created
[root@k8s-master ingress-v1.5.1]# kubectl apply -f myappv1.yaml
deployment.apps/myappv1 created
service/servicev1 created

建立ingress
bash
[root@k8s-master services]# kubectl create ingress ingress1 --class nginx --rule "*/=servicev1:80" --dry-run=client -o yaml > 1-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: 'www.timinglee.org'
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /v1
pathType: Prefix
- backend:
service:
name: servicev2
port:
number: 80
path: /v2
pathType: Prefix
[root@k8s-master services]# kubectl apply -f 1-ingress.yml

测试:
bash
[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org

3.基于域名的访问
bash
[root@k8s-master services]# vim 2-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
# nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: myapp1.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
- host: myapp2.timinglee.org
http:
paths:
- backend:
service:
name: servicev2
port:
number: 80
path: /
pathType: Prefix
[root@k8s-master services]# kubectl apply -f 2-ingress.yaml
ingress.networking.k8s.io/ingress1 created

验证:
bash
[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org myapp1.timinglee.org myapp2.timinglee.org

4.基于动静分离的方式
bash
[root@k8s-master ingress-v1.5.1]# vim 3-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /index.html
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /php
pathType: ImplementationSpecific
- backend:
service:
name: servicev2
port:
number: 80
path: /static
pathType: ImplementationSpecific
[root@k8s-master ingress-v1.5.1]# kubectl apply -f 3-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

5.tls加密访问
bash
[root@k8s-master ~]# openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt
............+...+.......+...+.....+++++++++++++++++++++++++++++++++++++++*..+...........+....+..+...+......+.........+.+...+..+.........+............+....+...+.....+.+..+...+++++++++++++++++++++++++++++++++++++++*....+..+.............+..............+.+.....+.+...+............+.....+.+.....+.......+...+..+...+...............+...+.......+..+...+...+......+..........+.....+.+............+..+.+............+.................+....+..+.......++++++
...+...........+...+.+..+...+++++++++++++++++++++++++++++++++++++++*...+......+.+++++++++++++++++++++++++++++++++++++++*.................+.+..+.+...............+..+....+.........+..+....+...+......+...........+......+...+.+...+........+.........+......+...+....+...+..+.+......+...+............+.........+.....+....+......+....................+....+............+.....+.+...+...........+..........+...+..+....+.....+.+........+.+.........+..+...+.............+........+......+.+.....+...+....+......+...........+...+..........+......+..............+.+............+..+.......+...........+.........+......+....+...+...+...+..+...+......+.+.........+........+.+.....+....+...+...+.....+....+...+..............+.+..+.+.....+......++++++
kubectl create secret tls web-tls-secret --key tls.key --cert tls.crt
secret/web-tls-secret created
[root@k8s-master services]# vim 4-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" #访问强制跳转到https
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- myapp-tls.timinglee.org
secretName: web-tls-secret
ingressClassName: nginx
rules:
- host: myapp-tls.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
[root@k8s-master services]# kubectl apply -f 4-ingress.yml
ingress.networking.k8s.io/ingress1 configured
[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org myapp1.timinglee.org myapp2.timinglee.org myapp-tls.timinglee.org

6.auth认证
安装生成认证文件模板工具
bash
[root@k8s-master ~]# dnf install httpd-tools -y
生成认证文件
bash
[root@k8s-master ~]# htpasswd -cm auth admin
[root@k8s-master ~]# cat auth
admin:$apr1$aZ.p1QRa$SABH4tQ7RuMmlDkMVGSdc.
将认证文件注入k8s中
bash
[root@k8s-master ~]# kubectl create secret generic web-auth --from-file auth
在ingress中配置auth认证
bash
[root@k8s-master services]# vim 5-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: web-auth
nginx.ingress.kubernetes.io/auth-realm: "Please input username and password"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /v1
pathType: Prefix
[root@k8s-master services]# kubectl apply -f 5-ingress.yaml
验证auth

7.ingress中的网页重写
利用网页从写定义默认发布文件
bash
[root@k8s-master services]# vim 6-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/app-root: /hostname.html
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
[root@k8s-master services]# kubectl apply -f 6-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

利用正侧表达式从定向网页
bash
[root@k8s-master services]# vim 6-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: servicev2
port:
number: 80
path: /lee(/*.*/*|$)(.*)
pathType: ImplementationSpecific
[root@k8s-master services]# kubectl apply -f 6-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

十.金丝雀发布(cannary)
1.基于headr的灰度发布
bash
[root@k8s-master services]# vim cannary.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "version"
nginx.ingress.kubernetes.io/canary-by-header-value: "2"
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev2
port:
number: 80
path: /
pathType: Prefix
[root@k8s-master services]# kubectl apply -f cannary.yaml
ingress.networking.k8s.io/ingress1 configured
ingress.networking.k8s.io/ingress2 created

2.基于权重的灰度发布
bash
[root@k8s-master services]# vim cannary.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
annotations:
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev1
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
nginx.ingress.kubernetes.io/canary-weight-total: "100"
spec:
ingressClassName: nginx
rules:
- host: www.timinglee.org
http:
paths:
- backend:
service:
name: servicev2
port:
number: 80
path: /
pathType: Prefix
[root@k8s-master services]# kubectl apply -f cannary.yaml
ingress.networking.k8s.io/ingress1 unchanged
ingress.networking.k8s.io/ingress2 configured
[root@k8s-master services]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress1 nginx www.timinglee.org 172.25.254.20 80 21m
ingress2 nginx www.timinglee.org 172.25.254.20 80 98s
[root@k8s-master services]# vim check_cannary.sh
#!/bin/bash
v1=0
v2=0
for (( i=0; i<100; i++))
do
response=`curl -s www.timinglee.org |grep -c v1`
v1=`expr $v1 + $response`
v2=`expr $v2 + 1 - $response`
done
echo "v1:$v1, v2:$v2"
