Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。
环境准备
你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。你可能需要部署 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。理想情况下,所有 Ingress 控制器都应符合参考规范。但实际上,不同的 Ingress 控制器操作略有不同。
说明:本文需要参照《Kubernetes学习之二:Hello K8S》文章,安装完ingress-controller//使用以下命令查看ingress控制器是否存在
kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx 1/1 Running 0 5d1h
......
ingress-nginx nginx-ingress-controller-54b86f8f7b-lghw4 1/1 Running 0 4d6h
......
#如果有nginx-ingress-controller这个pod就可以继续后面的测试
实验目标
k8s部署pod并自动生成endpoint信息(容器的IP及端口清单),service指向endpoint。
关系图实验部署
对于外部资源(未使用k8s部署的,如外部的数据库或应用),也可以使用ingress+service+endpoint的模式实现高可用及负载均衡,我们用nginx模拟下这个场景:分别在节点1,节点2用docker启用nginx。映射到主机端口为8021
//在node的机器直接运行以下命令,可能不成功,看后面的注
docker run --name nginx81 -p 8021:80 -d -v /data/nginx81/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx81/html:/usr/share/nginx/html -v /data/nginx81/conf.d:/etc/nginx/conf.d nginx:latest
//查看node的安装情况
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d79a7a61396e nginx "/docker-entrypoint.…" 5 days ago Up 5 days 0.0.0.0:8021->80/tcp nginx81
//注:如果创建docker container的时候可能是因为nginx目录没有
sudo docker run --name nginx81 -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html nginx//如果创建好了,到nginx的html文件夹里增加index.html文件并添加以下内容
node1: <html><body>node1 8021 1.html</body></html>
node2: <html><body>node2 8021 1.html</body></html>//然后预览
curl 10.10.30.74
<html><body>node1 8021 1.html</body></html>
curl 10.10.30.75
<html><body>node2 8021 1.html</body></html>
通过ingress映射外部
---
kind: Endpoints
apiVersion: v1
metadata:
name: edp-test
namespace: my-system
subsets:
- addresses:
#这里可以填写多个IP终结点IP,我们填写的是node1/node2的IP及端口
- ip: 10.10.30.75
- ip: 10.10.30.74
ports:
- port: 8021
---
apiVersion: v1
kind: Service
metadata:
name: edp-test
namespace: my-system
spec:
ports:
- port: 8021
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: edp-test
namespace: my-system
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: edp-test
port:
number: 8021
先通过命令增加namespace再增加ingress
kubectl create namespace my-system
namespace/my-system created
kubectl apply -f ingressdemo.yaml
endpoints/edp-test created
service/edp-test created
ingress.networking.k8s.io/edp-test created
kubectl describe ingress --all-namespaces
Name: ingress-nginx
Namespace: default
Address: 10.1.64.186
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
* nginx-service:80 (10.244.1.4:80,10.244.1.5:80,10.244.3.4:80 + 1 more...)
Annotations: kubernetes.io/ingress.class: nginx
Events: <none>
Name: edp-test
Namespace: my-system
Address: 10.1.64.186
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
* /testpath edp-test:8021 (10.10.30.75:8021,10.10.30.74:8021)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 20m nginx-ingress-controller Ingress my-system/edp-test
Normal UPDATE 19m nginx-ingress-controller Ingress my-system/edp-test
测试
//外部测试访问
curl 10.10.30.76:30010/testpath
<html><body>node2 8021 1.html</body></html>
curl 10.10.30.76:30010/testpath
<html><body>node1 8021 1.html</body></html>
//停止节点1,再访问
sudo docker stop nginx81
curl 10.10.30.76:30010/testpath
<html><body>node2 8021 1.html</body></html>
curl 10.10.30.76:30010/testpath
<html><body>node2 8021 1.html</body></html>
注:不会再访问到node1的节点,说明k8s的service会自动寻找有效节点。k8s的ingress+service+endpoint+pod的模式,是自带注册中心、负载均衡和高可用的模式。能够快速实现简单微服务架构。
网友评论