ingress nginx 笔记
背景
记录一些常见用法,类似faq。
前置条件
全局变量
ingress 配置一些全局的变量,比如 server-tokens: "false" ,有以下两种办法。
- 修改 configmap,遵循 yaml 语法
kubectl -n ingress-nginx edit cm ingress-nginx-controller
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
server-tokens: "false"
...
- 新建一个yaml文件,apply -f 应用即可
# cat configmap.yaml
apiVersion: v1
data:
server-tokens: "false"
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
# kubectl apply -f configmap.yaml
以上两种办法设置后,ingress 均会自动重载让配置生效
局部变量
当你需要针对某个 location 做一些设置,比如要开启 ip 白名单限制,就需要用到 ingress 的 annotations 功能了。
现在需要对 ryb 后台做白名单限制,新建一个 ingress 资源示例。
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ryb-ingress
namespace: app
labels:
app: ryb
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/whitelist-source-range: '192.168.8.0/24' #设置ip
spec:
rules:
- host: fuck.cn
http:
paths:
- path: /ryb
backend:
serviceName: ryb-svc
servicePort: 7302
部署
私有云自建的 k8s 部署 ingress 通常有2种方案,Deployment + LB、Daemonset + HostNetwork + LB 。优缺点如下:
- Deployment + LB:将 Nginx Ingress Controller 以 Deployment 的方式部署,以 nodeport 方式将端口映射出集群外,通过 slb 将流量转发至 ingress_nodeport,ingress_nodeport 再通过 iptables 或 ipvs 将请求路由到 service 对应的后端 pod。
graph LR
slb --> ingress_nodeport
ingress_nodeport --ipvs--> k8s_pod
- Daemonset + HostNetwork + LB :在方案一中,流量会经过 nodeport,多了一层转发,增加网络损耗。所以改为用 hostnetwork。
graph LR
slb --> ingress
方案2的缺点是,增删 ingress 节点时需手动操作。有能自动操作的方案,不过只在公有云上实现,在此忽略。
使用 hostnetwork 的方法如下:
template:
spec:
hostNetwork: true
同时将 nodeport 换成 clusterip即可
spec:
type: ClusterIP
性能优化
此处给出腾讯云、阿里云的参考文档,本人亲测性能会提高,但也有可能影响业务,请自行取舍。
https://partners-intl.aliyun.com/help/zh/doc-detail/202125.htm