一、 Ingress 配置
介绍
kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,负责统一管理外部对k8s cluster中service的请求。通过定义Ingress Resoucre(Ingress,Ingress Controller,Ingress Service)等实现。常用的Ingress Controller 是ingress-nginx。
工作的原理是:
Ingress Contronler 通过与 Kubernetes API 交互,Ingress Controller 会动态感知集群中的Ingress的规则变化,然后读取,动态生成Nginx的配置文件,最后注入到运行 Nginx-ingress-control的pod的中,这个 Ingress Contronler 的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后会自动reload,配置生效。
对比:
用kubernetes Ingress 是由于它是7层调度,可以直接卸载https会话,代理的后端的pod可以直接使用明文的http协议。
而Service NodePort得类型,是4层得调度,做不到这点,然而现在https是一种趋势,所以在kubernetes 对外暴露服务得时候我们还是要选择Ingress。
部署
官方地址:https://github.com/kubernetes/ingress-nginx
下载部署文件:
这里下载的是ingress-nginx 0.24.1版
# mandatory.yaml为ingress所有资源yml文件的集合
#若是单独部署,需要分别下载configmap.yaml、namespace.yaml、rbac.yaml、service-nodeport.yaml、with-rbac.yaml
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
# service-nodeport.yaml为ingress通过nodeport对外提供服务,注意默认nodeport暴露端口为随机,可以编辑该文件自定义端口
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/baremetal/service-nodeport.yaml
若是单独部署,需要分别下载configmap.yaml、namespace.yaml、rbac.yaml、service-nodeport.yaml、with-rbac.yaml,也可以使用git克隆整个仓库到本地。
[root@master ingress]# for file in namespace.yaml configmap.yaml rbac.yaml with-rbac.yaml;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/$file;done
创建ingress资源
[root@master ingress]# kubectl apply -f mandatory.yaml
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
因为使用的是裸机部署,要想要引入外部流量,还需要创建service-nodeport这一个service资源。没有这个文件,是无法通过外部访问的。这个文件主要是为ingress controller创建了一个Nodeport类型的service。
创建service-nodeport这个service资源
[root@master ingress]# kubectl apply -f service-nodeport.yaml
service/ingress-nginx created
访问测试,显示404,说明调度器已经正常工作了,只是后端pod的规则还没有定义。
创建svc及后端deployment
[root@master kube_manifest]# vim test-ingress-deploy.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-ingress-svc
namespace: default
spec:
selector:
app: myapp
env: test
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-test-ingress
spec:
replicas: 3
selector:
matchLabels:
app: myapp
env: test
template:
metadata:
labels:
app: myapp
env: test
spec:
containers:
- name: myapp
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80
[root@master kube_manifest]# kubectl apply -f test-ingress-deploy.yaml
service/myapp-ingress-svc created
deployment.apps/myapp-test-ingress created
查看pod部署情况
[root@master kube_manifest]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-test-ingress-554b88bc89-9ng78 1/1 Running 0 31s
myapp-test-ingress-554b88bc89-n296x 1/1 Running 0 31s
myapp-test-ingress-554b88bc89-ndt9z 1/1 Running 0 31s
查看Service
[root@master kube_manifest]# kubectl get svc | grep myapp-ingress
myapp-ingress-svc ClusterIP 10.99.110.120 <none> 80/TCP 5m52s
创建ingress规则
在ingress规则中,要指定需要指定后端deploy的service名称。
[root@master ingress]# vim ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx" ##注解,指明要用到的ingress controller是nginx,这样才能转换成对应的规则
spec:
rules:
- host: www.cwj.com
http:
paths:
- path:
backend:
serviceName: myapp-ingress-svc
servicePort: 80
[root@master ingress]# kubectl apply -f ingress-myapp.yaml
ingress.extensions/ingress-myapp created
[root@master ingress]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-myapp <none> www.cwj.com 80 25s
[root@master ingress]# kubectl describe ingress ingress-myapp
Name: ingress-myapp
Namespace: default
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
www.cwj.com
myapp-ingress-svc:80 (10.244.1.34:80,10.244.2.26:80,10.244.2.27:80)
Annotations: kubernetes.io/ingress.class: nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 60s nginx-ingress-controller Ingress default/ingress-myapp
在本地主机配置hosts域名解析,这里使用的是windows主机。
编辑hosts文件,windows\system32\drivers\etc\hosts。
192.168.147.132 www.cwj.com
192.168.147.133 www.cwj.com
192.168.147.134 www.cwj.com
然后主机浏览器访问,这里访问时需要加上svc映射到主机时指定的nodePort端口号。
总结:
1、创建一个deployment资源用于运行nginx,pod副本为3个;
2、为后端的nginx pod创建service服务,名称为myapp-ingress-svc
3、创建ingress规则,通过ingress把后端的pod暴露出去
注意:这里对于为nginx创建的svc服务,并没有起到调度作用,只是收集pod资源,用于分类。因为实际调度过程中,流量是直接通过ingress规则调度到后端的pod,而没有经过svc服务,svc只是提供一个收集pod的作用。