Kubernetes--ingress实现七层负载

目录

一、传统方式:不借助ingress实现七层代理

二、nginx-ingress

三、使用ingress实现七层代理

四、部署ingrss-nginx及功能

五、样例

1.Ingress-nginx HTTP代理访问

2.Ingress HTTPS代理访问(会话卸载层)

3.Nginx进行BasicAuth(访问认证)

4、ingress-nginx进行重写(跳转)


一、传统方式:不借助ingress实现七层代理

Deployment启动一组容器,并通过svc暴露一个ip,实现负载均衡,而ngin则只需在配置文件中将暴露出的clusterIP写在配置文件的代理区域,同时将自己的service改为nodeport(或loadBalancer)。既实现负载均衡

缺点:需要每次都进入nginx里更改配置文件,不够动态

二、nginx-ingress

官网:

ngress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx

Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/

网站里有不同的部署方案(loadBalancer)AWS/GCE/等,也有基于NodePort

Nginx软件层面七层代理最强,但不可热更新

三、使用ingress实现七层代理

将配置信息对象化。使管控起来更为便利,原理无太大差异

Nginx-ingress结构:为了满足ingress可动态更新的需求,进行了结构层次的修改

协程:轻量级线程

协程会和apiservcer联立,监听变化

Lua server模块:可以以异步方案更新 以lua语言编写

2种重载及更新

1.非紧急事件(死了一个pod):会被放在更新队列中,此更新队列写满后被主程拿到另一个队列再更新(可有可无的事件),二级缓冲机制

         2.紧急事件(svc变动):即时生效,判断是否需要重载生效。需要重载则重载

         主要还是为了,让nginx更稳定

四、部署ingrss-nginx及功能

1)ingrss-nginx国内无法下载(quay.io),需要翻墙,此处采用老师提供的,国内有小网站代理,但不稳定,建议买个国外服务器

【】mkdir /usr/local/kubernetes/ingress

【】tar -xf ingress-nginx.tar.gz /usr/local/kubernetes/ingress

【】cd ingress-nginx

【】ls

ingress.tar(镜像)  mandatory.yaml(部署文件包含控制器,包含权限)  service-nodeport.yaml(service网络)

2)导入镜像,master和node都需要

【】docker load -i ingress.tar

【】scp ingress.tar 各节点

各节点【】docker load -i ingress.tar

3)启动部署文件

【】kubectl apply -f mandatory.yam

【】kubectl apply -f service-nodeport.yaml

【】kubectl get pod --all-namespaces

【】kubectl get svc -n ingress-nginx

#【】kubectl  exec -it -n ingress-nginx nginx-ingress-controller-7995bd9c47-4nrph -- /bin/sh

#可以进入从pod内看看发现和nginx原理是一样的

4)删除ingress的方法

【】cd /usr/local/kubernetes/ingress/ingress-nginx/

【】kubectl delete -f service-nodeport.yaml

【】kubectl delete -f service-nodeport.yaml

五、样例

1.Ingress-nginx HTTP代理访问

1)创建资源清单,并启动

【】mkdir ingress

【】vim http-deploy.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-dm
spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: wangyanglinux/myapp:v1
          imagePullPolicy: IfNotPresent   #下载策略为本地有就不下载
          ports:
            - containerPort: 80   #端口80-
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
name: nginx   #与deployment的对应
---
apiVersion: extensions/v1beta1   #ingress接口
kind: Ingress   #ingress对象
metadata:
  name: nginx-test
spec:
  rules:
    - host: www1.zn.com   #主机名
      http:   #基于http协议
        paths:   #可以写多个等同location
        - path: /
          backend:
            serviceName: nginx-svc  #由名字为nginx-svc的svc提供的pod
            servicePort: 80

【】kubectl apply -f http-deploy.yaml

【】kubectl get ingress

NAME         HOSTS             ADDRESS   PORTS   AGE

nginx-test   www1.hongfu.com             80      4m11s

访问基于域名所以要写host文件

C:\Windows\System32\drivers\etc/hosts

192.168.1.71        www.zn.com

拿物理路由器做DNAT映射或者搭建四层负载均衡调度或F5

2.Ingress HTTPS代理访问(会话卸载层)

后端用什么都可以,此处实际也用了nginx

1)创建证书,以及cert存储方式

【】openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc" 

#新版openssl支持的一条命令注入方式,国家或组织等可通过-的方案添加

【】kubectl create secret tls tls-secret --key tls.key --cert tls.crt

#secret 存储安全类型的文件

tls类型  名字tls-secret  --key指定私钥  --cert 指定证书

【】kubecctl get secret

【】kubectl describe secret tls-secret

Name:         tls-secret

Namespace:    default

Labels:       <none>

Annotations:  <none>

Type:  kubernetes.io/tls

Data

====

tls.crt:  1143 bytes

tls.key:  1704 bytes

2)创建ingress的资源清单

【】vim 2.https.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: https
spec:
  tls:          #tls类型
    - hosts:
      - ssl.zn.com  #https的域名
      secretName: tls-secret   #用的是哪个证书即哪个csecret对象
  rules:  #https主机的入口设置
    - host: ssl.hongfu.com   #入口主机的域名(80的域名)
      http:   #http协议
        paths:   #路径lacation区域
        - path: /
          backend:
            serviceName: nginx-svc  #找此clusterip调度的真实服务器
            servicePort: 80   # 端口

【】kubectl apply -f 2.https.yaml

3.Nginx进行BasicAuth(访问认证)

1)生成密码文件

【】yum -y install httpd(或httpd-tools)

【】htpasswd -c auth 用户名

#生成密码文件,会车输入密码

【】kubectl create secret generic basic-auth --from-file=auth

#generic类型

【】vim basicauth.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-with-auth
  annotations:    #标记,lables主要用于K8S内部匹配,但此标记会被ingress-nginx应用程序所识别(需在应用程序里写相关配置)
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'   #此3条代表要进行basicAuth
spec:
  rules:
  - host: auth.hongfu.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

【】kubectl apply -f basicauth.yaml

主机修改host文件添加对应解析,访问呢即可

4、ingress-nginx进行重写(跳转)

名称

描述

nginx.ingress.kubernetes.io/rewrite-target

必须重定向流量的目标URI

nginx.ingress.kubernetes.io/ssl-redirect

指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为True),即必须https

布尔

nginx.ingress.kubernetes.io/force-ssl-redirect

即使Ingress未启用TLS,也强制重定向到HTTPS,即访问任何都会调转到https

布尔

nginx.ingress.kubernetes.io/app-root

定义Controller必须重定向的应用程序根,如果它在'/'上下文中

nginx.ingress.kubernetes.io/use-regex

指示Ingress上定义的路径是否使用正则表达式

布尔

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: rew
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://ssl.fongfu.com:31795/hostname.html  #也可以写https
spec:
  rules:
  - host: rew.hongfu.com   #主机名,即访问foo10,跳转到ssl,hongfu。com:31795
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

做完清空以下,以免影响后续

【】kubectl delete ingress --all

【】kubectl delete svc nginx-svc

【】kubectl delete deployment --all

【】kubectl delete secret basic-auth tls-secret  #注意默认的不要删除(default-token-brcmv

总结:和svc对比优点和缺点即四七层的优缺点

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值