ingress是什么?
是kubernetes的一个资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。kubernetes使用了一个ingress策略定义和一个具体的Ingress Controller,两者相互配合才能实现一个完整的ingress负载均衡器。
ingress-controller又是什么?ingress和ingress-controller如何做CP?
ingress-controller是ingress资源对象正在做实际动作的执行者,而ingress只是一段配置,是负责告诉ingress-controller如何做负载调度;具体的说就是使用ingress进行负载分发时,ingress controller基于ingress规则将客户端请求直接转发到service对应的后端Endpoint(Pod)上,这样就可以直接跳过kube-proxy的转发功能,kube-proxy不再起作用
ingress和service的区别?
ingress可以实现七层,针对HTTP服务,不同的URL地址经常对应到不同的后端服务或者虚拟服务器
service只能实现四层,也就是IP:Port,即TCP/IP层
注:在下面的配置测试中,所使用的kubernetes版本是V1.17.1
配置ingress
创建ingress目录并进入
# mkdir ingress && cd ingress
下载官方ingress-controller服务
# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
# wget https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/provider/baremetal/service-nodeport.yaml
启动ingress-controller服务,在启动前可根据自己需求修改service-nodeport配置文件内的对外暴露的端口
# kubectl apply -f ./
查看启动情况
# kubectl get pod -n ingress-nginx
编写需要被调度的后端服务,这里使用Tomcat,Nginx做测试
tomcat的Deployment和Service
# vim tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
name: httpport
- containerPort: 8009
name: ajpport
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: ingress-nginx
labels:
app: tomcat-svc
spec:
selector:
app: tomcat
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
nginx的Deployment和Service
# vim nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: httpport
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: ingress-nginx
labels:
app: nginx-svc
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
以上基础工作已经做好了,下面就要配置Tomcat和Nginx的ingress了
ingress配置负载分发策略的主要转发策略有:
1、转发到单个后端服务上,是指当请求到达 ingress controller时都会被转发到后端的唯一service上,在这种配置中无需定义rule
例如:
# vim tomcat-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
spec:
backend:
serviceName: tomcat-svc
servicePort: 80
2、同一域名下,不同的URL路径被转发到不同的服务上;是指用于一个网站通过不同的路径提供不同的服务场景,例如/tomcat表示请求Tomcat后端程序,/nginx表示请求Nginx后端服务;但是该方法经过测试发现当请求配置的目录时,后端也必须要有相同的目录不然会出现404的情况,简单说就是当请求/nginx时,后端的Nginx的根目录内也必须有nginx目录
配置实例:
# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test1-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: test1.meisfuture.com
http:
paths:
- path: /tomcat
backend:
serviceName: tomcat-svc
servicePort: 80
- path: /nginx
backend:
serviceName: nginx-svc
servicePort: 80
- path:
backend:
serviceName: nginx2-svc
servicePort: 80
3、不同域名被转发到不同的服务上;是指用于一个网站通过不同的域名或虚拟主机名提供不同的服务,简单说就是test1.meisfuture.com提供tomcat服务,test2.meisfuture.com提供Nginx服务
配置实例:
# vim test-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test1-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: test1.meisfuture.com
http:
paths:
- path: /tomcat
backend:
serviceName: tomcat-svc
servicePort: 80
- path: /nginx
backend:
serviceName: nginx-svc
servicePort: 80
- path:
backend:
serviceName: nginx2-svc
servicePort: 80
- host: test2.meisfuture.com
http:
paths:
- backend:
serviceName: nginx2-svc
servicePort: 80
Ingress使用https的使用方法:
让Ingress提供HTTPS的方式访问,需要在Ingress域名内开启TLS安全证书配置,配置方式如下:
1、创建证书的密钥和SSL证书文件(我认为购买的已经认证好的证书和自己做测试自己生成的证书是一样可以放在第二步使用的)
2、给证书创建一个secret资源对象
3、将该证书的secret配置到ingress内
1、创建证书
# openssl genrsa -out test1meis.key 2048
# openssl req -new -x509 -key test1meis.key -out test1meis.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=test1.meisfuture.com -days 3650
2、创建secret资源对象
# kubectl create secret tls test1meis-ingress-secret --cert=test1meis.crt --key=test1meis.key -n ingress-nginx
3、将证书的secret配置放到ingress内
# vim test-ingress-tls.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test1-ingress
namespace: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- test1.meisfuture.com
secretName: test1meis-ingress-secret
rules:
- host: test1.meisfuture.com
http:
paths:
- path: /tomcat
backend:
serviceName: tomcat-svc
servicePort: 80
- path: /nginx
backend:
serviceName: nginx-svc
servicePort: 80
- path:
backend:
serviceName: nginx2-svc
servicePort: 80
以上配置都是经过测试可返回正确的页面和返回值,测试结果就不再贴图;
测试过程就是将本地机器绑定hosts,使用http://test1.meisfuture.com:30080;https://test1.meisfuture.com:30443方式测试即可
(我在service-nodeport配置文件中修改了暴露端口为http:30080,https:30443)
在ingress配置中,我认为在Ingress.metadata,annotations中的配置非常重要,且在深入使用ingress时肯定要经常增加相关配置,具体相关配置请见官网链接:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/