【云原生】Ingress控制器超级详解

Ingress资源对象

文章目录

  • Ingress资源对象
    • 一、Ingress
      • 1.1、Ingress是什么?
      • 1.2、Ingress术语
      • 1.3、Ingress类型
    • 二、Ingress详细
      • 2.1、部署Nginx-Ingress控制器
      • 2.2、最小Ingress资源
      • 2.3、Ingress规则
    • 三、一个域名多个访问路径多SVC
    • 四、多域名Ingress
    • 五、转发到默认Service
    • 六、TLS证书加密
      • 6.1、创建Openssl生成证书
      • 6.2、base64加密证书数据
      • 6.3、创建Secret存储
      • 6.4、配置Ingress资源

一、Ingress

  • Ingress是对集群中服务的外部访问进行管理的API对象,典型的访问呢方式是HTTP,Ingress可以提供负载均衡、SSL和基于名称的虚拟托管。

1.1、Ingress是什么?

  • Ingress提供从集群外部到集群内部服务的HTTP和HTTPS路由。流量路由,由Ingress资源所定义的规则来控制。

  • 下面是Ingress的一个简单的示例,可将所有流量都发送到同一Service:
    在这里插入图片描述

图.ingress

  • 通过配置,Ingress可为Service提供外部可访问的URL、对其流量作负载均衡、SSL/TLS,以及基于名称的虚拟托管等能力。Ingress控制器负载完成Ingress的工作,具体实现上通常会使用某个负载均衡器,不过也可以配置边缘路由器或其他前端来帮助处理流量。

  • Ingress不会随意公开端口或协议。将HTTP和HTTPS以外的服务开放到Ingress时,通常使用Service.Type=NodePortService.Type=LoadBalancer类型的Service。

1.2、Ingress术语

  • 为了表达更加清晰,本指南定义以下术语:
    • 节点(Node):Kubernetes集群中的一台工作机器,是集群的一部分。
    • 集群(Cluster):一组运行容器化应用程序的Node,这些应用由Kubernetes管理。在此示例和在大多数常见的Kubernetes部署环境中,集群中的节点都不在公共网路中。
    • 边缘路由器(Edge Router):在集群中强制执行防火墙策略的路由器。可以是由云提供商管理的网关,也可以是物理硬件。
    • 集群网络(Cluster Network):一组逻辑的或物理的链接,基于Kubernetes网络模型实现集群内的通信。
    • 服务(Service):Kubernetes服务(Service),使用标签算符(Selectors)来选择一组Pod。除非另作说明,否则假定Service具有只能在集群网络内路由的虚拟IP。

1.3、Ingress类型

  • Ingress中的每个路径都需要有对应的路径类型(Path Type)。未明确设置pathType的路径无法通过合法性检查。当前支持的路径类型有三种:
    • ImplementationSpecific:对于这种路径类型,匹配方法取决于IngressClass(类)。具体实现可以将其作为单独的pathType处理或者作与PrefixExact类型相同的处理。
    • Exact:精确匹配URL路径,且区分大小写。
    • Prefix:基于以/分隔的URL路径前缀匹配。匹配区分大小写,并且对路径中各个元素逐个执行匹配操作。路径元素指的是由/分隔符分隔的路径中的标签列表。如果每个p都是请求路径p的元素前缀,则请求与路径p匹配。

二、Ingress详细

  • 你必须有一个Ingress控制器才能满足Ingress的要求。仅创建Ingress资源本身没有任何效果。

2.1、部署Nginx-Ingress控制器

  • 你可以部署一个Ingress控制器,例如ingress-nginx。你可以从许多Ingress控制器中选择。
  • 理想情况下,所有Ingress控制器都遵从参考规范。但实际上,各个Ingress控制器操作略有不同。
[root@master ~]# kubectl apply -f deploy.yaml 

2.2、最小Ingress资源

[root@master ingress]# cat ingress.yaml 
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  annotations:  # 添加注解
    nginx.ingress.kubernetes.io/rewrite-target: "/"  # 被此ingress路由的请求,都将会被重定向到网站根(/)目录下的内容。
    # kubectl get ingressclasses.networking.k8s.io此命令可以查看你的ingres类,NAME字段就是你的ingress类
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  rules:  # ingress规则
  - http:   # 基于http规则
      paths:
      - path: /testpath   # 访问路由如 http://ip/testpath,将会被重定向到网站根目录
        pathType: Prefix  # Ingress类型,前缀匹配
        backend:   # 后端服务
          service:   
            name: test  # 指定Service,Ingress匹配的请求将会转发到此test Service上
            port:
              number: 80  # 执行Service的端口
