1. Ingress介绍
- Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式
- 通过Ingress资源来配置不同的转发规则,从而达到根据不同的规则设置访问集群内不同的Service所对应的后端Pod
2. MSE Ingress Controller
2.1. 介绍
MSE云原生网关提供的一个组件,该组件核心功能是方便用户使用常规的K8s Custom Resource来管理MSE云原生网关实例的生命周期以及Ingress资源的监听选项。
2.2. 安装方式
- 组件发布在容器服务的应用市场中
- 由用户通过Helm包管理的形式自行安装到ACK集群中
2.3. 概念介绍
- Service是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。
- Ingress是反向代理规则,用来规定HTTP和HTTPS请求应该被转发到哪个Service上。例如:根据请求中不同的Host和URL路径,让请求转发到不同的Service上。
- MseIngressConfig是由MSE Ingress Controller提供的CRD来描述云原生网关实例基本信息。
- MSE Ingress Controller负责监听集群中的MseIngressConfig资源,实时动态维护该资源对应的云原生网关实例的生命周期以及网关与ACK集群的关联性。
2.4. 主要功能
2.4.1. 管理云原生网关的生命周期
MSE Ingress Controller负责监听集群中用户创建的MseIngressConfig资源,实时动态维护该资源对应的云原生网关实例的生命周期以及网关与ACK集群的关联性。
MseIngressConfig资源示例
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
name: test
spec:
name: mse-ingress
common:
pay:
payType: POSTPAY
instance:
spec: 4c8g
replicas: 3
network:
vSwitches:
- "vsw-1"
- "vsw-2"
publicSLBSpec: slb.s2.small
securityGroupType: normal
global:
ipAccessControl:
whitelist:
- 1.1.xx.xx
- 2.2.xx.xx
monitor:
logging:
sls:
reuseProject: "xxx" # 为空,表示使用默认
tracing:
xTrace:
sampleRate: "100"
ingress:
local:
ingressClass: mse # 默认为mse,比 K8s IngressClass 资源的优先级低
watchNamespace: "" # ""表示所有命名空间中的Ingress资源
2.4.2. 监听Ingress资源
MSE云原生网关的控制面通过关联的ACK集群的API Server获取Ingress资源的变化,然后动态更新MSE云原生网关的路由规则。当MSE云原生网关收到请求时,匹配Ingress转发规则转发请求到后端Service所对应的Pod。
云原生网关支持Nginx-Ingress中比较常用和核心的Annotation,方便从Nginx-Ingress无缝迁移至MSE云原生网关。
在ACK集群中创建ingress资源,网关会监听该资源并展示到控制台上。
3. 测试与验证
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
version: v1
spec:
containers:
- image: specialyang/go-httpbin:v3
args:
- "--port=8090"
- "--version=v1"
imagePullPolicy: Always
name: go-httpbin
ports:
- containerPort: 8090
---
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
spec:
ports:
- port: 80
targetPort: 8090
protocol: TCP
selector:
app: go-httpbin
创建并应用以下Ingress资源,在annotations中包含超时的相关配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.org/proxy-connect-timeout: "30s"
nginx.org/proxy-read-timeout: "20s"
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 80
path: /version
pathType: Prefix
查看目标Ingress的IP地址。
kubectl get ingress ingress
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress mse * 114.55.xx.xx 80 12m
进行访问测试
curl 114.55.xx.xx/version
预期输出:
version:v1