kubernetes资源对象--ingress

简介: Ingress在K8S1.1之前还没有。 概念 Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端。 Ingress是一个允许入站连接到达集群服务的规则集合。

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/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行:正如 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资源对象--ingress 

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
17天前
|
运维 Kubernetes 监控
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?
22 0
|
28天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
kubernetes—Ingress详解
kubernetes—Ingress详解
69 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
|
4月前
|
Kubernetes 应用服务中间件 nginx
k8s ingress不生效的bug 解决了。
k8s ingress不生效的bug 解决了。
|
17天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
1月前
|
Kubernetes API 调度
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(上)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
1月前
|
容器
在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
【2月更文挑战第15天】在容器服务ACK中,如果你想更改ALB Ingress的域名和端口
13 3
|
2月前
|
Kubernetes 调度 微服务
K8s 生产最佳实践 - 限制 NameSpace 资源用量
K8s 生产最佳实践 - 限制 NameSpace 资源用量

推荐镜像

更多