【Linux39-4】Ingress简介及部署、创建Ingress(加密、认证、重写)


master端:server2
node端:server3,server4


1. Ingress


Ingress官网文档

Ingress控制器官方文档


1.1 简介


Ingress:

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

Ingress 控制器:

为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。

Kubernetes 作为一个项目,目前支持和维护 AWS, GCE 和 nginx Ingress 控制器

1.2 Ingress 规则


每个 HTTP 规则都包含以下信息:
  • 可选的 host。在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host。
  • 路径列表 paths(例如,/testpath),每个路径都有一个由 serviceName 和 servicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
  • backend(后端)是 Service 文档中所述的服务和端口名称的组合。 与规则的 host 和 path 匹配的对 Ingress 的 HTTP(和 HTTPS )请求将发送到列出的 backend。

通常在 Ingress 控制器中会配置 defaultBackend(默认后端),以服务于任何不符合规约中 path 的请求。

2. 部署Ingress环境


环境准备:https://kubernetes.github.io/ingress-nginx/deploy/

官方下载速度较慢:
在这里插入图片描述

不从官方下载,提前准备好需要的文件及镜像:

1)demploy.yml 文件
/root/ingress/deploy.yml

官方的文档 deploy.yml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/cloud/deploy.yaml

2)镜像

镜像1:nginx-ingress-controller:0.33.0
镜像2:kube-webhook-certgen:v1.2.0)

3)部署

kubectl apply -f ingress/deploy.yaml

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 创建Ingress


Ingress创建详解:https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal

Ingress官方例子:https://kubernetes.github.io/ingress-nginx/examples/

准备: 创建两个服务:myservice与nginx-svc

在这里插入图片描述

1.创建service:myservice
# demo.yml
---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2

在这里插入图片描述

2.创建service:nginx-svc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: myapp
        image: myapp:v2

在这里插入图片描述

3.1 创建


kubectl apply -f ingress/nginx.yml

创建结果:
在这里插入图片描述

# ingress/nginx.yml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80
  - host: www2.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

测试:
在这里插入图片描述

3.2 加密(TLS证书)


加密、认证、重写等官方举例

生成证书:

1.cd ingress/
2.生成tls密钥和tls证书并签名
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
3.创建一个tls secret,命名为:tls-secret
kubectl create secret tls tls-secret --key tls.key --cert tls.crt

在这里插入图片描述
在这里插入图片描述

创建加密Ingress: www1加密,www2不加密

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  tls:
    - hosts:  #加密列表主机
      - www1.westos.org
      secretName: tls-secret #secret名字
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo2
spec:
  rules:
  - host: www2.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试:

在这里插入图片描述

3.3 认证


安装httpd-tools:yum install -y httpd-tools

添加身份验证: sdsnzy与admin

htpasswd -c auth sdsnzy:首次添加要使用-c

htpasswd auth admin

创建基本验证: 命名为 basic-auth

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

在这里插入图片描述

创建需验证的Ingress: 设置www1验证用户sdsnzy,www2无需验证

在这里插入图片描述

# nginx.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
  annotations:
#认证类型
    nginx.ingress.kubernetes.io/auth-type: basic
#包含用户/密码定义的验证名称:创建时定义的是basic-auth
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
#可验证的用户
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - sdsnzy'
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo2
spec:
  rules:
  - host: www2.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

测试: 访问: www1.westos.org,需要验证通过才能访问

在这里插入图片描述

3.4 重写(rewrite-target)


重写的部署方式:

在这里插入图片描述

创建重写URL规则的Ingress:

kubectl apply -f nginx.yml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /hostname.html
spec:
  rules:
  - host: www2.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80 

测试: 现在访问 www2.westos.org 相当于访问 www2.westos.org/hostname.html

在这里插入图片描述

3.5 重写(app root)


创建app root规则的Ingress: 捕获的任何字符(.*)都将分配给占位符$2,然后将其用作rewrite-target注释中的参数。(本例设置为/westos)

  • 访问www2.westos.org/westos 重写为 www2.westos.org/
  • 访问www2.westos.org/westos/ 重写为 www2.westos.org/
  • 访问www2.westos.org/westos/XXX 重写为 www2.westos.org/XXX

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: www2.westos.org
    http:
      paths:
      - backend:
          serviceName: nginx-svc
          servicePort: 80
        path: /westos(/|$)(.*)

在这里插入图片描述

测试:

  • 访问 www2.westos.org
  • 访问 www2.westos.org/westos/
  • 访问 www2.westos.org/westos/hostname.html
  • curl -I -k 以上地址

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/113962905
今日推荐