k8s部署-44-带你深入学习ingress-nginx(终)
续接上文,我们来看下如何进行访问控制吧~~~
4
访问控制
我们之前学了如何使用ingress-nginx来进行多节点配置,如何代理4层协议,如何配置https,那么我们还剩下一个,那就是访问控制,本文来详细实操一下。
1、session保持;
在同一段时间,长期访问同一个后端服务,不要进行轮训;那么我们首先来准备下环境吧。为了做测试,我们要实现的是,经过同一个域名,访问两个使用不同镜像的后端服务,就是我们要采用金丝雀部署的方式,来看看吧。
[root@node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-ds-q2pjt 1/1 Running 35 26d
nginx-ds-zc5qt 1/1 Running 40 32d
springboot-web-demo-5c9446ffbf-qvq69 1/1 Running 1 15h
[root@node1 ~]#
可以看到我们现在运行了一个pod,使用的镜像如下:
[root@node1 ~]# kubectl get pod springboot-web-demo-5c9446ffbf-qvq69 -o yaml | grep image
f:image: {}
f:imagePullPolicy: {}
- image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
imagePullPolicy: IfNotPresent
image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
imageID: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web@sha256:1953bfa3859e02f7f8ab10e5b69a0505c738f2d05040be6222e63c2971e8b45d
[root@node1 ~]#
然后我们再次创建个同样域名的pod,使用不同的镜像来看看;
[root@node1 ~]# cd namespace/
[root@node1 namespace]# mkdir control
[root@node1 namespace]# cd control/
[root@node1 control]#
[root@node1 control]# vim control-ceshi.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-web-demo-new
spec:
selector:
matchLabels:
app: springboot-web-demo
replicas: 1
template:
metadata:
labels:
app: springboot-web-demo
spec:
containers:
- name: springboot-web-demo
image: registry.cn-beijing.aliyuncs.com/yunweijia0909/tomcat:jre8-openjdk
ports:
- containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
name: springboot-web-demo
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: springboot-web-demo
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: springboot-web-demo
spec:
rules:
- host: springboot.yunweijia.com
http:
paths:
- backend:
serviceName: springboot-web-demo
servicePort: 80
path: /
[root@node1 control]#
[root@node1 control]#
可以看到我们使用了同样的域名,但是镜像不一样,当然了,我们使用的配置https,还是和上文是一样的,如下(只需要执行一个就行,因为域名是一样的):
[root@node1 control]# cat web-demo-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: springboot.yunweijia.com
spec:
rules:
- host: springboot.yunweijia.com
http:
paths:
- backend:
serviceName: springboot-web-demo
servicePort: 80
path: /
tls:
- hosts:
- springboot.yunweijia.com
secretName: yunweijia-tls
[root@node1 control]#
看下访问结果哈,一直按着刷新;
会在这两个界面中来回切换,说明我们的环境就搞定了。(不要在意我的404 ,上次镜像搞崩了,一直没修复。)
环境搞定之后,我们就该做session保持了,操作的对象是ingress-nginx;
[root@node1 control]# vim ingress-session.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/session-cookie-hash: sha1
nginx.ingress.kubernetes.io/session-cookie-name: route
name: springboot-web-demo
spec:
rules:
- host: springboot.yunweijia.com
http:
paths:
- backend:
serviceName: springboot-web-demo
servicePort: 80
path: /
tls:
- hosts:
- springboot.yunweijia.com
secretName: yunweijia-tls
[root@node1 control]#
然后我们再次浏览器刷新的时候,会发现他一直保持在一个界面,这个时候我们看看他的session是什么样子的;
只要是同一个cookie就会一直保持在同一个界面中,除非你关闭浏览器再次打开,这样子你的cookie就换了,那么有可能就不是这个后台程序了。
2、流量控制
比如说当我们有两个服务,我们再升级的时候,升了一个,想切10%的流量到我们的新服务上,验证下有没有问题,那么我们应该如何来做呢?
[root@node1 control]# cd ../tls/
[root@node1 tls]# kubectl create secret tls yunweijia-tls --key yunweijia.key --cert yunweijia.crt -n canary
上面这步不太理解的,看一下前面的文章。
PS:该项操作,需要在较新的ingress-nginx版本上才有的哈,如果版本太老了,可能不支持,可以更新一下image,替换版本为0.23.0之后方可;
[root@node1 control]# mkdir canary
[root@node1 control]# cd canary/
[root@node1 canary]# vim web-canary-a.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-canary-a
namespace: canary
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: web-canary-a
replicas: 1
template:
metadata:
labels:
app: web-canary-a
spec:
containers:
- name: web-canary-a
image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /hello?name=test
port: 8080
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
failureThreshold: 1
successThreshold: 1
timeoutSeconds: 5
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-canary-a
namespace: canary
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-canary-a
type: ClusterIP
[root@node1 canary]# vim web-canary-b.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-canary-b
namespace: canary
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector:
matchLabels:
app: web-canary-b
replicas: 1
template:
metadata:
labels:
app: web-canary-b
spec:
containers:
- name: web-canary-b
image: registry.cn-beijing.aliyuncs.com/yunweijia0909/tomcat:jre8-openjdk
ports:
- containerPort: 8080
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-canary-b
namespace: canary
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-canary-b
type: ClusterIP
[root@node1 canary]#
可以看到我们写了两个yaml文件,我们下来运行一下;
[root@node1 canary]# kubectl create ns canary
namespace/canary created
[root@node1 canary]# kubectl apply -f web-canary-a.yaml
deployment.apps/web-canary-a created
service/web-canary-a created
[root@node1 canary]# kubectl apply -f web-canary-b.yaml
deployment.apps/web-canary-b created
service/web-canary-b created
[root@node1 canary]#
然后我们还需要准备一个ingress的yaml文件;
[root@node1 canary]# vim ingress-common.yaml
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-canary-a
namespace: canary
spec:
rules:
- host: canary.yunweijia.com
http:
paths:
- path: /
backend:
serviceName: web-canary-a
servicePort: 80
tls:
- hosts:
- canary.yunweijia.com
secretName: yunweijia-tls
[root@node1 canary]#
[root@node1 canary]# kubectl apply -f ingress-common.yaml
ingress.extensions/web-canary-a created
[root@node1 canary]#
然后我们访问验证一下试试;(需要先添加hosts文件哈,自行添加,不演示了哈)
接着我们需要上线canary-b;
剩余内容请转至VX公众号 “运维家” ,回复 “151” 查看。
------ 以下内容为防伪内容,忽略即可 ------
------ 以下内容为防伪内容,忽略即可 ------
------ 以下内容为防伪内容,忽略即可 ------
linux清理软件linux发包流程linuxphp重装linux设置内网iplinuxfbtermlinux如何查询内存安卓手机刷机成linuxlinux内存最小的系统图解linux操作系统linux时区设置命令基于linux的应用开发linux配置永久路由方法linux终端的源码在哪里linux查看当前所在linux查询每日访问量Linux进程如何进行死锁linux系统信息转为机器码linux增加线程数linux