一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
一、不同的 Ingress
策略配置类型
对于后端服务的访问规则全部都需要在 Ingress
中进行配置。常用的如下几种:
- 不使用域名,转发到单个后端服务
- 不使用域名,不同的 URL 路径被转发到不同的服务
- 同一域名,不同的 URL 路径被转发到不同的服务
- 不同的域名,转发到不同的服务
(1)不使用域名,转发到单个后端服务
这种配置适用的场景是:网站不使用域名,直接通过运行 Ingress Controller 的 Node IP 地址访问后端服务。
Ingress Controller 将来自客户端的请求全部转发到后端的单一服务上,比如把对 Ingress Controller 全部的请求都转发到 nginx:80 服务上:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
spec:
serviceName: nginx # 对外暴露 Service 的名称为 nginx
servicePort: 80 # nginx Service 的 ClusterPort 为 80
使用无域名的 Ingress 转发规则会默认禁用非安全 HTTP,强制使用 HTTPS 访问。
(2)不使用域名,不同的 URL 路径被转发到不同的服务
即使不使用域名,也可以配置对于不同 URL 路径的访问请求转发到不同的服务上。
比如对 <NodeIP>/courses
的请求转发到 courses:8080 服务上;对 <NodeIP>/louplus
的请求转发到 louplus:8081 服务上:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-shiyanlou
spec:
rules:
- http:
paths:
- path: /courses
backend:
serviceName: courses
servicePort: 8080
- path: /louplus
backend:
serviceName: louplus
servicePort: 8081
(3)同一域名,不同的 URL 路径被转发到不同的服务
不过通常情况下,还是推荐使用域名的,这样更加方便外部客户端的访问。使用域名访问网站,通过不同的路径提供不同的服务。
比如对 www.shiyanlou.com/courses 的请求转发到后端 courses:8080 服务上;对 www.shiyanlou.com/vip 的请求转发到后端 vip:2000 服务上:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-shiyanlou
spec:
rules:
- host: www.shiyanlou.com
http:
paths:
- path: /courses
backend:
serviceName: courses
servicePort: 8080
- path: /vip
backend:
serviceName: vip
servicePort: 2000
(4)不同的域名,转发到不同的服务
同样也可以配置通过不同的域名提供不同的服务。
比如对 courses.shiyanlou.com 的请求转发到后端 courses:8080 服务上;对 vip.shiyanlou.com 的请求转发到后端 vip:2000 的服务上:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-shiyanlou
spec:
rules:
- host: courses.shiyanlou.com
http:
paths:
- backend:
serviceName: courses
servicePort: 8080
- host: vip.shiyanlou.com
http:
paths:
- backend:
serviceName: vip
servicePort: 2000
二、配置 Ingress
处理 TLS
传输
如果想要使用 HTTPS 访问,则需要配置 Ingress 支持 TLS。
在 Kubernetes 集群中的 Pod 上运行的是 web 服务器,在集群内部通信使用的是 HTTP 协议。那么只需要 Ingress Controller 处理 HTTPS 连接的相关内容即可。
具体的操作步骤为:
- 创建自签名的密钥和 SSL 证书文件;
- 将证书保存到 Kubernetes 中的 Secret 资源对象上;
- 将 Secret 对象添加到 Ingress 中。
(1)创建自签名的密钥和 SSL 证书文件
使用 OpenSSL 工具生成密钥和证书文件:
# CN=nginx.kube.com 用于指定网站域名
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-kube.key -out nginx-kube.crt -subj "/CN=nginx.kube.com"
Generating a 2048 bit RSA private key
.................................................................+++
......................+++
writing new private key to 'nginx-kube.key'
-----
生成了两个文件,分别为 nginx-kube.key 和 nginx-kube.crt。
(2)将证书保存到 Kubernetes 中的 Secret 资源对象上
使用命令 kubectl create secret tls 创建 Secret 资源对象:
$ kubectl create secret tls nginx-kube-secret --key nginx-kube.key --cert nginx-kube.crt
secret/nginx-kube-secret created
(3) 将 Secret 对象添加到 Ingress 中。
修改前面的 ingress.yaml
文件
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
spec:
tls: # 在 tls 字段下进行配置
- hosts:
- nginx.kube.com # 域名
secretName: nginx-kube-secret # 对应的 secret
rules:
- host: nginx.kube.com
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
更新配置信息:
$ kubectl apply -f ingress.yaml
# 查看更新后的 ingress,可以看到开放了 443 端口
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
ingress-nginx nginx.kube.com 10.106.187.230 80, 443 51m
$ curl -k -v https://nginx.kube.com
* Rebuilt URL to: https://nginx.kube.com/
* Trying 10.192.0.3...
* Connected to nginx.kube.com (10.192.0.3) port 443 (#0)
...
* subject: CN=nginx.kube.com
...