# 以下是一个完整的Ingress代理后端Serivce并且访问Pod的案例
apiVersion: "v1"
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

---

apiVersion: "v1"
kind: Service
metadata:
  name: test
spec:
  selector:  # 标签选择器
    app: nginx   # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
  type: ClusterIP  # 使用了Ingress,此处的svc的类型写为ClusterIP是一个规范的用法
  ports:
  - port: 80  # 对外暴露80端口
    targetPort: 80  # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上


---


apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations:  # 添加注解
    nginx.ingress.kubernetes.io/rewrite-target: "/"  # 被此ingress路由的请求,都将会被重定向到网站根(/)目录下的内容。
    # kubectl get ingressclasses.networking.k8s.io此命令可以查看你的ingres类,NAME字段就是你的ingress类
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend: 
          service: 
            name: test
            port:
              number: 80
              
       
# 你可以通过查看Ingress控制器的IP地址来进行流量匹配从而访问到后端Service
[root@master ingress]# kubectl describe pod -n ingress-nginx ingress-nginx-controller-6cd89cfd57-px9vg | grep IP:
IP:           192.168.93.147


# 流量匹配访问测试
# 你也可以在集群外部进行访问
C:\Users\Lenovo>curl http://192.168.93.147/testpath
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2.3、Ingress规则

  • 每个HTTP规则都包含以下信息:
    • 可选的host。在上面的例子中,未指定host,因此该规则基于所有指定IP地址来匹配所有入栈HTTP流量。如果提供了host(例如foo.bar.com),则rules适用于所指定的主机。
    • 路径列表(例如/testpath)。每个路径都有一个由service.nameservice.port.number确定的关联后端。主机和路径都必须与入栈请求的内容相匹配,负载均衡器才会将流量引导到所引用的Service上。
    • backend(后端):是Service文档中所属的Service和端口名称的组合,或者是通过CRD方式来实现的自定义资源后端。对于发往Ingress的HTTP(和HTTPS)请求,如果与规则中主机和路径匹配,则会被发送到所列出的后端。

三、一个域名多个访问路径多SVC

  • 可以理解为简单扇出配置根据请求的HTTP URI将来自同一IP地址的流量路由到多个Service。Ingress允许你将负载均衡器的数量降至最低。例如,这样设置:
    在这里插入图片描述

图.ingress扇出

  • 这样需要一个如下的Ingress:
[root@master ingress]# cat ingress.yaml
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations: 
    nginx.ingress.kubernetes.io/rewrite-target: "/"  
    kubernetes.io/ingress.class: "nginx"  
spec:
  rules:
  - host: foo.bar.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /foo  
        pathType: Prefix
        backend: 
          service: 
            name: service1
            port:
              number: 80
      - path: /bar  
        pathType: Prefix
        backend: 
          service: 
            name: service2
            port:
              number: 80
# 查看ingres
[root@master ingress]# kubectl get ingress
NAME           CLASS    HOSTS         ADDRESS   PORTS   AGE
mini-ingress   <none>   foo.bar.com             80      27m



# 查看ingress详细信息
[root@master ingress]# kubectl get ingress
NAME           CLASS    HOSTS         ADDRESS   PORTS   AGE
mini-ingress   <none>   foo.bar.com             80      27m
[root@master ingress]# kubectl describe ingress mini-ingress 
Name:             mini-ingress
Labels:           app=nginx
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com  
########################################################
               /foo   service1:80 (10.244.1.3:80)
               /bar   service2:80 (10.244.1.3:80)
########################################################
Annotations:   kubernetes.io/ingress.class: nginx
               nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age                 From                      Message
  ----    ------  ----                ----                      -------
  Normal  Sync    3m3s (x2 over 27m)  nginx-ingress-controller  Scheduled for sync
  • 此时Ingress控制器构造一个特定于实现的负载均衡来供Ingress使用,前提是Service(Service1、Service2)存在。

四、多域名Ingress

  • 基于域名的虚拟主机支持将针对多个主机名的HTTP流量路由到同一IP地址上。
    在这里插入图片描述

