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列出绝对路径虚拟机镜像文件下载linux

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值