Ingress在K8S1.1之前还没有。

概念

Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端。

Ingress是一个允许入站连接到达集群服务的规则集合。Ingress能把Service(K8Sservice)配置成外网可访问集群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等软件实现的。

node(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

如果没有配置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行:正如 servicesdoc中描述的那样,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资源类型--ingress的更多相关文章

  1. [置顶] kubernetes资源类型--PetSets/StatefulSet

    PetSet首次在K8S1.4版本中,在1.5更名为StatefulSet.除了改了名字之外,这一API对象并没有太大变化. 注意:以下内容的验证环境为CentOS7.K8S版本1.5.2,并部署Sk ...

  2. [置顶] kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim

    概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...

  3. [置顶] kubernetes资源类型--DaemonSet

    概念 DaemonSet能够让所有(或者特定)的节点运行同一个pod. 当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调 ...

  4. [置顶] kubernetes资源类型--secret和Service Account

    secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...

  5. [置顶] kubernetes资源类型--Volume

    在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失.如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中.在K8S中,当Pod重建的时候 ...

  6. [置顶] kubernetes资源类型--Service

    为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持.K8S中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构. 实现原理 S ...

  7. [置顶] kubernetes资源类型--pod和job

    pod Pod是K8S的最小操作单元,一个Pod可以由一个或多个容器组成:整个K8S系统都是围绕着Pod展开的,比如如何部署运行Pod.如何保证Pod的数量.如何访问Pod等. 特点 Pod是能够被创 ...

  8. [置顶] kubernetes资源类型--RC和RS

    Replication Controller(RC) RC是K8S中的另一个核心概念,应用托管在K8S后,K8S需要保证应用能够持续运行,这是RC的工作内容. 主要功能 确保pod数量:RC用来管理正 ...

  9. [置顶] kubernetes资源类型--deployment

    Deployment(中文意思为部署.调度)提供了一种更加简单的更新RC和Pod的机制,K8S版本1.2实现的.通过在Deployment中描述所期望的集群状态,Deployment Controll ...

随机推荐

  1. 三、vue依赖收集

    Vue 会把普通对象变成响应式对象,响应式对象 getter 相关的逻辑就是做依赖收集,这一节我们来详细分析这个过程 Dep Dep 是整个 getter 依赖收集的核心,它的定义在 src/core ...

  2. [洛谷P4889]kls与flag

    题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第​$i$根竹竿高度为​$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...

  3. POJ 2828 Buy Tickets | 线段树的喵用

    题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...

  4. 搜索水题四连发_C++

    特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...

  5. 【查看linux配置】查看linux系统常用的命令,Linux查看系统配置常用命令

    一.linux CPU大小  cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep &qu ...

  6. matlab7 + sqlitejdbc-v056.jar出现错误

    conn=database('data.db','','','org.sqlite.JDBC','jdbc:sqlite:C:/MATLAB7/work/del_man_voice_from_wave ...

  7. android与java的关系

    摘自:http://bbs.51cto.com/thread-944897-1.html   相信学习android的人都会想过或者想知道这个问题,那就请你耐心的看完这篇文章吧,你会对android与 ...

  8. VS2017源代码版本管理

    VS2017源代码版本管理有两种方式:Git(代码提交到服务器)和Team Foundation Server(代码提交到局域网) 一.Git版本管理(上传到码云服务器https://gitee.co ...

  9. HDU 4920.Matrix multiplication-矩阵乘法

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  10. quailty's Contest #1 道路修建 EXT(启发式合并)

    题目链接  道路修建 EXT 考虑并查集的启发式合并,合并的时候小的子树的根成为大的子树的根的儿子. 可以证明这样整棵树的深度不会超过$logn$. 两个根合并的时候,产生的新的边的边权为当前的时间. ...