图.基于域名实现虚拟托管的Ingress

  • 以下Ingress让后台负载均衡器基于host头部字段来路由请求
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations:  # 添加注解
    # nginx.ingress.kubernetes.io/rewrite-target: "/"  # 被此ingress路由的请求,都将会被重定向到网站根(/)目录下的内容。
    # kubectl get ingressclasses.networking.k8s.io此命令可以查看你的ingres类,NAME字段就是你的ingress类
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  rules:
  - host: www.svc1.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service1
            port:
              number: 80
  - host: www.svc2.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service2
            port:
              number: 80
# 查看Ingress资源,将会看到HOSTS字段会有两个域名
[root@master ingress]# kubectl get ingress
NAME           CLASS    HOSTS                       ADDRESS   PORTS   AGE
mini-ingress   <none>   www.svc1.com,www.svc2.com             80      44m
# 完整资源清单
apiVersion: "v1"
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

---

apiVersion: "v1"
kind: Service
metadata:
  name: service1
spec:
  selector:  # 标签选择器
    app: nginx   # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
  type: ClusterIP
  ports:
  - port: 80  # 对外暴露80端口
    targetPort: 80  # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上

---
apiVersion: "v1"
kind: Service
metadata:
  name: service2
spec:
  selector:  # 标签选择器
    app: nginx   # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
  type: ClusterIP
  ports:
  - port: 80  # 对外暴露80端口
    targetPort: 80  # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
    
---

apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations:  # 添加注解
    # nginx.ingress.kubernetes.io/rewrite-target: "/"  # 被此ingress路由的请求,都将会被重定向到网站根(/)目录下的内容。
    # kubectl get ingressclasses.networking.k8s.io此命令可以查看你的ingres类,NAME字段就是你的ingress类
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  rules:
  - host: www.svc1.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service1
            port:
              number: 80
  - host: www.svc2.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service2
            port:
              number: 80
# 做域名解析即可访问
[root@master ingress]# echo "192.168.93.147 www.svc1.com" >> /etc/hosts
[root@master ingress]# echo "192.168.93.147 www.svc2.com" >> /etc/hosts


[root@master ingress]# curl http://www.svc1.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
...


[root@master ingress]# curl http://www.svc2.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
...

五、转发到默认Service

  • 下面的Ingress对象会将请求www,svc1.com的流量路由到service1,将请求www.svc2.com的流量路由到service2,而将所有其他流量路由到service3
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations:  # 添加注解
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  rules:
  - host: www.svc1.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service1
            port:
              number: 80
  - host: www.svc2.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service2
            port:
              number: 80
# 其他规则路由到service3上
  - http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: service3
            port:
              number: 80

六、TLS证书加密

  • 你可以通过设定包含TLS私钥和证书的Secret(用于存储敏感信息,如密码、OAuth令牌和SSH密钥)来保护Ingress。Ingress资源只支持一个TLS端口443,并假定TLS连接终止于Ingress节点(与Service及其Pod间的流量都以明文传输)。如果Ingress中的TLs配置部署制定了不同主机,那么它们将通过SNI TLS扩展指定的主机名(如果Ingress控制器支持SNI)在同一端口上进行复用。TLS Secret的数据中必须包含键名为tls.crt的证书和键名为tls.key的私钥,才能用于TLS目的。

6.1、创建Openssl生成证书

  • openssl是目前最流行的SSL密码库工具,其提供了以恶通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现。
# 创建证书存放路径
[root@master ingress]# mkdir /usr/local/ssl


# 生成证书
[root@master ingress]# openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /usr/local/ssl/nginx.key -out /usr/local/ssl/nginx.crt
Generating a 2048 bit RSA private key
..........+++
...................................+++
writing new private key to '/usr/local/ssl/nginx.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HE
Locality Name (eg, city) [Default City]:Zheng Zhou
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:

# openssl req生成证书
# -x509 输出 x509 结构而不是证书。
# -nodes 不加密输出密钥
# -days -x509 生成的证书的有效天数。
# -newkey rsa:2048 生成大小为"位"的新 RSA 密钥
# -keyout 要将密钥发送到的文件
# -out 输出文件

6.2、base64加密证书数据

