文章目录
一、写在前面
1.1 Ingress参考文档
Ingress官方文档:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
Ingress的实现
https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers/
nginx-ingress实现:
https://kubernetes.github.io/ingress-nginx/deploy/
nginx-ingress github
https://github.com/kubernetes/ingress-nginx
1.2 Ingress是什么?
1、Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
2、你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。
- 从上面两句话看出:
1、Ingress实现nginx类似的功能,主要是用来反向代理Service
2、Ingress必须选择一个实现,建议使用 nginx-ingress,不然k8s默认是没有Ingress功能的
1.3 总结(重要)
1、Ingress默认是不实现,官方推荐使用nginx-ingress进行实现,该案例也是使用nginx-ingress
2、Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件
二、nginx-ingress部署
采用 yaml 进行部署
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/baremetal/deploy.yaml
采用 helm 进行部署
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
2.1 部署说明
Ingress实现,我们采用nginx的方式进行实现
因为我是采用IP+NodePort访问Ingress的,所以采用baremetal裸金属进行部署
查看Ingress暴露的端口
[root@mos-mdw-01 ~]# kubectl get svc -n ingress-nginx|grep ingress-nginx
ingress-nginx-controller NodePort 10.233.6.205 <none> 80:31762/TCP,443:31763/TCP 22h
ingress-nginx-controller-admission ClusterIP 10.233.56.46 <none> 443/TCP 22h
可以看出,Ingress的80访问端口为:31762
同时记住 31762 给下文使用。
访问:http://10.51.13.13:30762/
从上图看出,Ingress是基于nginx实现的
2.2 部署注意
- 1、nginx-ingress版本在部署方式存在一定差异,但是对于普通使用者来说,是没有区别的
- 2、如果有条件,还是推荐使用helm部署,因为helm部署的参数比较多,修改起来也方便
- 3、如果采用yaml清单的方式进行部署,修改命名空间,或者修改Ingress作用访问,就需要自己去修改。例如增加 --watch-namespace=xxx 来限制 Ingress作用那些命名空间
三、使用Ingress进行代理
3.1 创建一个测试的pod
k8s默认的测试—创建工作负载
kubectl create deployment demo --image=httpd --port=80
k8s默认的测试—创建service
kubectl expose deployment demo
[root@mos-mdw-01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-54ff5d84db-4ksmq 1/1 Running 0 7m23s
nfs-client-provisioner-6cf5846d5d-2nl6x 1/1 Running 0 28d
Ingress访问方式1
这个时候,我们创建一个Ingress来进行访问
采用域名进行访问
vi demo-ingress.yaml
其中 10.51.13.13 为物理机的地址
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: demo-ingress
spec:
rules:
- host: 10.51.13.13.nip.io
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: demo
port:
number: 80
kubectl apply -f demo-ingress.yaml
访问 http://10.51.13.13.nip.io:31762/
Ingress访问方式2
或者采用IP+NodePort和上下文的方式进行访问
vi demo-ingress2.yaml
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: demo-ingress2
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: demo
port:
number: 80
kubectl apply -f demo-ingress2.yaml
访问 http://10.51.13.13:31762/testpath
3.2 Ingress相关介绍
1、Ingress 规则
可选的 host。在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host。
路径列表 paths(例如,/testpath),每个路径都有一个由 serviceName 和 servicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
2、路径类型
Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:
ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。
Exact:精确匹配 URL 路径,且区分大小写。
Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
3.3 关于Ingress
Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件。可以实现nginx的反向代理、负载均衡等功能