linux运维

k8s部署-44-带你深入学习ingress-nginx(终)

2022-04-30  本文已影响0人  运维家

续接上文,我们来看下如何进行访问控制吧~~~

4

访问控制

我们之前学了如何使用ingress-nginx来进行多节点配置,如何代理4层协议,如何配置https,那么我们还剩下一个,那就是访问控制,本文来详细实操一下。

1、session保持;

在同一段时间,长期访问同一个后端服务,不要进行轮训;那么我们首先来准备下环境吧。为了做测试,我们要实现的是,经过同一个域名,访问两个使用不同镜像的后端服务,就是我们要采用金丝雀部署的方式,来看看吧。

[root@node1 ~]# kubectl get podNAME                                   READY   STATUS    RESTARTS   AGEnginx-ds-q2pjt                         1/1     Running   35         26dnginx-ds-zc5qt                         1/1     Running   40         32dspringboot-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 #deployapiVersion: apps/v1kind: Deploymentmetadata:  name: springboot-web-demo-newspec:  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---#serviceapiVersion: v1kind: Servicemetadata:  name: springboot-web-demospec:  ports:  - port: 80    protocol: TCP    targetPort: 8080  selector:    app: springboot-web-demo  type: ClusterIP---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:  name: springboot-web-demospec:  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/v1beta1kind: Ingressmetadata:  name: springboot.yunweijia.comspec:  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/v1beta1kind: Ingressmetadata:  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-demospec:  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 #deployapiVersion: apps/v1kind: Deploymentmetadata:  name: web-canary-a  namespace: canaryspec:  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---#serviceapiVersion: v1kind: Servicemetadata:  name: web-canary-a  namespace: canaryspec:  ports:  - port: 80    protocol: TCP    targetPort: 8080  selector:    app: web-canary-a  type: ClusterIP[root@node1 canary]# vim web-canary-b.yaml #deployapiVersion: apps/v1kind: Deploymentmetadata:  name: web-canary-b  namespace: canaryspec:  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---#serviceapiVersion: v1kind: Servicemetadata:  name: web-canary-b  namespace: canaryspec:  ports:  - port: 80    protocol: TCP    targetPort: 8080  selector:    app: web-canary-b  type: ClusterIP[root@node1 canary]#

可以看到我们写了两个yaml文件,我们下来运行一下;

[root@node1 canary]# kubectl create ns canarynamespace/canary created[root@node1 canary]# kubectl apply -f web-canary-a.yaml deployment.apps/web-canary-a createdservice/web-canary-a created[root@node1 canary]# kubectl apply -f web-canary-b.yaml deployment.apps/web-canary-b createdservice/web-canary-b created[root@node1 canary]#

然后我们还需要准备一个ingress的yaml文件;

[root@node1 canary]# vim ingress-common.yaml #ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:  name: web-canary-a  namespace: canaryspec:  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

上一篇下一篇

猜你喜欢

热点阅读