Ingress的策略配置技巧

   为了实现灵活的负载分发策略,Ingress策略可以按多种方式进行配置,下面对几种常见的Ingress转发策略进行说明。

1.转发到单个后端服务上

    基于这种设置,客户端到Ingress Controller的访问请求都将被转发到后端的唯一Servie上,在这种情况下Ingress无须定义任何Rule。

    通过如下所示的设置,对Ingress Controller的访问请求都将被转发到“myweb:8080”这个服务上。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  backend:
    serviceName: myweb
    servicePort: 8080

   2.同一个域名下,不同的URL路径被转发到不同的服务商

       在这种配置常用于一个网站通过不同的路径提供不同的服务的场景,例如/web表示访问WEB页面,/api表示访问AOI接口,对应到后端的两个服务,通过Ingress的设置很容易就将基于URL路径的转发规则定义出来。

    通过如下所示的设置实现:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - host: mywebsite.com
    http:
      paths:
      - path: /web
        backend:
          serviceName: web-service
          servicePort: 80
      - path: /api
        backend:
          serviceNmae: api-service
          servicePort: 8081

对“mywebsite.com/web”的访问被转发到“web-service:80”服务上;对“mywebsite.com/api”的访问被转发到“api-service:8081”

3.不同的域名(虚拟主机名)被转发到不同的服务上

   这种配置常用语一个网站通过不同的域名或虚拟主机名提供不同服务的场景,例如foo.bar.com域名由service1提供服务,bar.foo.com域名由service2提供服务。

   通过如下所示的设置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
        serviceName: service1
        servicePort: 80
  - host: bar.foo.com
    http:
      paths:
      - backend:
        serviceName: service2
        servicePort: 80

对“foo.bar.com”的访问请求将被转发到“service1:80”服务上,对“bar.foo.com”的访问请求将被转发到“service2:80”

服务上。

4.不同域名的转发规则

   这种配置用于一个网站不使用域名直接提供服务的场景,此时通过任意一台运行ingress-controller的Node都能访问到后端的服务。

   以上节的后端服务webapp为例,下面的配置为将“<ingress-controller-ip>/demo”的访问请求转发到“webapp:8080/demo”服务上:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
  - http:
    paths:
    - path: /demo
      backend: 
        serviceName: webapp
        servicePort: 8080  

       注意,使用无域名的Ingress转发规则时,将默认禁用非安全HTTP,强制启用HTTPS。例如,当使用Nginx作为Ingress Controller时,在其配置文件/etc/nginx/nginx.conf中将会自动设置下面的规则,将全部HTTP的访问请求直接返回301错误:

if ($pass_access_scheme = http ){
    return 301 https://$best_http_host$request_uri;
}

使用HTTPS能够访问成功:

curl -k https://192.168.18.3/demo/

可以在Ingress的定义中设置一个annotation“ingress.kubernetes.io/ssl-redirect=false”来关闭强制启用HTTPS的设置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
    paths:
    - path: /demo
      backend: 
        serviceName: webapp
        servicePort: 8080  
curl  http://192.168.18.3/demo/

Ingress的TLS安全设置

  为了Ingress提供HTTPS的安全访问,可以为Ingress中的域名进行TLS安全证书的设置。设置的步骤如下。
(1)创建自签名的密钥和SSL证书文件。
(2)将证书保存到Kubernetes中的一个Secret资源对象上。
(3)将该Secret对象设置到Ingress中。
根据提供服务的网站域名是一个还是多个,可以使用不同的操作完成前两步SSL证书和Secret对象的创建,在只有一个域名的情况下设置相对简单。第3步对于这两种场景来说是相同的。
对于只有一个域名的场景来说,可以通过OpenSSL工具直接生成密钥和证书文件,将命令行参数-subj中的/CN设置为网站域名:

openssl req -x509 --nodes -days 5000 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=mywebsite.com"

上述命令将生成tls.key和tls.crt两个文件。
然后根据tls.key和tls.crt文件创建secret资源对象,有以下两种方法。

方法一:使用kubectl create secret tls命令直接通过tls.key和tls.crt文件创建secret对象。

kubectl create secret tls mywebsite-ingress-secret --key tls.key --cret tls.crt

方法二:编辑mywebsite-ingress-secret.yaml文件,将tls.key和tls.crt文件的内容复制进去,使用kubectl create命令进行创建。

apiVersion:v1
kind: Secret
metadata:
  name: mywebsite-ingress-secret
type: kubernetes.op/tls
data:
  tls.crt:
MIIDA......................................
....
  tls.key:
MIEQER.........
...
kubectl create -f mywebsite-ingress-secret.yaml

如果提供服务的网站不止一个域名,例如前面第3种Ingress策略配置方式,则SSL证书需要使用额外的一个x509 v3配置文件辅助完成,在[alt_names]段中完成多个DNS域名的设置。

首先编写openssl.cnf文件,内容为:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = mywebsite.com
DNS.2 = mywebsite2.com

接着使用OpenSSL工具完成密钥和证书的创建。
生成自签名CA证书:

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -days 5000  -out ca.crt -subj "/CN=mywebsite.com"

基于openssl.cnf和CA证书生成ingress SSL证书:

openssl genrsa -out ingress.key 2048
openssl req -new -key ingress.key -out ingress.csr -subj "/CN=mywebsite.com" -config openssl.cnf
openssl x509 -req -in ingress.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out ingress.crt -days 5000 -extensions v3_req -extfile openssl.cnf

然后根据ingress.key和ingress.crt文件创建secret资源对象,同样可以通过kubectl create secret tls 命令或YAML文件生成。

kubectl create secret tls mywebsite-ingress-secret --key ingress.key --cert ingress.crt

至此,Ingress的TLS证书就被成功创建到Secret对象中了。

下面创建Ingress对象,在tls段引用刚刚创建好的Secret对象:

apiVersion: extensions/v1beta1
metadata:
  name: mywebsite-ingress-tls
spec:
  tls:
  - hosts:
    - mywebsite.com
    serviceName: nywebsite-ingress-secret
  rules:
  - host: mywebsite.com
    http:
      paths:
      - path: /demo
        backend:
        serviceName: myweb
        servicePort: 8080

之后,就可以通过HTTPS来访问mywebsite.com了。
以curl为例,访问https://192.168.18.3/demo/:

curl -H 'Host:mywebsite.com' -k https://192.168.18.3/demo/

如果是通过浏览器访问的,则在浏览器的地址栏输入https://mywebsite.com/demo/来访问Ingress提供的服务,浏览器会提示不安全,单击“继续前往mywebsite.com(不安全)”标签,访问后可看到Ingress后端服务提供的页面.

 

小结:

        到这里DNS服务就全部讲解完了,应该有很多人看的不是很明白,可以自己实践一下,遇到什么问题可以联系我哦、

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