【Kubernetes】Ingress 策略配置与 TLS 传输

640 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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
...