k8sIngress(部署,域名访问,加密,认证,地址重写)

Posted S4061222

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8sIngress(部署,域名访问,加密,认证,地址重写)相关的知识,希望对你有一定的参考价值。

一、 Ingress

简介

  • 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,就是 Kubernetes 里的Ingress 服务。

  • Ingress由两部分组成:Ingress controller和Ingress服务

  • Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。业界常用的各种反向代理项目,比如 nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller。

  • 官网:https://kubernetes.github.io/ingress-nginx/

Ingress是一个API对象,和其他对象一样,通过yaml文件来配置。ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。ingress服务的使用必须在策略网络中才能实现,如calico网络

ingress相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象。大概的工作原理也确实类似于Nginx,可以理解成在Ingress 里建立一个个映射规则 , ingress Controller 通过监听 Ingress这个api对象里的配置规则并转化成Nginx 的配置(kubernetes声明式API和控制循环) , 然后对外部提供服务。

  • ingress包括:ingress controller和ingress resources

  • ingress controller:核心是一个deployment,实现方式有很多,比如nginx, Contour, Haproxy, trafik, Istio,需要编写的yaml有:Deployment, Service, ConfigMap,
    ServiceAccount(Auth),其中service的类型可以是NodePort或者LoadBalancer。

  • ingress resources:这个就是一个类型为Ingress的k8s api对象了,这部分则是面向开发人员

1.ingress部署

ingress是7曾的负载均衡,可以重定向,clinet-ingress-svc-pod,减少vip的分布,域名调度到svc的后端


上传ingress两个镜像到私有仓库下的ingress-nginx项目

查看镜像上传成功

下载所需要的deploy.yaml文件,修改deploy.yaml文件中镜像地址


执行deploy.yaml清单

查看ns为ingress-nginx的所有信息,可以看到ingress-nginx-controller已经running

查看ns为ingress-nginx的pod的信息

查看日志

查看svc暴露端口:32470

测试:
访问server2ip地址加上端口

2.域名访问+ingress-nginx

删除其他的svc

编辑myapp.yaml,添加svc服务

查看ns为ingress-nginx的svc

查看之前的3个pod


查看myapp-svc的详细信息,

编辑ingress.yaml文件


运行,查看svc,会产生myapp-svc

查看ingress反向代理信息,看到www1.westos.org域名,由mysvc服务暴露的三个后端


修改svc配置文件为LoadBalancer


查看ingress-nginx的IP地址

访问
设置本地解析

域名访问测试,访问到对应service,且负载均衡

3.域名访问+ingress-nginx(2个域名)

两个域名,两个服务,访问同一个IP,暴露不同的后端

www1.westos.org ---- myapp-svc(svc) ---- myapp(label) ---- ingress-myapp(ingress)
www2.westos.org ---- nginx-svc ---- nginx ---- ingress-nginx

修改deloyment文件中的标签和镜像版本,为重定向作准备,给定不同版本的镜像,方便看到反向代理的结果差异。可以自行修改版本为v2

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1

查看pod

查看pod的标签


修改svc.yaml文件,有两个服务:myapp-svc和nginx-svc

查看myapp-svc服务的详细信息,myapp-svc下有三个pod 的ip用于均衡访问

查看nginx-svc服务的详细信息,nginx-svc下有三个pod 的ip用于均衡访问

删除第一次实验的ingress-demo

修改ingress.yaml文件,ingress有两个:ingress-myapp和ingress-nginx

应用ingress.yaml后,成功看到两个不同的ingress对应不同的域名

发现ingress-nginx的svc暴露出来的外部ip与ingress-myapp的svc的ip相同,即两个域名对应同一个ip

本地解析

域名访问测试,访问到对应service,负载均衡测试,成功 nginx-svc

进入启动成功的ingress-nginx-controller,可以看到www1.westos.org和www1.westos.org都已写入配置文件


4.加密

实验环境

之前实验的pod:

之前实验的svc:

删除之前实验的ingress

创建ingress-myapp的ingress


Ingress TLS 配置
生成证书crt和key

修改ingress文件


执行ingress清单,查看详细信息


测试:
此处已经解析完成
308:重定向

curl www1.westos.org -I 查看重定向地址


curl -k 加密域名访问重定向的地址,curl不支持重定向

网页访问,轮询

5.认证+加密

认证需要系统自带的认证功能,需要安装生成认证证书的插件

生成证书,输入认证密码
创建证书到k8s secret

修改ingress文件,导入证书

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - jiaojiao'
spec:
  tls:
  - hosts:
    - www1.westos.org
    secretName: tls-secret
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80


执行ingress清单
查看证书信息是否已添加

访问测试

6.地址重写

2.1 根目录重定向到hostname.html


修改ingress文件,根目录重定向到hostname.htm


测试
访问域名www1.westos.org直接跳转到指定目录的下

2.2 地址更新

如更新了地址,从www1.westos.org/westos/变为www1.westos.org

修改ingress文件

nginx.ingress.kubernetes.io/rewrite-target: /$2		%抓取第二列输入内容
- path: /westos(/|$)(.*)		%自动抓取westos后的内容,即忽略westos


应用ingress后,查看详细信息

测试:

访问 www1.westos.org/westos/自动跳转到www1.westos.org;


访问www1.westos.org/westos/hostname.html自动跳转到www1.westos.org/hostname.html,忽略westos

2.3 根目录重定向到westos,并添加地址重写

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    nginx.ingress.kubernetes.io/app-root: /westos
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - jiaojiao'
spec:
  tls:
  - hosts:
    - www1.westos.org
    secretName: tls-secret
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /westos(/|$)(.*)
        backend:
          serviceName: nginx-svc
          servicePort: 80


测试:
逐级代理测试, 域名代理到/westos

-k访问443加密端口,显示需要认证;-u 后跟认证用户和密码即可查看

以上是关于k8sIngress(部署,域名访问,加密,认证,地址重写)的主要内容,如果未能解决你的问题,请参考以下文章

LAMP+LNMP用户认证域名跳转与访问日志

LAMP+LNMP用户认证域名跳转与访问日志

认证域名与SSL证书的区别

IDEA集成Docker插件实现项目打包镜像一键部署与Docker CA加密认证

k8sgress部署加密认证重写

网站如何添加https://加密认证教程