一、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 工作流程图

k8s nginx 使用clusterip nginx k8s service_sed

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