文章目录
- 一、为什么需要 Ingress
- 二、什么是Ingress,Ingress Controller
- 三、Ingress 的工作原理
- 四、Ingress 配置资源模版
- 五、实例
- 1、搭建 Ingress 环境
- 1.1、Ingress-Nginx官网地址
- 1.2、master 节点下载 deploy.yaml
- 1.3、所有节点提前 pull 必须的镜像
- 1.4、修改并应用 deploy.yaml 文件
- 1.5、查看 ingress-nginx
- 1.6、查看 service
- 2、准备 service 和 pod
- 2.1、创建 nginx 和 tomcat 的 Deployment
- 2.2、创建并查看对应 svc,pod
- 3、HTTP代理
- 3.1、创建 ingress-http.yaml
- 3.2、应用并查看
- 3.3、本地电脑配置 hosts 解析
- 3.4、通过域名+端口号查看
- 4、HTTPS代理
- 4.1、生成证书
- 4.2、创建密钥
- 4.3、创建ingress-https.yaml
- 4.4、应用并查看
- 4.5、通过 https://域名+端口号 访问
一、为什么需要 Ingress
我们使用传统的NodePort类型的Service的确能将集群内的服务暴露给集群外部客户端去访问,但是使用这种类型的Service存在以下问题:
-
一个端口只能使用一个服务,所有通过NodePort暴露的端口都需要提前规划;
-
如果集群上的Service的数量太多的话,暴露的NodePort端口不具有连续性。后期维护成本太大,且不宜于管理;
-
无论是Iptables或者是Ipvs模型的Service都配置在Linux内核中的Netfilter之上进行四层调度。是一种比较通用的调度器。支持调度HTTP、Mysql等应用层服务,不过,也正是工作于传输层从而使得它无法做到类似卸载HTTPS中的SSL会话,也不支持基于URL的请求调度机制,因为它工作在传输层。kubernetes也不支持为此类负载均衡配置任何类型的健康状态检测机制。
为了解决这种需求,提供了一种高级的流量管理,也就Ingress和Ingress Controller,kubernetes使用Ingress Controller来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及如何转发的规则。有了Ingress和Ingress控制器。我们就可以直接定义流量转发规则来发布服务,而无需创建许多的NodePort和LoadBalancer类型的Service。
二、什么是Ingress,Ingress Controller
Ingress 是 Kubernetes 中的一个 API 对象,用于定义集群内部服务的外部可访问性。简而言之,Ingress 是用来描述如何将外部请求路由到集群内部的服务的规则集合。Ingress 提供了一种定义 HTTP 路由规则的方式,使得外部客户端可以通过一个统一的入口点访问集群内部的服务。
Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类 似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并 转化成Nginx的反向代理配置 , 然后对外部提供服务。
在这里有两个核心概念:
- ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则
- ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等
三、Ingress 的工作原理
Ingress(以Nginx为例)的工作原理如下:
- 用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service
- Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
- Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
- 到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的请求转发规则
四、Ingress 配置资源模版
apiVersion: networking.k8s.io/v1 # 资源所属的API群组和版本
kind: Ingress # 资源类型
metadata: # 元数据name: <string> # 资源名称namespace: <string> # 命名空间
spec: ingressClassName: "nginx" # 适用的Ingress控制器类别,须明确指明rules: <[]object> # Ingress规则列表- host: <string> # 虚拟主机的FQDN,俗称域名http: <object>paths: <[]object> # 虚拟主机的PATH定义列表- path: <string> # 匹配以什么开头类似于nginx中的locationpathType: <string> # Prefix前缀匹配,不区分大小写 Exact。精确匹配URL,区分大小写backend: <object> # 后端service: <object> #关联后端的Servicename: <string> # 后端Service的名称port: <object> #后端Service的端口name: # 端口名称number: # 端口号
五、实例
1、搭建 Ingress 环境
1.1、Ingress-Nginx官网地址
#Ingress-Nginx 官网地址
https://kubernetes.github.io/ingress-nginx/#Ingress-Nginx GitHub地址
https://github.com/kubernetes/ingress-nginx
1.2、master 节点下载 deploy.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml
1.3、所有节点提前 pull 必须的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresswebhook111docker tag c41e9fcadf5a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresscontroller104docker tag a9f76bcccfb5 k8s.gcr.io/ingress-nginx/controller:v1.0.4
1.4、修改并应用 deploy.yaml 文件
如果是提前pull的镜像,要删除掉deploy.yaml中对镜像sha256的检查,在image标签中,删除 @sha256到行尾
sed -i 's/@sha256:.*//g' deploy.yamlkubectl apply -f deploy.yaml
1.5、查看 ingress-nginx
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
1.6、查看 service
kubectl get svc -n ingress-nginx
2、准备 service 和 pod
2.1、创建 nginx 和 tomcat 的 Deployment
apiVersion: v1
kind: Namespace
metadata:name: dev---apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80---apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: tomcat-podtemplate:metadata:labels:app: tomcat-podspec:containers:- name: tomcatimage: tomcat:8.5-jre10-slimports:- containerPort: 8080---apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: dev
spec:selector:app: nginx-podclusterIP: Nonetype: ClusterIPports:- port: 80targetPort: 80---apiVersion: v1
kind: Service
metadata:name: tomcat-servicenamespace: dev
spec:selector:app: tomcat-podclusterIP: Nonetype: ClusterIPports:- port: 8080targetPort: 8080
2.2、创建并查看对应 svc,pod
kubectl apply -f tomcat-nginx.yamlkubectl get pods,svc -n dev
3、HTTP代理
3.1、创建 ingress-http.yaml
ingressClassName: nginx
使用 nginx 的 IngressClass(关联的 ingress-nginx 控制器)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-nginxnamespace: dev
spec:rules:- host: nginx.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend: service:name: nginx-serviceport: number: 80ingressClassName: nginx
---apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-tomcatnamespace: dev
spec:rules:- host: tomcat.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-serviceport: number: 8080ingressClassName: nginx
3.2、应用并查看
kubectl get ing -n dev
kubectl describe ing -n dev
3.3、本地电脑配置 hosts 解析
将以上 nginx.bbj1030.cn 和 tomcat.bbj1030.cn 解析到 master 节点 192.168.112.10上
192.168.112.10 nginx.bbj1030.cn
192.168.112.10 tomcat.bbj1030.cn
3.4、通过域名+端口号查看
nginx.bbj1030.cn:32596tomcat.bbj1030.cn:32596
4、HTTPS代理
4.1、生成证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=bbj1030.cn"
4.2、创建密钥
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
4.3、创建ingress-https.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: https-nginxnamespace: dev
spec:tls:- hosts:- nginx.bbj1030.cnsecretName: tls-secret # 指定秘钥rules:- host: nginx.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-serviceport: number: 80ingressClassName: nginx
---apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: tomcat-httpsnamespace: dev
spec:tls:- hosts:- tomcat.bbj1030.cnsecretName: tls-secret # 指定秘钥rules:- host: tomcat.bbj1030.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-serviceport: number: 8080ingressClassName: nginx
4.4、应用并查看
需要先删除之前创建的 ingress 不然会报错
kubectl delete -f ingress-http.yamlkubectl apply -f ingress-https.yaml
kubectl get ing -n devkubectl describe ing -n dev
4.5、通过 https://域名+端口号 访问
https://nginx.bbj1030.cn:31563https://tomcat.bbj1030.cn:31563