Kubernetes之Ingress Controller
1 简要介绍
1.1 K8S对外暴露服务的方式
-
三种方式:k8s 集群向外暴露服务的方式一共有 NodePort, Ingress,LoadBalancer 这三种,每种方式都有各自的优缺点。
-
NodePort方式:这种方式是将K8S中的Pod或Service等资源的端口映射到主机上,从而在集群外部可以通过使用 主机IP:Port 的方式来访问Pod或Service,尽管这种方式使用起来比较简单,但并不适用于大量服务的情况,否则会导致主机上开的端口较多,不便于管理。
-
LoadBalancer方式:这种方式是结合云提供商的LB来使用,但是如果使用的LB较多,产生大量费用的问题也不容忽视。
-
Ingress方式:这种方式是K8S官方比较推荐的对外暴露服务的方式,也是在生产环境中使用较多的方式。
1.2 Ingress Controller
-
简单介绍:Ingress Contoller 是一个 pod 服务,封装了一个 web 前端负载均衡器,同时在其基础上实现了动态感知 Ingress 的变化,并根据 Ingress 的定义动态生成前端 web 负载均衡器的配置文件。比如 Nginx Ingress Controller 本质上就是一个 Nginx,只不过它能根据 Ingress 资源的定义动态生成 Nginx 的配置文件,并且动态 Reload 配置文件。Ingress Controller 的作用是作为集群服务的统一入口,并根据路由转发规则将请求负载均衡地转发到各个服务。
-
常见实现:Ingress Controller 有多种实现,除了常见的基于Nginx或基于Haproxy的实现之外,还有很多种其它的实现。
1.3 Ingress
- 简单介绍:Ingress Controller作为集群服务的统一入口,用于把请求路由转发到对应的集群服务,但是它并不知道根据什么规则来进行路由转发,而 Ingress 就是用于定义转发规则的,Ingress 的转发规则类型也有多种,具体的转发规则请见官网介绍。
2 安装Ingress Controller
2.1 部署Ingress Controller
- 部署说明:本文中部署的是基于Nginx实现的Ingress Controller,即Nginx Ingress Controller。而Nginx Ingress Controller又分为Kurbernets官方维护的版本和Nginx官方维护的版本,这两者的区别请查看官网的说明,本文中部署的是Kubernetes官方维护的版本。Kubernetes官方维护的Nginx Ingress Controller的GitHub地址。
- 执行部署:Kubernetes官方提供了一份较为完善的 Nginx Ingress Controller部署文件示例, 用户可以在K8S集群的Master节点上执行以下命令,即可直接使用该部署文件来部署Nginx Ingress Controller,执行结果以及该部署文件的内容分别如下所示:
# 部署命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- kind: ConfigMap apiVersion: v1 metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- kind: ConfigMap apiVersion: v1 metadata: name: tcp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- kind: ConfigMap apiVersion: v1 metadata: name: udp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- apiVersion: v1 kind: ServiceAccount metadata: name: nginx-ingress-serviceaccount namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: nginx-ingress-clusterrole labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx rules: - apiGroups: - "" resources: - configmaps - endpoints - nodes - pods - secrets verbs: - list - watch - apiGroups: - "" resources: - nodes verbs: - get - apiGroups: - "" resources: - services verbs: - get - list - watch - apiGroups: - "" resource