Ingress是什么?请参考:https://jimmysong.io/kubernetes-handbook/concepts/ingress.html
https://mritd.me/2017/03/04/how-to-use-nginx-ingress/
Service不管是工作在iptables模式,还是工作在ipvs模式,它都是四层调度器,都是工作在TCP/IP协议栈。如果用户访问的是HTTPS协议(属于七层协议)的服务,再通过Service来进行请求调度的话,显然它是不能完成的。这时我们就需要使用七层的负载均衡机制。
Ingress可用的调度器种类:
- Nginx
- Traefik
-
Envoy
image.png
- 外部访问请求经过K8S集群外部的负载均衡器(externalLB) 将请求调度到K8S集群中的ingress-nginx Service;
ingress-nginx Service这一步聚也可以通过下面这个方案替换:就是将ingress的Pod共享节点主机的网络名称空间(通过DaemonSet来管理这些Pod),这样就外部负载均衡器就可以直接将请求调度到ingress Pod上了。
- Ingress Controller 负载管理Ingress Pod;
- 根据Ingress中的配置,选择将请求转发至对应的后端Pod;
- 通过无头Service(Headless Service)把后端Pod进行分组,一旦有Pod挂了,Ingress会将无头Service匹配到的Pod的ip或名称载入Ingress配置中,以这样的方式对新创建的Pod进行调度。
Ingress Controller是K8S核心附件之一。接下来我们来部署Ingress-nginx。
https://github.com/kubernetes/ingress-nginx/
git clone https://github.com/kubernetes/ingress-nginx.git
cd ingress-nginx/deploy
kubectl apply -f mandatory.yaml
# 如果嫌克隆太慢,也可以直接执行如下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
上述命令执行完后,会拉取nginx-ingress-controller镜像,需要一点时间
image.png
等待nginx-ingress-controller Pod运行起来。
给nginx-ingress-controller Pod创建一个类型为NodePort的Service用以接入外部流量:
# 下载
[root@k8s-master deploy]# wget wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
# 修改service-nodeport.yaml,给此service指定nodePort。
[root@k8s-master deploy]# vim service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
- name: https
port: 443
targetPort: 443
nodePort: 30443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
# 创建Service
[root@k8s-master deploy]# kubectl apply -f service-nodeport.yaml
# 查看
[root@k8s-master deploy]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.106.59.175 <none> 80:30080/TCP,443:30443/TCP 5s
由于此时还未定义后端Pod,所以访问http://192.168.100.135:30080/还是404
image.png接下来,我们创建一组后端Pod,以及为它们创建一个Serivce
vim myapp-deploy-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-ingress
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
kubectl apply -f myapp-deploy-svc.yaml
Service
名为myapp-svc-ingress
,这个Service需要在ingress的后端配置中使用。创建了3个后端Pod
定义一个Ingress,名为ingress-myapp
[root@k8s-master ingress]# cat ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingrepp-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp.magedu.com
http:
paths:
- path: # urI路径为空,默认为/
backend:
serviceName: myapp-svc-ingress
servicePort: 80
创建Ingress:
kubectl apply -f ingress-myapp.yaml
查看Ingress:
[root@k8s-master ingress]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
ingrepp-myapp myapp.magedu.com
image.png
验证:
必须使用域名访问:http://myapp.magedu.com:30080,这时需要在hosts文件中,把节点IP与myapp.magedu.com做映射。
刷新如果一直显示一个Pod 主机名,则需要按Ctrl+F5强刷,这时会看到三个Pod轮流处理请求。
网友评论