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=NodePort
或Service.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
处理或者作与Prefix
或Exact
类型相同的处理。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.name
和service.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