# 公钥
[root@master ingress]# base64 /usr/local/ssl/nginx.crt 
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsekNDQW4rZ0F3SUJBZ0lKQVArSUF0Tmla
RHI5TUEwR0NTcUdTSWIzRFFFQkN3VUFNR0V4Q3pBSkJnTlYKQkFZVEFrTk9NUXN3Q1FZRFZRUUlE
QUpJUlRFVE1CRUdBMVVFQnd3S1dtaGxibWNnV21odmRURWNNQm9HQTFVRQpDZ3dUUkdWbVlYVnNk
Q0JEYjIxd1lXNTVJRXgwWkRFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1DQVhEVEkwCk1EZ3hO
REV6TWprek1sb1lEekl4TWpRd056SXhNVE15T1RNeVdqQmhNUXN3Q1FZRFZRUUdFd0pEVGpFTE1B
a0cKQTFVRUNBd0NTRVV4RXpBUkJnTlZCQWNNQ2xwb1pXNW5JRnBvYjNVeEhEQWFCZ05WQkFvTUUw
UmxabUYxYkhRZwpRMjl0Y0dGdWVTQk1kR1F4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERDQ0FT
SXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1rcTl2bGxlYW9HUFphVVcy
WEVRZmtBL0tNS0NsS2xnMVhwZHNaUEVRNVgKZk1uaG1WRkRabVlwWW9vL2NYcHo5YW10R0FMNk8x
TTd2M3E3UFFQY0Z4M2htOHRvQ1kxMmlPYnZXd2VQQjNTeQo5enhhbDZrdDhhZVlDVzdGYlowb1pi
ZXVzRzhtRHloWlJPczQyaHpOckZFQjB3QnorVFJpYkptWWx3dDhGUy9NCnNsUFVENTZyUDZBeGRq
bStRWHRrU1d5dDNqK1IrblZ1aFBYY1F6bVlZaWJ3TzJyYnJ4VG9GcjVlV1ZwbHlDSisKZElDTjlY
Y0o2dmx5M2t5SGVNQlJuU01iR2J1Tm1DRkJGcjlwdS80OW16MGwvN2MvVnY4Yk9Dc0NUeXJWYjBu
KwpBVlZFeVdGRjNUNXo5cjZBc2ltbDhjbVZIL3hYNHovaDNSdkV6T052UGJrQ0F3RUFBYU5RTUU0
d0hRWURWUjBPCkJCWUVGUG14bHlDYXRlZTJKZld0NWd4RWVUaE9kb3N1TUI4R0ExVWRJd1FZTUJh
QUZQbXhseUNhdGVlMkpmV3QKNWd4RWVUaE9kb3N1TUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29a
SWh2Y05BUUVMQlFBRGdnRUJBSllDWXNLWQoyOHBIM1htcm9mT1plUUl1STd1QWpUQ3kxVFpWeHU1
bzJSVGJacDRKd2lQMkpSQWlUWGlkYU16aDE5RGVob2M1CkFTZ0ZKeW5QNU1SNzYvcGhKQ1FjeVNF
bG9KL2V5Z09TcTdLUWpBaCtPZnAyT0g4bXZqby9uMHZBdkI3L21nWEoKRU8rQjZXQTd6b2VocnF6
R0hwZ3RvekovY1hGOEFQRDU4b1BGc3RteC9jYkdaQjBYekRJMXJ0SXpJZG1YVmxUegpZejBnU0RR
aVh4Mkg1QlN2TGo0eHRIMlh6ODlXQ052TlU2TGpySTk3QTk4N0xkSWNvK2lOVVlKQWxLSnpyd3JQ
CkhUQjVSZG9tNWZBbXRrZG1DbWlYTGlKenE0UEVLdm9GaHVvdDI1bmN6a3h0bUd3NWN5cFZlNlc5
clRXdWhlUS8KU2Y2UzA2OTFhWURTaTZnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
# 私钥
[root@master ingress]# base64 /usr/local/ssl/nginx.key 
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZB
QVNDQktnd2dnU2tBZ0VBQW9JQkFRREpLdmI1WlhtcUJqMlcKbEZ0bHhFSDVBUHlqQ2dwU3BZTlY2
WGJHVHhFT1Yzeko0WmxSUTJabUtXS0tQM0Y2Yy9XcHJSZ0MranRUTzc5Ngp1ejBEM0JjZDRadkxh
QW1OZG9qbTcxc0hqd2Qwc3ZjOFdwZXBMZkdubUFsdXhXMmRLR1czcnJCdkpnOG9XVVRyCk9Ob2N6
YXhSQWRNQWMvazBZbXlabUpjTGZCVXZ6TEpUMUErZXF6K2dNWFk1dmtGN1pFbHNyZDQva2ZwMWJv
VDEKM0VNNW1HSW04RHRxMjY4VTZCYStYbGxhWmNnaWZuU0FqZlYzQ2VyNWN0NU1oM2pBVVowakd4
bTdqWmdoUVJhLwphYnYrUFpzOUpmKzNQMWIvR3pnckFrOHExVzlKL2dGVlJNbGhSZDArYy9hK2dM
SXBwZkhKbFIvOFYrTS80ZDBiCnhNempiejI1QWdNQkFBRUNnZ0VBYjIrdGdGb0dHM2w1aElDS1lN
Vm5CbGpWbWp0bG5JS3pUbFFWeDZUay9kelkKODd4VkFmOGtLbE9pa3BLeWVmTGlreXVmc1lhTWRu
OFNneHBWb2wyNU1JUlptVVA0aHJTekFicDE0cW9JcDB5OApTR0ttd01FQ3JLUThGWENvVi9hWTRq
ZVM1UDlnUmltdFUrQWFjdm84Q21QSVR1ZnZsR1V4WTZSemg1a2s0MlMxCnRYN0NXSHBkS05Fb1M1
M3dHVS9rNVNpeGZrTzRNUmJEemloaFRPcDVwYUpINWxQOTh6T0NjdnZLUW9WNUt1R0QKeUVVeS9v
dS91eCtoalplYnhVV3VScnhrckN6WkhuQlFTSXA3NDk0Z0ZmbXkxSms1aTVlVnRuN0MzWUIxN3Rv
aAp2VDZIanBRWWxRM2JsYWlrdUJCK2RrZU9sSERvekZaeS9kRDVvT3hBQVFLQmdRRGxDbk5tanJV
NFFDWENEVk5DCi84YUtyQ1RyeE1IZDUwTkpMME12MjdUeTRaaEU0ZWFnSHZjVlg4YUxXQjFLcXN1
aENPUVRnU2lSZlFmeFNkUHYKOUJqVERSTGxLdXhLKzNYSWlhdzd2VWRKZFh0bkMyVHpSbjBCcTV3
QldjcXJBRHpuTGZSVFZOemJyK2crOGZKQwo1d1BlSGpHUnpkQzh3YWtNaERzdWxRaGFPUUtCZ1FE
ZzJLSkU3MzJhMEtndkxQQW9aeFVEaWl1WURzMTRsaS9UCkp2bzR5WTJrTDE4V29TRjdPTlljOTBI
MjNRMkRWUHhsdTRWY1dXYWJxblJ0TXdua2J3U2pvMU9hMWp0Kzc4d2EKc3dOTzlmbktCY09VMk9Y
cEtNSVZBSTJBUnBVUTVyR0hOQS9IVFlwMjhYS3FrdDk3alovLy9YdXFhbzN3ZUNKNgo3WHQyZHpQ
L2dRS0JnUUNpaFNyam4rbVpFM04zWVlzdUpGNFdNaFkwc2JXNnBvbkpHVjg4UzFMM2NQcGlEa1Zl
Cll2cUNVU2FKNDZsTlBTb21oeStIWTRPTTBNSmRCVHo4ckNFZFNNNmFqRDJFNnk5bGI4TWwxS1lM
eXZBWWF5NWoKclNXd2xMdXEvYkxnYWRmTlZuOWl6Zm0xYlBtSUNKZ1Z2dVN3ckk0UjNvLzZFQlRM
QzkwT3JiTnlpUUtCZ0g1VgpXajl2Yk55S3RxVGpGQUV2Z2lBZUIwYUZzcTg1ZTUraGUrQmlad0pF
VjZJb1lONlNYY09pcmQ2ZDc1VEdNSmFjCm1WNzlJR2tBaWpBOUNDYmd0Zk9YdGtiK2JpbHhaUFh2
ZFVGdGRhOHNNK3N6UDJNVk1vK0lZdmtiTDNCeW5uY0EKS29scUtRMlJ0a0xmQ1ZDcmo2WE84Q2dk
ZktrTFp4dzR5VEVUNHhTQkFvR0JBSmRidWdkb0E5ZmhRKzlIRDQwNQpkWVlJSzNWUHAvVm11dmNX
N0QzQk82dVlNVzlmT0tpcEpaemlYN3BwK3pVVHN0WTVmUUp5N3ZnZXNwSElIdTZkClBpOUZzVEp5
TUt6QWdtZVJVRFU1Q0NMaURuNmpGQXpZeVR6YVo0ME0rdWZhZmVuYUxhNDMrY00vMDdTRUFSM0YK
bUZ3ZHVrRG1vZFk4bWp0KytZU3paRlNkCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K

