Ingress

Ingress是另一种资源,与Service资源不同。

Ingress资源与Service资源可以是一对多,即Ingress对象只需要一个公网IP,就能为多个Service提供访问,架构如下:

通过一个Ingress暴露多个Service

Ingress工作在应用层(HTTP),因此可以提供基于cookie的会话亲和性(session affinity)等功能。

Tips: 因为Service对象默认是工作在传输层(TCP、UDP),因此无法提供基于HTTP的相关功能。

创建Ingress

下面展示了一个创建Ingress的YAML配置文件:

apiVersion: extensions/v1beta1
kind: Ingress    # 资源类型是Ingress
metadata:
  name: kubia
spec:
  tls:    # 当需要使用TLS时,也就是客户端通过HTTPS与Ingress控制器交互时,才需要加
  - hosts:
    - kubia.example.com    # 将接收访问kubia.example.com主机的TLS连接
    secretName: tls-secret    # 存放了TLS私钥和证书的Secret资源名
  rules:
  - host: kubia.example.com
    http:    # 转发HTTP流量
      paths:
      - path: /kubia    # 将kubia.example.com/kubia的请求转发至kubia服务
        backend:
          serviceName: kubia    # 后端的Service名
          servicePort: 80        # Service暴露的Port
      - path: /foo    # 将kubia.example.com/foo的请求转发至bar服务
        backend:
          serviceName: bar    # 后端的Service名
          servicePort: 80
   - host: foo.example.com
     http:
       paths:
       - path: /foo    # 将foo.example.com/foo的请求转发至foo服务
         backend:
           serviceName: foo    # 后端的service名
           servicePort: 80

访问Ingress

假设通过kubectl get ingresses查看Ingress资源对象的相关信息如下(此处的Ingress后端只有一个Service,且将该Service映射的路径为http://kubia.example.com/):

>>> get ingresses -o wide
NAME    HOSTS               ADDRESS          PORTS   AGE
kubia   kubia.example.com   192.168.99.106   80      39s

Tips: ADDRESS即Ingress监听的地址,HOSTS为映射的路径列表,若在配置文件中映射了多个host,那么这里都会显示出来。

在生成名为kubia的Ingress资源对象后,在客户端所在的DNS列表中,需要加上如下的解析条目:

192.168.99.106    kubia.example.com

然后,通过在客户端中访问http://kubia.example.com即可间接访问到Service。

Ingress处理TLS传输

这里的Ingress处理TLS传输,是指客户端与Ingress控制器之间,控制器和Pod之间还是通过HTTP传输。

通过下面两步可以实现目标:

  1. 创建私钥和证书;

  2. 创建包含私钥和证书的Secret资源;

  3. 将Secret对象绑定至Ingress对象中;

创建私钥和证书

使用openssh命令创建私钥,文件名为tls.key

openssl genrsa -out tls.key 2048

使用openssl命令创建证书,文件名为tls.cert

openssl req -new -x509 -key tls.key -out -tls.cert -days 360 -subj /CN=kubia.example.com

创建Secret资源

这里直接使用命令创建tls类型的Sercret资源,该资源包含刚刚创建的私钥和证书文件,资源名为tls-secret

kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key

将Secret资源绑定至Ingress对象中

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubia
spec:
  tls:    # 使用TLS连接
  - hosts: 
    - kubia.example.com    # 接收访问kubia.example.com的TLS连接
    secretName: tls-secret    # 需要绑定的Secret资源的名字
  rules:
  - host: kubia.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kubia-nodeport
          servicePort: 80

查看Secret资源,可以看到PORTS列中多了一个443端口,即HTTPS:

NAME    HOSTS               ADDRESS          PORTS     AGE
kubia   kubia.example.com   192.168.99.106   80, 443   17h

访问Ingress

现在可以通过HTTPS访问Ingress资源:

curl -k https://kubia.example.com

Tips: -k--insecure,以非安全模式访问

Last updated

Was this helpful?