一、ingress 理解
Kubernetes 暴露服务的有三种方式,分别为 LoadBlancer Service、NodePort Service、Ingress。
官网对 Ingress 的定义为管理对外服务到集群内服务之间规则的集合,
通俗点讲就是它定义规则来允许进入集群的请求被转发到集群中对应服务上,从来实现服务暴漏。
Ingress 能把集群内 Service 配置成外网能够访问的 URL,流量负载均衡,终止SSL,提供基于域名访问的虚拟主机等等
1. ingress组成
Ingress 使用开源的反向代理负载均衡器来实现对外暴漏服务,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三个组件组成:
1)ingress是kubernetes的一个资源对象,用于编写定义规则。
2)反向代理负载均衡器,通常以Service的Port方式运行,接收并按照ingress定义的规则进行转发,通常为nginx,haproxy,traefik等,本文使用nginx。
3)ingress-controller,监听apiserver,获取服务新增,删除等变化,并结合ingress规则动态更新到反向代理负载均衡器上,并重载配置使其生效。
2. ingress 工作流程图
externalLB : 外部的4层负载均衡器
<Service> ingress-nginx : nodePort 类型的 service 为 <IngressController> ingress-nginx 的 pod 接入外部流量
<IngressController> ingress-nginx : ingress-nginx pod, 负责创建负载均衡
<Ingress> : Ingress 根据后端 Service 实时识别分类及 IP 把结果生成配置文件注入到 ingress-nginx pod 中
<Service> site1 : Service 对后端的pod 进行分类(只起分类作用)
3.ingress 前沿知识
3.1. 四层协议
后面补充
3.2. 七层协议
后面补充
3.3. https
后面补充
3.4. 反向代理负载均衡器
nginx
traefik
Envoy
二. ingress 如何定义
1. nodePort 方式
2. hostNetwork 方式
3. hostNetwork + 无头service 方式
1. nodePort 方式
步骤1: nginx-ingress-controller 部署
ingress-nginx pod
mkdir ingress-nginx && cd ingress-nginx
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f mandatory.yaml
#检查一下
kubectl get pods -n ingress-nginx --show-labels
步骤2: nginx-ingress service 暴露端口
ingress-nginx : nodePort
kubectl apply -f service-nodeport.yaml
#检查一下
http://集群节点:30080
看到 default backend - 404 则证明成功
步骤3: ingress 规则定义& 创建
假设已有service : myapp, 端口:80
vi ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp.klvchen.com
http:
paths:
- path:
backend:
serviceName: myapp
servicePort: 80
# 创建 ingress
kubectl apply -f ingress-myapp.yaml
# 查看 ingress
kubectl get ingress
# 查详细信息 ingress
kubectl describe ingress ingress-myapp
步骤4: 域名修改
# hosts文件末尾添加 172.18.2.249 myapp.klvchen.com
sed -i '$a\ 172.18.2.249 myapp.klvchen.com' /etc/hosts
步骤5: 验证
#访问 http://myapp.klvchen.com:30080/
curl http://myapp.klvchen.com:30080/
2. hostNetwork 方式
相对于NodePort方式,变动的部分
步骤1:nginx-ingress-controller 部署
sed -i 's/kind: Deployment/kind: DaemonSet/g' mandatory.yaml
sed -i 's/replicas: 1/#replicas: 1/g' mandatory.yaml
kubectl apply -f mandatory.yaml
步骤2: nginx-ingress service 暴露端口
sed -i '/serviceAccountName: nginx-ingress-serviceaccount/a\ hostNetwork: true' service-nodeport.yaml
sed -i '/serviceAccountName: nginx-ingress-serviceaccount/a\ dnsPolicy: "ClusterFirstWithHostNet"' service-nodeport.yaml
sed -i 's/type: NodePort/type: ClusterIP/g' service-nodeport.yaml
kubectl apply -f service-nodeport.yaml
其他3-5步骤不变
3. hostNetwork + 无头service 方式
相对于NodePort方式,变动的部分
步骤1:nginx-ingress-controller 部署
sed -i 's/kind: Deployment/kind: DaemonSet/g' mandatory.yaml
sed -i 's/replicas: 1/#replicas: 1/g' mandatory.yaml
kubectl apply -f mandatory.yaml
步骤2: nginx-ingress service 暴露端口
sed -i '/serviceAccountName: nginx-ingress-serviceaccount/a\ hostNetwork: true' service-nodeport.yaml
sed -i '/serviceAccountName: nginx-ingress-serviceaccount/a\ dnsPolicy: "ClusterFirstWithHostNet"' service-nodeport.yaml
sed -i 's/type: NodePort/type: ClusterIP/g' service-nodeport.yaml
sed -i '/selector:/i\ clusterIP: None' service-nodeport.yaml
kubectl apply -f service-nodeport.yaml
其他3-5步骤不变
参考
https://www.jianshu.com/p/a8e18cef13b2