Ingress与IngressController
本文主要学习记录Kubernetes集群暴露服务的方式: Ingress。
简介
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
IngressController 为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
上图清晰标识出了Ingress的流量走向,其中:
- Ingress基于DNS名称(host)或URL路径把请求转发⾄指定的Service资源的规则。它仅是⼀组路由规则的集合。
- Ingress控制器是真正实现“流量穿透”,可以由具有反向代理(HTTP/HTTPS)功能的服务程序实现 , 然后根据这些规则的匹配机制路由请求流量
Ingress 资源声明
Ingress是Kubernetes API的标准资源类型之⼀ ,一个最小Ingress例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
其中:
- Ingress 需要指定 apiVersion、kind、 metadata和 spec 字段。
- Ingress 对象的命名必须是合法的 DNS 子域名名称。
- Ingress annotations 来配置一些选项, ⽤于识别其所属的Ingress控制器的类别。
- Ingress rules 提供了配置负载均衡器或者代理服务器所需的所有信息。 最重要的是,其中包含与所有传入请求匹配的规则列表。 Ingress 资源仅支持用于转发 HTTP(S) 流量的规则。
更多参考: https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
Ingress Controller
Ingress控制器可以由任何具有反向代理(HTTP/HTTPS)功能的服务程序实现,目前支持和维护 AWS、 GCE 和 Nginx Ingress 控制器。
- Nginx Ingress 作为反向代理和负载均衡器。
- Apache APISIX Ingress 控制器 是一个基于 Apache APISIX 网关 的 Ingress 控制器。
更多参考:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
安装 Ingress Nginx
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml -O ingress-nginx-deploy.yaml
kubectl apply -f ingress-nginx-deploy.yaml
观测是否成功:
kubectl get pods -n ingress-nginx --watch
如果成功的话,查看namespace下所有的资源信息
root@master:/home/master# kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-123456 1/1 Running 0 1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.104.182.98 192.168.1.100 80:31666/TCP,443:31888/TCP 1d
service/ingress-nginx-controller-admission ClusterIP 10.111.228.99 <none> 443/TCP 1d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 1d
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-123456 1 1 1 1d
NAME COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create 1/1 1s 1d
job.batch/ingress-nginx-admission-patch 1/1 2s 1d
使用Ingress 发布 Tomcat
部署Tomcat Service
-
创建deployment
kubectl create deployment web --image=tomcat:8.0.50-jre8-alpine
-
将 Deployment 暴露出来
kubectl expose deployment web --type=NodePort --port=8080
-
将 Deployment 暴露出来
root@master:/home/master# kubectl get service web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.100.183.22 <none> 8080:32562/TCP 30s
-
验证nodeport 是否正常访问 tomcat ,浏览器访问 http://matster_ip:32562
-
创建 ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingressfoo
annotations:
kubernetes.io/ingress.class: "nginx"
namespace: default
spec:
rules:
- host: ingressfoo.io
http:
paths:
- backend:
service:
name: web
port:
number: 8080
path: /bar
pathType: Prefix
查看ingress是否创建成功
root@master:/home/master# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingressfoo <none> ingressfoo.io 192.168.1.100 80 1h
说明Ingress创建成功,修改hosts :
ingressfoo.io 192.168.1.100
验证访问 ingressfoo.io/bar
success
参考
- Ingress 介绍 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
- IngressController 介绍 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
- https://github.com/apache/apisix-ingress-controller
- NGINX Ingress 控制器配置 Ingress https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/ingress-minikube/#%E5%90%AF%E7%94%A8-ingress-%E6%8E%A7%E5%88%B6%E5%99%A8
- 在K8S上的Web服务该怎么做域名解析 https://mp.weixin.qq.com/s/ZU61NIMxh_UOo-chNvkPXA
- 《Kubernetes进阶实战-第2版》 https://item.jd.com/13140598.html