为啥需要ingrss
k8s默认的服务请求是service
service 是 k8s 暴露http服务的默认方式, 其中 NodePort 类型可以将http 服务暴露在宿主机的端口上,以便外部可以访问。 service模式的结构如下client->service->pod
service的优点
service的缺点
- 一个app 需要占用一个主机端口
- 端口缺乏管理
- L4转发, 无法根据http header 和 path 进行路由转发
而ingress的模式就是在service 之前加了一层ingress,结构如下client-> ingress -> service -> pod
ingress的优点
- 增加了7层的识别能力,可以根据 http header, path 进行路由转发
-
ingress缺点
-
理解Ingress 实现
Ingress 的实现分为两个部分 Ingress Controller 和 Ingress
Ingress Controller 是流量的入口,是一个实体软件, 一般是Nginx 和 Haproxy 。
- Ingress 描述具体的路由规则。
Ingress Controller 会监听 api server上的 /ingresses 资源 并实时生效。
Ingerss 描述了一个或者多个 域名的路由规则,以 ingress 资源的形式存在。
简单说: Ingress 描述路由规则, Ingress Controller 实时实现规则。
搭建 nginx Ingress Controller
ingress官网:https://kubernetes.github.io/ingress-nginx/
执行官方命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.33.0/deploy/static/provider/baremetal/deploy.yaml
image是quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
链接: https://pan.baidu.com/s/1v-l6-wfjGElLCG3y0N3e9A 提取码: 6j77
docker load -i nginx-ingress-v32.tar.gz
查看安装是否成功
kubectl get pod -n ingress-nginx
kubectl get svc -n ingress-nginx
建立ingrss
Ingress Controller 创建完成后,就可以按照需求建立ingress了,建立ingress的前提是,有了service服务才行。准备一套完整的yaml文件
cat > nginx-ingress.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: nginx.k8s.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
EOF
查看ingress
curl -H 'Host:nginx.k8s.com' http://master01:30461