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提供了丰富的扩展机制,如自定义资源定义(CRD)、Operator模式、Webhooks等,允许开发者和管理员根据需要构建复杂的自动化流程和定制化功能。此外,Kubernetes社区还发展了一大批周边工具和服务,如Helm...
ingress-nginx-controller 是 Kubernetes 社区维护的一个项目,它提供了对 Ingress 资源的实现,使得可以通过定义简单的 YAML 文件来管理对外暴露的服务路由。Nginx 作为业界广泛使用的高性能反向代理服务器,其稳定...
在实际操作中,部署 ingress-nginx 控制器时,你需要确保集群已经安装了 Kubernetes Ingress API,并正确配置了 NodePort 或 LoadBalancer 类型的 Service,以便外部能够访问。修改好 "ingress-nginx-controller-1.9...
4. **自定义资源和API扩展**:介绍如何通过CRD(Custom Resource Definition)和 Operator模式来自定义Kubernetes的资源类型,以适应特定的应用场景。 5. **监控和日志**:讲解如何集成Prometheus、Grafana等工具...
- 自定义资源:通过API Server的CRD(CustomResourceDefinition)功能,可以定义并操作自定义资源类型。 4. **Kubernetes核心概念**: - **Pods**:Kubernetes的基本运行单元,包含一个或多个紧密耦合的应用容器...
容器运行时接口(CRI)、容器网络接口(CNI)和容器存储接口(CSI)为Kubernetes提供了标准化的接口,允许与不同类型的容器运行时、网络和存储系统集成。 资源对象,如Nodes、Namespaces、Labels和Annotations,是...
书中还会涵盖Kubernetes的扩展机制,包括自定义资源定义(CRDs)和Operator模式,它们使得Kubernetes能够支持更多的工作负载类型和复杂的应用场景。安全方面,Kubernetes的安全策略、Service Accounts和Role-Based ...
Kubernetes 是一个强大的容器编排系统,它在设计之初就面临着多租户环境下的资源管理和网络隔离问题。然而,Kubernetes 的网络模型并非采用传统的硬性多租户(hard multi-tenancy)策略,而是采用了软性多租户(soft...
2. **kind**: 定义资源类型,这里是 `Ingress`。 3. **metadata**: 包含Ingress的元数据,如 `name`(资源名称)、`namespace`(命名空间)以及`annotations`(注解)。 4. **spec**: 规范化Ingress的行为,其中最...
5. **政策类型(Policy Types)**:包括“ingress”和“egress”,分别对应入站和出站流量控制。 **网络策略示例应用场景:** 1. **隔离Pod**:创建一个只允许内部通信的Pod,对外部世界完全封闭。 2. **限制特定...
Ingress 是 Kubernetes 中的一种资源,用于暴露容器应用程序的外部访问入口。ConfigMap 是 Kubernetes 中的一种资源,用于存储和管理应用程序的配置信息。 Ingress Ingress 是 Kubernetes 中的一种资源,用于暴露...
描述中的“用于ingress-nginx使用”提示我们,这个压缩包包含的资源是为设置或管理Ingress-Nginx服务而设计的。NodePort是在Kubernetes中暴露服务的一种方式,它会自动分配一个端口(通常在30000-32767范围内),...
你可能会看到如何设置 Service 来暴露应用,或者使用 Ingress 资源创建外部访问点。 3. **扩展与自动伸缩**:Kubernetes 可以根据需求自动调整应用实例的数量。书中可能有例子展示如何定义水平 Pod 自动伸缩器(HPA...
标题 "INGRESS-SVC.YAML-HK" 指向的是一个 Kubernetes 配置文件,用于定义 ingress 资源和服务。在这个场景中,"HK" 可能代表香港,暗示可能是在特定区域或环境中配置的 ingress 控制器。Ingress 是 Kubernetes 提供...
此外,这个压缩包可能还包含了自定义资源定义(Custom Resource Definition, CRD)的YAML,用于扩展Kubernetes的原生功能,支持自定义的资源类型。 学习并熟练使用这些YAML模板可以帮助开发者快速构建和管理...
10. **扩展与插件**:学习Kubernetes的扩展性,如Ingress控制器、Webhooks、Custom Resource Definitions(CRDs)等,以及如何使用Helm进行应用打包和部署。 通过这门课程的学习,你将具备强大的Kubernetes实战能力...
7. **Ingress与网络策略**:Ingress提供了对外部访问Kubernetes服务的路由规则,而网络策略则可以限制Pod间的网络通信,增强集群的安全性。 8. **StatefulSets与Jobs**:StatefulSets用于管理需要持久状态的Pod,...
Network Policies是Kubernetes的一种资源类型,允许用户定义Pod之间的网络访问规则。这有助于实现微服务间的隔离和安全性。 6. **Linux网络** 在Kubernetes中,了解基本的Linux网络原理至关重要,包括网络命名...