1、ingress简介

Ingress其实就是从 kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,有的同学可能觉得我们直接使用 nginx 就实现了,但是只使用 nginx 这种方式有很大缺陷,每次有新服务加入的时候怎么改 Nginx 配置?不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧?那我们再加上一个服务发现的工具比如 consul 如何?貌似是可以,对吧?而且在之前单独使用 docker 的时候,这种方式已经使用得很普遍了,Ingress 实际上就是这样实现的,只是服务发现的功能自己实现了,不需要使用第三方的服务了,然后再加上一个域名规则定义,路由信息的刷新需要一个靠 Ingress controller 来提供。

Ingress controller 可以理解为一个监听器,通过不断地与 kube-apiserver 打交道,实时的感知后端 service、pod 的变化,当得到这些变化信息后,Ingress controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用。其实这点和服务发现工具 consul consul-template 非常类似。

2、ingress架构图

operator-ingress使用 - 图1

3、ingress部署

3.1 rbac进行认证,traefik-rbac.yaml

  1. ---
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: traefik-ingress-controller
  6. namespace: kube-system
  7. ---
  8. kind: ClusterRole
  9. apiVersion: rbac.authorization.k8s.io/v1beta1
  10. metadata:
  11. name: traefik-ingress-controller
  12. rules:
  13. - apiGroups:
  14. - ""
  15. resources:
  16. - services
  17. - endpoints
  18. - secrets
  19. verbs:
  20. - get
  21. - list
  22. - watch
  23. - apiGroups:
  24. - extensions
  25. resources:
  26. - ingresses
  27. verbs:
  28. - get
  29. - list
  30. - watch
  31. ---
  32. kind: ClusterRoleBinding
  33. apiVersion: rbac.authorization.k8s.io/v1beta1
  34. metadata:
  35. name: traefik-ingress-controller
  36. roleRef:
  37. apiGroup: rbac.authorization.k8s.io
  38. kind: ClusterRole
  39. name: traefik-ingress-controller
  40. subjects:
  41. - kind: ServiceAccount
  42. name: traefik-ingress-controller
  43. namespace: kube-system

3.2 部署ingress的Deployment

编辑:traefik-deployment.yaml,直接使用官方的

  1. ---
  2. kind: Deployment
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: traefik-ingress-controller
  6. namespace: kube-system
  7. labels:
  8. k8s-app: traefik-ingress-lb
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. k8s-app: traefik-ingress-lb
  14. template:
  15. metadata:
  16. labels:
  17. k8s-app: traefik-ingress-lb
  18. name: traefik-ingress-lb
  19. spec:
  20. serviceAccountName: traefik-ingress-controller
  21. terminationGracePeriodSeconds: 60
  22. tolerations:
  23. - operator: "Exists"
  24. nodeSelector:
  25. kubernetes.io/hostname: hf-aipaas-172-31-243-137
  26. containers:
  27. - image: traefik:v1.7.17
  28. name: traefik-ingress-lb
  29. ports:
  30. - name: http
  31. containerPort: 80
  32. hostPort: 80
  33. - name: admin
  34. containerPort: 8080
  35. args:
  36. - --api
  37. - --kubernetes
  38. - --logLevel=INFO
  39. ---
  40. kind: Service
  41. apiVersion: v1
  42. metadata:
  43. name: traefik-ingress-service
  44. namespace: kube-system
  45. spec:
  46. selector:
  47. k8s-app: traefik-ingress-lb
  48. ports:
  49. - protocol: TCP
  50. port: 80
  51. name: web
  52. - protocol: TCP
  53. port: 8080
  54. name: admin
  55. type: NodePort

3.3 部署自己的服务

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. namespace: monitoring
  5. name: prometheus-ingress
  6. spec:
  7. rules:
  8. - host: prometheus.minikube.local.com
  9. http:
  10. paths:
  11. - backend:
  12. serviceName: prometheus-k8s
  13. servicePort: 9090
  14. - host: alertmanager.minikube.local.com
  15. http:
  16. paths:
  17. - backend:
  18. serviceName: alertmanager-k8s
  19. servicePort: 9095

3.4 绑定hosts

打开本地hosts文件,加入后

  1. 172.16.59.204 prometheus.minikube.local.com
  2. 172.16.59.204 alertmanager.minikube.local.com

3.5打开浏览器prometheus.minikube.local.com测试

image.png

4、ingress自带的ui界面

  1. [root@hf-aipaas-172-31-243-137 ingress]# kubectl get svc -n kube-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 50d
  4. kubelet ClusterIP None <none> 10250/TCP 49d
  5. traefik-ingress-service NodePort 10.99.220.222 <none> 80:31631/TCP,8080:32189/TCP 11h

image.png