Ingress 将 HTTP 和 HTTPS 路由从集群外部公开到 集群内的服务。流量路由由入口资源上定义的规则控制。
这是一个简单的示例,其中 Ingress 将其所有流量发送到一个服务:
Ingress 可以配置为提供服务外部可访问的 URL、负载平衡流量、终止 SSL/TLS 以及提供基于名称的虚拟托管。Ingress 控制器负责 实现 Ingress,通常使用负载均衡器,但它也可能配置边缘路由器或其他前端来帮助处理流量。
必须有一个Ingress 控制器 才能满足 Ingress。仅创建 Ingress 资源是没有效果的。因此需要先部署 Ingress 控制器,例如ingress-nginx。也可以从多个Ingress 控制器中进行选择。
本系列均在Minikube基础上搭建的k8s,因此首先介绍如何在Minikube下安装ingress。
Ingress安装很简单,Minikube里面带了Ingress附件。
minikube addons enable ingress
minikube addons disable ingress
验证 NGINX Ingress 控制器是否正在运行
kubectl get pods -n ingress-nginx
输出类似于:
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
若pull image failed,可以执行docker search hello-app:1.0
,将image进行替换。
kubectl expose deployment web --type=NodePort --port=8080
kubectl get service web
minikube service web --url
curl http://127.0.0.1:57592
Hello, world!
Version: 1.0.0
Hostname: web-55b8c6998d-8k564
example-ingress.yaml
以下yaml定义了一个通过 hello-world.info 将流量发送到服务的入口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080
执行:
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
kubectl get ingress
curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info
长时间没有内容输出,可以新打开一个终端,并执行:minikube tunnel
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
kubectl expose deployment web2 --port=8080 --type=NodePort
- path: /v2
pathType: Prefix
backend:
service:
name: web2
port:
number: 8080
kubectl apply -f example-ingress.yaml
curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info
有如下输出:
Hello, world!
Version: 1.0.0
Hostname: web-55b8c6998d-8k564
curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info/v2
有如下输出:
Hello, world!
Version: 2.0.0
Hostname: web2-75cd47646f-t8cjk