概述:
Ingress的原理目前略知一二,在今后我仍会继续深入学习,届时再展开细说。
在本地实验k8s可以使用NodePort类型的Service向集群外暴露服务,本地localhost访问。
在云上实验k8s可以使用LoadBalancer类型的Service暴露服务,云端会提供给他IP。
我在AKS上部署的Ingress,因此在Github上使用面向Azure的Ingress controller。
我对流量的理解:
Ingress rules -> Service - > Ingress controller -> Endpoints
Service在Ingress和Ingress controller中间的理由:Ingress利用Service中的标签选择器来找到后端的Endpoint,同时Service暴露服务,Ingress对象本身只是一个路由规则,而Ingress controller是一个Pod,没有Service的话也无法接收流量。
环境:
平台:Azure - AKS - Linux
设备:Mac
本地操作系统:Unix
部署:
Ingress controller:
ingress-nginx/index.md at main · kubernetes/ingress-nginx · GitHub
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml --dry-run=client -o yaml > ingress-controller.yaml
拿到yaml代码在本地查看,可根据需求来更改。
kubectl apply -f ingress-controller.yaml
部署Ingress controller之后会在AKS上得到一个External IP
Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-rule
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: www.petclinic.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gateway
port:
number: 8080
spec.ingressClassName这里我们填nginx,这个是在ingress-controller.yaml中声明出来的,直接用。
部署完之后需要注意host部分,我理解为Domain name,那么我们是没有这个Domain name的,因此在本地/etc/hosts中修改
sudo vi /etc/hosts,加入AKS提供的External IP www.example.com(可自行修改为自己想要的Domain name)
接下来就可以到浏览器访问这个Domain name或者AKS提供的External IP(port可加可不加),也可以使用curl来替代浏览器。