什么是Ingress
Ingress 是 k8s 的一个 API 对象,Ingress 公开了从群集外部到群集内服务的HTTP
和HTTPS
路由 。流量路由由 Ingress 资源上定义的规则控制。
使用 Ingress 必须先拥有一个 Ingress Controller,如 Nginx 提供的 Nginx Ingress Controller for Kubernetes 、基于 Istio 的 Control Ingress Traffic 等。
更多Ingress Controller及使用多个Ingress Controller请参见官方文档。
Nginx Ingress Controller
基于 Nginx 的 Ingress Controller 有两种,一种是 k8s 社区提供的 ingress-nginx,另一种是 Nginx 社区提供的 kubernetes-ingress。
两者基本用法差不多,在学习过程中了解到,nginxinc/kubernetes-ingress
必须配置域名而kubernetes/ingress-nginx
不需要,kubernetes/ingress-nginx
社区较为活跃,Grafana有更多的支持kubernetes/ingress-nginx
的仪表盘,个人更推荐kubernetes/ingress-nginx
。
了解更多两者的区别。
kubernetes/ingress-nginx
本文基于镜像quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2
安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml
如果你使用的 Kubernetes 版本是1.14
之前的,那么需要把yaml文件中的kubernetes.io/os
替换为beta.kubernetes.io/os
基本用法
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: ${serviceName}
servicePort: 8080
更多配置
例如:如果要对访问路径进行路由修改,需要使用metadata.annotations.nginx.ingress.kubernetes.io/rewrite-target
进行定义。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /demo(/|$)(.*)
backend:
serviceName: ${serviceName}
servicePort: 8080
这里的$2
暂时没有搞清楚是什么意思而且好像不支持在同一文件中对不同路由进行不同的重写方式
了解更多支持的配置。
监控
前提
已通过kube-prometheus项目安装了prometheus
等组件。
提供Service供Prometheus采集数据
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
type: ClusterIP
ports:
- name: metrics
port: 10254
targetPort: 10254
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
配置RBAC访问
RoleList
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleList
items:
- apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: prometheus-k8s
namespace: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
- pods
verbs:
- get
- list
- watch
RoleBindingList
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBindingList
items:
- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: prometheus-k8s
namespace: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: prometheus-k8s
subjects:
- kind: ServiceAccount
name: prometheus-k8s
namespace: monitoring
配置ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: ingress-nginx
namespace: monitoring
spec:
endpoints:
- interval: 15s
port: metrics
namespaceSelector:
matchNames:
- ingress-nginx
selector:
matchLabels:
app: ingress-nginx
效果
在 Grafana 配置对应的监控面板或导入模板。
nginxinc/kubernetes-ingress
安装
可以参照官方文档或直接运行:
kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml
安装基于镜像nginx/nginx-ingress:1.5.5
的版本。
基本用法
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: ${serviceName}
servicePort: 8080
host: ${host}
比kubernetes/ingress-nginx
需要多指定一个host
,值为域名。
更多配置
例如:如果要对访问路径进行路由修改,需要使用metadata.annotations.nginx.org/rewrites
进行定义。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx
annotations:
nginx.org/rewrites: "serviceName=service1 rewrite=/;serviceName=service2 rewrite=/others"
spec:
rules:
- http:
paths:
- path: /service1/
backend:
serviceName: service1
servicePort: 8080
- path: /service2/
backend:
serviceName: service2
servicePort: 8080
了解更多支持的配置。
监控
与kubernetes/ingress-nginx
一样,需要注意namespace
及端口的配置。
两者提供的监控指标不相同,需要使用不同的 Grafana 监控面板。