6.3、创建Secret存储

[root@master ingress]# cat secret.yaml 
apiVersion: "v1"
kind: Secret
metadata:
  name: nginx-https-tls
  namespace: default
data:
  tls.crt: # base64加密的公钥数据放到此位置
  tls.key: # base64加密的私钥数据放到此位置
type: kubernetes.io/tls
# 部署资源
[root@master ingress]# kubectl apply -f secret.yaml 
secret/nginx-https-tls created

6.4、配置Ingress资源

  • 在Ingress中引用此Secret将会告诉Ingress控制器使用ELS加密从客户端到负载均衡器的通道。
  • 注意:不能针对默认规则适用TLS,因为这样做需要为所有可能的子域名签发证书。因此tls字段中的hosts的取值需要与字段中的host完全匹配。
[root@master ingress]# cat ingress.yaml
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations:  # 添加注解
    kubernetes.io/ingress.class: "nginx"  # 指定 ingress 类,表示这个ingress资源被哪个ingress控制器处理
spec:
  tls:   # 添加TLs
  - hosts:
      - www.svc1.com   # 针对这个域名
  rules:
  - host: www.svc1.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service1
            port:
              number: 80
  - host: www.svc2.com   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service: 
            name: service2
            port:
              number: 80

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/871839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1&#xff09;菜单实现 2&#xff09;进度条实现 3&#xff09;main函数实现 4&#xff09;Game函数 5&#xff0…

