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

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控制器操作略有不同。
bash 复制代码
[root@master ~]# kubectl apply -f deploy.yaml 

2.2、最小Ingress资源

yaml 复制代码
[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的端口
yaml 复制代码
# 以下是一个完整的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
              
       
cmd 复制代码
# 你可以通过查看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:
yaml 复制代码
[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
bash 复制代码
# 查看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头部字段来路由请求
yaml 复制代码
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
bash 复制代码
# 查看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
yaml 复制代码
# 完整资源清单
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
bash 复制代码
# 做域名解析即可访问
[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
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:
  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协议的实现。
bash 复制代码
# 创建证书存放路径
[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加密证书数据

bash 复制代码
# 公钥
[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==
bash 复制代码
# 私钥
[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存储

yaml 复制代码
[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
bash 复制代码
# 部署资源
[root@master ingress]# kubectl apply -f secret.yaml 
secret/nginx-https-tls created

6.4、配置Ingress资源

  • 在Ingress中引用此Secret将会告诉Ingress控制器使用ELS加密从客户端到负载均衡器的通道。
  • 注意 :不能针对默认规则适用TLS,因为这样做需要为所有可能的子域名签发证书。因此tls字段中的hosts的取值需要与字段中的host完全匹配。
yaml 复制代码
[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
相关推荐
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0663 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
木子Linux3 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
凌虚4 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
探索云原生8 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳8 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
橙子家9 小时前
关于 K8s 的一些基础概念整理-补充【k8s系列之五】
k8s
jwolf29 小时前
基于K8S的微服务:一、服务发现,负载均衡测试(附calico网络问题解决)
微服务·kubernetes·服务发现
nangonghen10 小时前
在华为云通过operator部署Doris v2.1集群
kubernetes·华为云·doris·operator
会飞的土拨鼠呀11 小时前
chart文件结构
运维·云原生·kubernetes