概念
Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端。
Ingress是一个允许入站连接到达集群服务的规则集合。Ingress能把K8S service配置成外网可访问集群service的URL、负载均衡、SSL、基于名称的虚拟主机等。
单纯创建一个Ingress没有任何意义,需要部署一个Ingress Controller(Ingress控制器,下文简称IC)来实现Ingress。
在GCE/GKE环境下,会自动在master节点上部署一个IC。在非GCE/GKE的环境中,必须部署和运行一个IC。
IC是通过轮询实时监听K8S apiserver监视Ingress资源的应用程序,一旦资源发生了变化(包括增加、删除和修改),将ingress资源存储到本地缓存,并通知HTTP代理服务器(例如nginx)进行实时更新转发规则。
这与其他类型的控制器不同,其他类型的控制器通常作为kube-controller-manager二进制文件的一部分运行,在集群启动时自动启动。而IC通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA方式处理流量。HTTP代理服务器有GCE Load-Balancer、HaProxy、Nginx等开源方案,不同的HTTP代理服务器需要不同的Ingress控制器实现。
如果与HAProxy进行比较:
ingress是配置文件部分,例如haproxy.conf
IC是前端,实现配置文件中的frontend **部分
frontend fe_web1
mode http
maxconn 20000
bind web1:80
acl web1_acl hdr_reg(host) -i ^/web1
use_backend be_web1if web1_acl
HTTP代理服务器是后端,实现配置文件中的backend **部分
backend be_web1
mode http
option httpchk GET / HTTP/1.1\r\nHost:\ web1
balance roundrobin
server testdmp test-dmp-v1:80 check
通讯拓扑图
通过下面的例子,总结下面的通讯图(通讯方向从左至右)
VIP:为了防止node出现单点故障,使用LVS+keepalived等软件实现的。
kube node的docker把IC(ingress controller) pod开启443和80端口映射到公网,实现外部访问。
ICpod的作用是ingress的规则发现,根据规则转发流量给后端的BackendLB。
创建Ingress的yaml文件参数说明
1 apiVersion:extensions/v1beta1 2 kind:Ingress 3 metadata: 4 name: lykops-ingress 5 spec: 6 rules: 7 - http: 8 paths: 9 - path:/lykops 10 backend: 11 serviceName: lykops 12 servicePort:80

apiVersion:extensions/v1beta1 kind:Ingress metadata: name: lykops-ingress spec: rules: - http: paths: - path:/lykops backend: serviceName: lykops servicePort:80
如果没有配置Ingress controller就将其POST到API server不会有任何用处
配置说明
1-4行:跟K8S的其他配置一样,ingress的配置也需要apiVersion,kind和metadata字段。
5-7行: Ingress spec 中包含配置一个LB或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。目前ingress只支持http规则。
8-9行:每条http规则包含以下信息:一个host配置项(比如for.bar.com,在这个例子中默认是*),path列表(比如:/testpath),每个path都关联一个backend(比如test:80)。在LB将流量转发到backend之前,所有的入站请求都要先匹配host和path。
10-12行:正如 services doc中描述的那样,backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
部署例子
这是例子基于名称的虚拟主机的ingess。
部署http负载均衡器
cat << EOF > lykops-ingess-backup-l7lb.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: lykops-ingess-backup-l7lb labels: software: apache project: test app: backup-l7lb version: v1 spec: template: metadata: labels: name: lykops-ingess-backup-l7lb software: apache project: lykops app: backup-l7lb version: v1 spec: terminationGracePeriodSeconds: 60 containers: - name: lykops-ingess-backup-l7lb image: docker.io/googlecontainer/defaultbackend:1.0 #livenessProbe: # httpGet: # port: 80 # scheme: HTTP # initialDelaySeconds: 30 # timeoutSeconds: 5 ports: - containerPort: 80 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi EOF kubectl create -f lykops-ingess-backup-l7lb.yaml cat << EOF > lykops-ingess-backup-l7lb-svc.yaml apiVersion: v1 kind: Service metadata: name: test-ingess-backup-l7lb labels: software: apache project: lykops app: backup-l7lb version: v1 spec: selector: name: lykops-ingess-backup-l7lb software: apache project: lykops app: backup-l7lb version: v1 ports: -name: http port: 80 protocol: TCP EOF kubectl create -f lykops-ingess-backup-l7lb-svc.yaml
注意:
注释部分用途,注释之后telnet 这个service clusterIP 80,会立即断开;访问页面,提示“连接被重置”,无法访问。
如果不注释,livenessProbe检测认为失败,会不断创建pod
配置ingress-controller
cat << EOF > lykops-inging-control.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: lykops-inging-control labels: software: apache project: lykops app: inging-control version: v1 spec: template: metadata: labels: name: lykops-inging-control software: apache project: lykops app: inging-control version: v1 spec: terminationGracePeriodSeconds: 60 containers: - image: docker.io/googlecontainer/nginx-ingress-controller:0.8.3 name: lykops-inging-control #readinessProbe: # httpGet: # path: /healthz # port: 80 # scheme: HTTP #livenessProbe: # httpGet: # path: /healthz # port: 80 # scheme: HTTP # initialDelaySeconds: 10 # timeoutSeconds: 1 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://192.168.20.128:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller #- --default-backend-service=${POD_NAMESPACE}/default-http-backend - --default-backend-service=default/test-ingess-backup-l7lb EOF kubectl create -f lykops-inging-control.yaml
注意:
注释部分用途,注释之后访问页面,页面返回502错误。
如果不注释,livenessProbe检测认为失败,会不断创建pod。
配置ingress
cat << EOF > lykops-inging.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: lykops-inging labels: project: lykops app: inging version: v1 spec: rules: - host: web1 http: paths: - path: / backend: serviceName: dpm-web-v1 servicePort: 80 - host: web2 http: paths: - path: / backend: serviceName: dpm-web-v2 servicePort: 80 EOF kubectl create -f test-inging.yaml
测试
测试方法有两种 1、curl -v http://kube-node的IP地址 -H 'host: web3'
curl -v http://192.168.20.131 -H 'host: web3' * About to connect() to 192.168.20.131 port 80 (#0) * Trying 192.168.20.131... * Connected to 192.168.20.131 (192.168.20.131) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.29.0 > Accept: */* > host: web3 > < HTTP/1.1 200 OK < Server: nginx/1.11.3 < Date: Thu, 10 Aug 2017 07:30:15 GMT < Content-Type: text/html; charset=UTF-8 < Content-Length: 122 < Connection: keep-alive < Last-Modified: Tue, 01 Aug 2017 07:48:36 GMT < ETag: "e03d22-7a-555ac5ff23d00" < Accept-Ranges: bytes < <h1>Kubernetes v1.5.2</h1> <h1>Host Name : 9f16cf3bba3a</h1> <h1>IP Address : 172.16.58.2</h1> <h1>app version: v3 </h1> * Connection #0 to host 192.168.20.131 left intact
2、将访问url的主机的host中加上:nodeip web1
其他参考:
Kubernetes - 配置Nginx-Ingress 作为服务发现 http://www.cnblogs.com/BenWong/p/7372406.html
Kubernetes Ingress解析:http://blog.csdn.net/qq_34463875/article/details/72730404
初试 Kubernetes 暴漏服务类型之 Nginx Ingress:http://blog.csdn.net/aixiaoyang168/article/details/78485581?locationNum=5&fps=1