【系统架构设计】软件架构设计(2)

【系统架构设计】软件架构设计&#xff08;1&#xff09; 软件架构概述架构需求与软件质量属性软件架构风格层次系统架构风格面向服务的架构SOA概述微服务微服务和SOA差异 软件架构概述 架构需求与软件质量属性 软件架构风格 层次系统架构风格 面向服务的架构 SOA概述 面…

C语言手撕实战代码_循环单链表和循环双链表

C语言手撕实战代码_循环单链表和循环双链表 循环单链表习题1.建立带头结点的循环链表2.设计一个算法&#xff0c;将一个带有头结点的循环单链表中所有结点的链接方向逆转3.设计一个算法,将一个循环单链表左移k个结点4.设计一个算法将循环单链表中的结点p的直接前驱删除5.设计算…

游泳耳机品牌前十名哪个牌子好?如何选高配游泳耳机不花冤枉钱?

在快节奏的现代生活中&#xff0c;音乐已成为许多人放松和充电的重要方式之一。无论是晨跑、通勤还是健身&#xff0c;音乐总能陪伴我们度过每一个瞬间。而对于游泳爱好者来说&#xff0c;能够在水中享受音乐&#xff0c;更是将这一运动提升到了一个新的层次。然而&#xff0c;…

uniapp/uniapp x总结

uni-app组成和跨端原理 上图所诉 App的渲染引擎&#xff1a;同时提供了2套渲染引擎&#xff0c;.vue页面文件由webview渲染&#xff0c;原理与小程序相同&#xff1b;.nvue页面文件由原生渲染&#xff0c;原理与react native相同。开发者可以根据需要自主选择渲染引擎。 uniapp…

【unity小技巧】获取免费开源的人物模型,并为obj fbx人物模型绑定骨骼、动画——mixamo的使用介绍

文章目录 前言地址上传自己的3D角色下载单动画下载动作包角色模型导入Unity动画导入unity设置动画骨骼动画骨骼不配的问题参考完结 前言 其实前面我已经推荐了几种获取人物模型的方法&#xff1a; 1、【unity小技巧】下载原神模型&#xff0c;在Blender中PMX模型转FBX模型&…

多商户商品下单限购问题修复

