kubernetes资源对象--ingress

来源:互联网 发布:java 搜索框架 编辑:程序博客网 时间:2024/05/16 10:08

Ingress在K8S1.1之前还没有。

概念

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/v1beta12: kind:Ingress3: metadata:4:   name: lykops-ingress5: spec:6:   rules:7:   - http:8:       paths:9:       - path:/lykops10:        backend:11:           serviceName: lykops12:           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.yamlapiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: lykops-ingess-backup-l7lb labels:   software: apache   project: test   app: backup-l7lb   version: v1spec: 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: 20MiEOFkubectl create -f lykops-ingess-backup-l7lb.yamlcat << EOF > lykops-ingess-backup-l7lb-svc.yamlapiVersion: v1kind: Servicemetadata: name: test-ingess-backup-l7lb labels:   software: apache   project: lykops   app: backup-l7lb   version: v1spec: selector:   name: lykops-ingess-backup-l7lb   software: apache   project: lykops   app: backup-l7lb   version: v1 ports:  -name: http   port: 80   protocol: TCPEOFkubectl create -f lykops-ingess-backup-l7lb-svc.yaml

注意:

注释部分用途,注释之后telnet 这个service clusterIP 80,会立即断开;访问页面,提示“连接被重置”,无法访问。如果不注释,livenessProbe检测认为失败,会不断创建pod

配置ingress-controller

cat << EOF > lykops-inging-control.yamlapiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: lykops-inging-control  labels:    software: apache    project: lykops    app: inging-control    version: v1spec:  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-l7lbEOFkubectl create -f lykops-inging-control.yaml

注意:

注释部分用途,注释之后访问页面,页面返回502错误。如果不注释,livenessProbe检测认为失败,会不断创建pod。

配置ingress

cat << EOF > lykops-inging.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: lykops-inging  labels:    project: lykops    app: inging    version: v1spec:  rules:  - host: web1    http:      paths:      - path: /        backend:          serviceName: dpm-web-v1          servicePort: 80  - host: web2    http:      paths:      - path: /        backend:          serviceName: dpm-web-v2          servicePort: 80EOFkubectl 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

原创粉丝点击