名词解析:上游服务器-----提供给外面服务的服务器集群(如nginx+tomcat,tomcat为上有服务器)
Ingress-nginx安装和部署参考网站:https://www.cnblogs.com/panwenbin-logs/p/9915927.html
待完善
实例1: session 有下面几种参数(测试了下面的yaml文件 ok)
1、nginx.ingress.kubernetes.io/affinity: “cookie” 设置关联项(nginx只支持cookie)
2、nginx.ingress.kubernetes.io/affinity-mode:"balanced or persistent" 需要扩展pod的时候需要启用,balanced(平衡)会重新分配某些会话,persistent(持久)能以最大程度保持会话粘性
3、nginx.ingress.kubernetes.io/session-cookie-name:“str”设置cookie的名称,默认INGRESSCOOKIE
4、nginx.ingress.kubernetes.io/session-cookie-path: “str”在cookie上设置路径(如果ingress位正则表达式的路径则必选该注释)
5、nginx.ingress.kubernetes.io/session-cookie-max-age: “number”设置cookie的过期时间
6、nginx.ingress.kubernetes.io/session-cookie-expires “number”设置cookie过期时间(为了与旧版浏览器兼容,和5可也同时设置)
7、nginx.ingress.kubernetes.io/session-cookie-change-on-failure: “true or false” 当访问cookie指向的服务失败时的处理方式。(true:指向另一个pod服务;false:还是原来的pod服务)
yaml文件
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- backend:
serviceName:
servicePort:
path: /
通过 curl -I rewrite.bar.com 可也看到一个返回头中含有set-cookie: route=……(或者直接通过浏览器也能查看到)
实例2:给访问加认证(需要通过输入账号密码访问)(测试ok)
有下面几个参数:
nginx.ingress.kubernetes.io/auth-type: “basic or digest” 定义验证类型
nginx.ingress.kubernetes.io/auth-secret: secretname 包含用户名和密码的一个secret(还可也写成namespace/secretname)
nginx.ingress.kubernetes.io/auth-secret-type: [auth-file|auth-map] 包含用户名和密码的一个文件
nginx.ingress.kubernetes.io/auth-realm: "realm string"
1、创建用户密码,执行下面命令会生成一个存放用户和密码的auth文件(添加用户时不用加-c参数)
htpasswd -c auth user1
New password:
Re-type new password:
Adding password for user user1
htpasswd auth user2
New password:
Re-type new password:
Adding password for user user2
[root@swarm-worker1 ~]# htpasswd -c auth user1
New password:
Re-type new password:
Adding password for user user1
[root@swarm-worker1 ~]# htpasswd auth user2
New password:
Re-type new password:
Adding password for user user2
[root@swarm-worker1 ~]# cat auth
user1:$apr1$/uHEcNGg$/FoE85bQ/Uxntr1RYvw0Z1
user2:$apr1$SUl9Dquw$pvdxcHzXVM63yt/RgEjZF.
2、根据生成的auth文件生成 secret
kubectl create secret generic secret-auth --from-file=auth -n
3、yaml文件----apply之后通过域名访问
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: auth-secret
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: secret-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required - foo"
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
测试:通过浏览器测试,输入rewrite.bar.com会要求输入用户名和密码。
实例3:客户端证书验证
nginx.ingress.kubernetes.io/auth-tls-secret: "secretName" tls证书的secret名称(也可以写成namespace/secretname)
nginx.ingress.kubernetes.io/auth-tls-verify-depth:“number” 验证深度(提供的客户端证书和颁发证书机构链之间的深度---不是太懂这个意思)
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on or off" 启动客户端证书的验证
nginx.ingress.kubernetes.io/auth-tls-error-page: "url" 如果证书验证错误,重定向给用户的url
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true or false" 确定是否要把接受到的证书发送给上游服务器 (默认关闭)
生成证书的操作步骤:(CA证书必须包含受信任的证书颁发机构链,以验证客户端证书)
1、生成CA密钥和证书
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=My Cert Authority'
2、生成服务器密钥和证书并使用CA证书进行签名:
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=mydomain.com' -----生成密钥
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -----使用CA证书进行签名并生成证书
3、生成客户端密钥和证书并使用CA证书进行签名:
openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=My Client' -----生成密钥
openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt -----使用CA证书进行签名并生成证书
4、创建secret
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt ---使用CA证书创建secret
kubectl create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.key ---使用经过CA签名的服务器证书创建secret
kubectl create secret generic ca-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt --创建包含CA证书和服务器证书的secret,该secret可同时用于TLS和客户端身份验证。
5、如果您还想启用证书吊销列表验证,则可以创建还包含PEM格式的CRL文件的secret:(不知道啥意思,没用到)
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt --from-file=ca.crl=ca.crl
需要有上面创建的一些证书才能完成下面的验证(测试不成功,后续再测试)
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "ca-secret"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://www.mysite.com/error-cert.html"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
name: nginx-test
namespace: default
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- backend:
serviceName: service-name
servicePort: service-port
path: /
tls:
- hosts:
- rewrite.bar.com
secretName: tls-secret
实例4: 外部认证 (只做记录,没去实验)
1、nginx.ingress.kubernetes.io/auth-url: "URL to the authentication service" 指定执行外部认证的url
2、nginx.ingress.kubernetes.io/auth-method:
3、ginx.ingress.kubernetes.io/auth-signin:
4、nginx.ingress.kubernetes.io/auth-response-headers:
5、nginx.ingress.kubernetes.io/auth-proxy-set-headers:
7、nginx.ingress.kubernetes.io/auth-cache-key:
8、nginx.ingress.kubernetes.io/auth-cache-duration:
9、nginx.ingress.kubernetes.io/auth-snippet:
实例5:设置全局外部认证:(待验证)
1、默认情况下,如果在NGINX ConfigMap中设置了global-auth-url,则控制器会将所有请求重定向到提供身份验证的现有服务。如果要为该入口禁用此行为,可以在NGINX ConfigMap中使用enable-global-auth:“ false”。
2、如果想要在某一个ingress规则上面不使用,则可也添加如下annotation:
nginx.ingress.kubernetes.io/enable-global-auth: “false” 默认为true
实例6:nginx----后端服务之间的协议设置(待验证)
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" 默认使用http,可使用的协议---
HTTP, HTTPS, GRPC, GRPCS and AJP
实例7:kubernetes基于nginx-ingress进行蓝绿部署/金丝雀发布(canary) (待测试)
使用场景:当你有两组服务时(service1、service2,两个不同的服务比如更新了某些功能)。之前你只需要访问service1,现在你需要将部分流量传入service2这时候便可也启用canary,他会根据你请求的header(key:value) cookie-name:value weight来决定流量转发到那个服务上
参考网站(http://idcsec.com/2019/09/12/kubernetes%E5%9F%BA%E4%BA%8Enginx-ingress%E8%BF%9B%E8%A1%8C%E8%93%9D%E7%BB%BF%E9%83%A8%E7%BD%B2-%E9%87%91%E4%B8%9D%E9%9B%80%E5%8F%91%E5%B8%83canary/)
1、nginx.ingress.kubernetes.io/canary: "true" 开启canary
2、nginx.ingress.kubernetes.io/canary-by-header: "str" 设置接收指定的header(key)
3、nginx.ingress.kubernetes.io/canary-by-header-value: "str" 设置接收指定header(value)
4、nginx.ingress.kubernetes.io/canary-by-cookie: "str" 设置接收指定cookie(key)
5、nginx.ingress.kubernetes.io/canary-weight: "number" 设置权重
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
-canary annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "version"
nginx.ingress.kubernetes.io/canary-by-header-value: "canary"
nginx.ingress.kubernetes.io/canary-by-cookie: "canary-cookie"
nginx.ingress.kubernetes.io/canary-weight:
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName: service-name
servicePort: service-port
带有 “version: canary” 头的请求都被发送到 canary 版本:curl -H "version: canary" -H "Host:rewrite.bar.com" rewrite.bar.com
不带有 “version: canary” 头的请求会根据权重转发到 canary 版本
cookie 的值为 always 转发给 canary, never不转发
示例:curl -v -b canary-cookie=always rewrite.bar.com # 访问金丝雀版本
示例:curl -v -b canary-cookie=never rewrite.bar.com # 访问非金丝雀版本
优先级:金丝雀规则按优先级进行评估。优先级如下:
canary-by-header-> cookie-by-canary-> canary-weight
限制:每个Ingress规则最多可以应用一个金丝雀入口。
实例7:设置客户端缓存区大小(待验证,不知道具体功能)
nginx.ingress.kubernetes.io/client-body-buffer-size: "1000" # 1000 bytes
nginx.ingress.kubernetes.io/client-body-buffer-size: 1k # 1 kilobyte
nginx.ingress.kubernetes.io/client-body-buffer-size: 1K # 1 kilobyte
nginx.ingress.kubernetes.io/client-body-buffer-size: 1m # 1 megabyte
nginx.ingress.kubernetes.io/client-body-buffer-size: 1M # 1 megabyte
实例8:cors(跨域资源共享)(待验证,不知道具体功能)
nginx.ingress.kubernetes.io/enable-cors: "true" 开启cors
nginx.ingress.kubernetes.io/cors-allow-methods: "method" 允许访问cors的方法(get post put….)
nginx.ingress.kubernetes.io/cors-allow-headers: "str" 允许访问cors的请求头
nginx.ingress.kubernetes.io/cors-allow-origin: "url" 限制需要用到的cors的url(也就是提供cors服务的地址,默认为所有,理解不对)
nginx.ingress.kubernetes.io/cors-allow-credentials: "true or false" 控制在CORS操作期间是否可以传递凭据 (默认true)
nginx.ingress.kubernetes.io/cors-max-age: "number" 控制可以将预检请求缓存多长时间
实例9:https访问
如果集群启动了TLS,则可也启动ssl-passthrough来启动TLS(当然也可也在应用中启动,也可也通过ingress-controller来启动)
1、通过 ssl-passthrough来启动(前提是集群开启了TLS),(该方法不能在后面写路径--待测试)
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
-
. .k8s.gigantic.io rules:
- host:
. .k8s.gigantic.io http:
paths:
- path: /
backend:
serviceName:
servicePort:
2、通过ingress-controller添加tls证书(测试ok)
. 首先需要创建证书和私钥
openssh req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt
--执行该命令后需要填写参数,common name 需要填写你想添加证书的域名,其他随便填(假设域名为tls.bar.com)
. 根据证书和私钥创建ingress的yaml文件锁需要的secret
kubectl create secret tls tls-secret --key tls.key --cert tls.crt -n namespace
创建ingress---(添加解析后直接通过浏览器访问https://tls.bar.com,或者curl -k https:tls.bar.com, -k必须参数表示信任自签名证书,不加报错)
yaml文件
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tls-test
spec:
tls:
- hosts:
- tls.bar.com
secretName: tls-secret
rules:
- host: tls.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
3、http访问会强制转成https访问方式(测试可也转,但是后端访问不了,报错)
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
4、如果ingress开启了TLS(表明要用https访问),这时我们访问http://rewrite.bar.com会重定向到308code(308 permanet redirect),这时候如果不想重定向到308,则可也使用ssl-redirect关闭,关闭后访问https://rewrite.bar.com和http://rewrite.bar.com是一样的效果。(测试ok,开启之后http也能访问)
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
tls:
- hosts:
- rewrite.bar.com
secretName: tls-secret
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
实例10:rate limiting (未验证)
Rate limiting:下面这些注释定义了对连接和传输速率的限制。这些可以用来减轻DDoS攻击
nginx.ingress.kubernetes.io/limit-connections: 一个IP地址允许的并发连接数。超出此限制时,将返回503错误。
nginx.ingress.kubernetes.io/limit-rps:每秒从给定IP接受的请求数。突发限制设置为限制的5倍。当客户端超过此限制时,将返回limit-req-status-code默认值:503。
nginx.ingress.kubernetes.io/limit-rpm:每分钟从给定IP接受的请求数。突发限制设置为限制的5倍。当客户端超过此限制时,将返回limit-req-status-code默认值:503
nginx.ingress.kubernetes.io/limit-rate-after:初始字节数限制为千字节,以后连接的响应传输速率将会被限制。
nginx.ingress.kubernetes.io/limit-rate:每秒允许给连接发送 千字节/秒的速率,零值不允许速率限制。
如果在一个Ingress规则中指定多个批注,限制则会按顺序应用限制
实例11:Temporal Redirect(时间重定向,使用场景待考究,已测试)
使用方法:加以下注释-----此注释使您可以返回时间重定向(返回代码302),而不是将数据发送到上游(必须写完整的网址---加https和http否则不生效----验证可也返回302)
nginx.ingress.kubernetes.io/temporal-redirect: https://www.google.com
实例12:使用配置configmap可以为与上游服务器的连接设置默认的全局超时。在某些情况下,要求具有不同的值。为此,我们提供了允许进行自定义的注释-----(待验证)
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" ---#连接超时时间,默认为5s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600" ---#后端服务器回转数据超时时间,默认为60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600" ---#后端服务器响应超时时间,默认为60s
nginx.ingress.kubernetes.io/proxy-body-size: "10m" ---#客户端上传文件,最大大小,默认为20m
nginx.ingress.kubernetes.io/proxy-next-upstream:
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout:
nginx.ingress.kubernetes.io/proxy-next-upstream-tries:
nginx.ingress.kubernetes.io/proxy-request-buffering:
实例13:ip限制----白名单(地址以逗号隔开)(测试结果ok)
nginx.ingress.kubernetes.io/whitelist-source-range
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range:
10.0.0.0/24,172.10.0.1
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
实例14:永久重定向到一个其他地址(测试ok)
nginx.ingress.kubernetes.io/permanent-redirect: www.baidu.com
访问这个ingress的地址rewrite.bar.com将会重定向到百度
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: www.baidu.com
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /
backend:
serviceName:
servicePort:
实例15:(待验证,验证看不出效果)
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
将www.domain.com重定向为domain.com,如果在某个时候通过ingress创建了一个新的domain.com则上面的注释自动失效。
实例16:域名路径重写:适用于在某些情况下,后端服务中公开的URL与ingress规则中指定的路径不同。如果不重写的话任何请求都将返回404,为了避免这个情况可也将实际路径写在nginx.ingress.kubernetes.io/rewrite-target 后面 (测试ok)
1、第一种用法,重写路径为/
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /foo
backend:
serviceName:
servicePort:
2、第二种用法:是用正则表达式来匹配输入的path,占位符$1,(可也使用nginx.ingress.kubernetes.io/use-regex: "true"来开启不区分大小写的正则表达式,默认关闭)
yaml文件:
[root@swarm-manager ingress]# cat rewrite-target.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
name: rewrite
namespace: default
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /foo/(.+)
backend:
serviceName:
servicePort:
- path: /foo/bar
backend:
serviceName:
servicePort:
- path: /foo/bar/
backend:
serviceName:
servicePort:
这时候ingress-controller规则里面将会写入3个规则,三个规则将会降序排列,访问http://rewrite.bar.com/foo/bar/str将会匹配第一个,http://rewrite.bar.com/foo/bar/将会匹配第二个,http://rewrite.bar.com/foo/bar将会匹配第三个。
location ~* "^/foo/bar/.+" {
...
}
location ~* "^/foo/bar/" {
...
}
location ~* "^/foo/bar" {
...
}
3、第三种用法: 使用正则表达式来匹配输入的path,占位符 $2 (测试ok)
yaml文件:
[root@swarm-manager ingress]# cat rewrite-target.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- backend:
serviceName:
servicePort:
path: /something(/|$)(.*)
这个时候如果你有如下访问将会被被重定向((/|$)(.*)为一个正则表达式,会匹配something后面的所有字符并传递给--$2--占位符):
rewrite.bar.com/something 重定向为 rewrite.bar.com
rewrite.bar.com/something/ 重定向为rewrite.bar.com/
rewrite.bar.com/something/new 重定向为 rewrite.bar.com/new
第四种用法:app-root,如果访问路径的根目录暴露在了其他路径,可也使用app-root来重定向
假设用户程序的根目录在app1而不是/,
yaml文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/app-root: /app1
name: rewrite
namespace: default
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- backend:
serviceName:
servicePort:
path: /
实例17:
同一个域名根据不同的path访问不同的服务:foo.bar.com/foo 访问service1 ; foo.bar.com/bar 访问service2
foo.bar.com -> 178.91.123.132 -> / foo service1:4200
/ bar service2:8080
配置文件:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / #必须加该annotation否则访问出错
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
实例18:
根据不同的域名访问不同的服务,同一个ingress
foo.bar.com --| |-> foo.bar.com s1:80
| 178.91.123.132 |
bar.foo.com --| |-> bar.foo.com s2:80
yaml文件:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80
实例19:创建一个ingress-controller的configmap的配置文件(该配置文件为全局配置文件,可与annotation配合使用。configmap设定全局默认值,annotation针对某些ingress需要的特殊功能做定制)
yaml文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: kube-system
data:
use-http2: "false"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2"
ssl-ciphers: "HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM"
官方使用方法:https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md
configmap和annotation对照表:https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/configmap-and-annotations.md (https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/)
-----待完善
参考网站:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#service-upstream
名词解析:上游服务器-----提供给外面服务的服务器集群(如nginx+tomcat,tomcat为上有服务器)
Ingress-nginx安装和部署参考网站:https://www.cnblogs.com/panwenbin-logs/p/9915927.html