问题: 当商品设置限购为 1 时,够买数量未超过限购,但是还是提示超出限购数量 修复方法: 修改代码路径: app\common\repositories\store\order\StoreOrderCreateRepository.php 修改代码一: i s p a y s a r r a y u n i q u e ( a r r a y c o l u m n ( is_pays array_un…

Python 设置Excel工作表页边距、纸张大小/方向、打印区域、缩放比例

在使用Excel进行数据分析或报告制作时&#xff0c;页面设置是确保最终输出效果专业、美观的关键步骤。合理的页面设置不仅能够优化打印效果&#xff0c;还能提升数据的可读性。本文将详细介绍如何使用Python操作Excel中的各项页面设置功能。 目录 Python 设置Excel工作表页边…

AutosarMCAL开发——基于EB FEE驱动

这目录 1. FEE原理2.EB配置以及接口应用3.总结 1. FEE原理 在Fls解析文章中介绍了Flash与EEPROM储存器的区别&#xff0c;本文将介绍FEE具体实现原理。 FEE模块&#xff0c;全称Flash EEPROM Emulation Module&#xff0c;旨在使用Flash模拟EEPROM以增加使用寿命。 术语解释 p…

CTFHUB | web进阶 | JSON Web Token | 无签名

一些JWT库也支持none算法&#xff0c;即不使用签名算法。当alg字段为空时&#xff0c;后端将不执行签名验证 开启题目 账号密码随便输&#xff0c;登录之后显示只有 admin 可以获得 flag 在此页面抓包发到 repeater&#xff0c;这里我们需要用到一个 Burp 插件&#xff0c;按图…

瑞吉外卖-登录时报错:接口404异常

一、错误描述 出现“系统接口404异常”的弹窗&#xff0c;同时一直显示登录中&#xff0c;而无法跳转到后台页面。 二、解决方法 1. 检查浏览器的网址 确保为localhost:8080/backend/page/login/login.html&#xff0c;而不是idea自动生成的&#xff0c;修改过来即可。 2.确…

Unity XR Interaction Toolkit 通过两个手柄控制物体放大缩小

1&#xff1a;给物体添加 XR General Grab Transformer 脚本 2&#xff1a;XR Grab Interactable 的 select mode 选择 Multiple

SpringIoCDI

前言&#x1f440;~ 上一章我们介绍了Spring MVC&#xff0c;今天介绍Spring核心功能之一IoC Spring到底是什么&#xff1f; Spring IoC 什么是 IoC 容器&#xff1f; IoC 介绍 DI 介绍 IoC详解 获取Bean对象的其他方式 Bean的存储 方法注解 Bean 扫描路径 DI详解 …

拼图游戏02

文章目录 概要整体架构流程代码过程小结 概要 现在需要将图片添加界面中 关键点在于它如何动态地根据游戏状态更新用户界面。它使用了Swing的布局管理器来定位组件&#xff0c;并且通过ImageIcon和JLabel来显示图像。注意&#xff0c;路径字符串中的反斜杠在Java中是转义字符…

选择排序(直接选择排序和堆排序)

一、直接选择排序 1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。 2.动图展示 3.思路讲解 ①在元素集合array[i]—array[n-1]中选择关键码最大&…

以简单的例子从头开始建spring boot web多模块项目(一)

目的&#xff1a;从头梳理&#xff0c;如何手工从头建立多模块项目。 步骤&#xff1a; 1、建立maven项目,类型&#xff1a;maven Archetype&#xff0c;Name:ParentDemo 选择JDK版本&#xff0c;Archetype&#xff1a;org.apache.maven.archetypes:maven-archetype-quickstart…

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议&#xff0c;其…

《图解设计模式》笔记(四)分开考虑

九、Bridge模式&#xff1a;将类的功能层次结构与实现层次结构分离 类的两个层次结构和作用 类的功能层次结构&#xff1a;希望增加新功能时 父类有基本功能&#xff0c;在子类中增加新功能 Something父类 …├─SomethingGood子类 想要再增加新功能 Something父类 …├─So…

Windows All download

前言 微软家族产品下载HEU_KMS_Activator download Windows PC desktop download 微软官网all 地址&#xff0c;地址1国内镜像地址&#xff0c;地址1 Windows 常规使用&#xff0c;运维&#xff0c;部署csdn 专栏 &#xff0c;付费专栏 参考 版本微软官网Windows 7,8,10,…

hyperf 协程作用和相关的方法

什么是协程 协程是一种轻量级的线程&#xff0c;由用户代码来调度和管理&#xff0c;而不是由操作系统内核来进行调度&#xff0c;也就是在用户态进行 判断当前是否处于协程环境内 在一些情况下我们希望判断一些当前是否运行于协程环境内&#xff0c; 对于一些兼容协程环境与…