Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而根据转发规则访问集群内Pod。本文介绍如何通过控制台和Kubectl方式创建、查看、更新和删除Ingress。
控制台操作指导
创建Ingress
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在路由页面单击创建,在创建对话框配置路由名称,本例中为nginx-ingress。
- 配置路由规则。
路由规则是指授权入站到达集群服务的规则,支持HTTP或HTTPS规则,配置项包括域名(虚拟主机名称)、URL路径、服务名称、端口配置和路由权重等。
本例中配置添加一条复杂的路由规则,配置集群默认的测试域名和虚拟主机名称,展示基于域名的路由服务。
- 基于默认域名的简单路由,即使用集群的默认域名对外提供访问服务。
- 基于域名的简单扇出路由。本例中使用一个虚拟的主机名称作为测试域名对外提供访问服务,为两个服务配置路由权重,并为其中一个服务设置灰度发布规则。若您在生产环境中,可使用成功备案的域名提供访问服务。
- 配置TLS。
选中
开启TLS,配置安全的路由服务。具体请参见
Ingress支持。
- 您可选择使用已有密钥。
- 登录Master节点,执行以下命令创建tls.key和tls.crt。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
- 创建一个Secret。
kubectl create secret tls foo.bar --key tls.key --cert tls.crt
- 执行命令
kubectl get secret
,您可看到该Secret已经成功创建。在Web界面可选择创建的foo.bar这个Secret。
- 您可选择在TLS界面上利用已创建的TLS私钥和证书,一键创建Secret。
- 登录Master节点,执行以下命令创建tls.key和tls.crt。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
- 执行
vim tls.key
和vim tls.crt
获取生成的私钥和证书。
- 将证书和私钥的内容复制到TLS新建密钥的面板。
- 配置灰度发布策略。
容器服务支持多种流量切分方式,适用于灰度发布以及AB测试场景。
- 基于Request Header的流量切分。
- 基于Cookie的流量切分。
- 基于Query Param的流量切分。
设置灰度规则后,请求头中满足灰度发布匹配规则的请求才能被路由到新版本服务new-nginx中。如果该服务设置了100%以下的权重比例,满足灰度规则的请求会继续依据权重比例路由到对应服务。
在本例中,设置Header请求头带有foo=^bar$
的灰度发布规则,仅带有该请求头的客户端请求才能访问到new-nginx服务。
- 服务:路由规则配置的服务。
- 类型:支持Header(请求头)、Cookie和Query(请求参数)的匹配规则。
- 名称和匹配值:自定义的请求字段,名称和匹配值为键值对。
- 匹配规则:支持正则匹配和完全匹配。
- 配置注解。
单击
添加,在
类型下拉框中,您可以:
- 选择自定义注解:输入注解名称和值,即Ingress的Annotation键值对,Ingress的注解请参见Annotations。
- 选择Ingress-Nginx:根据名称选择或搜索要配置的注解。
您可为路由添加一条典型的重定向注解。即
nginx.ingress.kubernetes.io/rewrite-target:/
,表示将
/path路径重定向到后端服务能够识别的根路径
/。
说明 本例中未对服务配置访问路径,因此不需要配置重定向注解。重定向注解的作用是使Ingress以根路径转发到后端,避免访问路径错误配置而导致的404错误。
- 添加标签。
标签的作用是为Ingress添加对应的标签,标示该Ingress的特点。
- 最后单击创建,返回路由列表。
等待一段时间,可以看到一条路由。
查看Ingress
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在路由页面单击目标路由操作列的详情。
在路由详情页面查看路由详细信息。
更新Ingress
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在路由页面单击目标路由操作列的变更。
- 在更新对话框中修改路由参数,然后单击更新。
删除Ingress
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在路由页面选择目标路由操作列的。
- 在提示对话框中单击确定。
Kubectl操作指导
创建Ingress
- 创建Deployment和Service。
在创建Ingress资源之前,必须创建外部访问Kubernetes集群中的服务。
- 使用以下内容,创建test-deployment-service.yaml。
以下YAML文件中包含了一个名为test-web1的Deployment和一个名为web1-service的Service。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-web1
labels:
app: test-web1
spec:
replicas: 1
selector:
matchLabels:
app: test-web1
template:
metadata:
labels:
app: test-web1
spec:
containers:
- name: test-web1
imagePullPolicy: IfNotPresent
image: registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: web1-service
spec:
type: ClusterIP
selector:
app: test-web1
ports:
- port: 8080
targetPort: 8080
- 执行以下命令,创建Deployment和Service。
kubectl apply -f test-deployment-service.yaml
- 创建Ingress。
- 使用以下内容,创建test-ingress.yaml。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: default
spec:
rules:
- host: test-ingress.com
http:
paths:
- path: /foo
backend:
service:
name: web1-service
port:
number: 8080
pathType: ImplementationSpecific
- path: /bar
backend:
service:
name: web1-service
port:
number: 8080
pathType: ImplementationSpecific
name
:Ingress的名称,本例为test-ingress。
host
:指定服务访问域名。
path
:指定访问的URL路径。SLB将流量转发到backend
之前,所有的入站请求都要先匹配host
和path
。
backend
:由服务名称和服务端口组成。
- 服务名称:Ingress转发的
backend
服务名称。
- 服务端口:服务暴露的端口。
- 执行以下命令,创建Ingress。
kubectl apply -f test-ingress.yaml
查看Ingress
执行以下命令,查看Ingress。
kubectl get ingress
更新Ingress
执行以下命令,更新Ingress。kubectl edit ingress <ingress名称>
删除Ingress
执行以下命令,删除Ingress。kubectl delete ingress <ingress名称>