Nginx Ingress使用及监控

什么是Ingress

Ingress 是 k8s 的一个 API 对象,Ingress 公开了从群集外部到群集内服务的HTTPHTTPS路由 。流量路由由 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

效果

可以在prometheus/target中看到配置项。
Nginx Ingress使用及监控_第1张图片

搜索框中能正确加载监控项。
Nginx Ingress使用及监控_第2张图片

在 Grafana 配置对应的监控面板或导入模板
Nginx Ingress使用及监控_第3张图片

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 监控面板。

你可能感兴趣的:(kubernetes,ingress)