这里会讲述通过控制台和命令行创建ingress
术语
ingress:通俗的理解是:通过7层负载均衡转发对应url到对应的path中,实现准确转发流量目的。
clb:腾讯云负载均衡,这里有4层负载均衡(传统lb)和7层负载均衡(应用lb)
什么是Ingress?
这里引用k8s的例子说明:
Ingress是一组规则,允许入站连接到达群集服务。
代码语言:txt复制 internet
|
[ Ingress ]
--|-----|--
[ Services ]
公网访问 ingress
ingress
转发流量到对应的Service
中
作用:你可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress。 Ingress controller负责实现Ingress,通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA方式处理流量。
先决条件(知会即可)
在使用ingress前需要Ingress Controller
来实现Ingress
如果没有ingress Controller,单纯创建ingress是无效的。
TKE会在节点上部署一个ingress controller
,所以这个环节可以忽略,知会即可,这是使用ingress的前提条件。
ingress 配置
http的ingress创建 最简化配置如下:
代码语言:txt复制apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
rules:
- host: www.lingxin.site
http:
paths:
- path: /
backend:
serviceName: nginx
servicePort: 80
1-4行:跟Kubernetes的其他配置一样,ingress的配置也需要apiVersion,kind和metadata字段。配置文件的详细说明请查看部署应用, 配置容器和 使用resources.
5-7行: spec中包含配置一个loadbalancer或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。
8-9行:每条http规则包含以下信息:一个host配置项(比如www.lingxin.site,如果不填写host则是*,不推荐不填写),path列表(比如:/),每个path都关联一个backend(比如nginx :80)。在loadbalancer将流量转发到backend之前,所有的入站请求都要先匹配host和path。
10-12行:正如services doc中描述的那样,backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
host: 域名信息
path: 指定的访问路径,这里我设置为 /
serviceName:对应的service name
servicePort:端口
创建
复制上面的yaml 然后创建
代码语言:txt复制$ kubectl create -f ingress.yaml
ingress.extensions "test-ingress" created
使用kubectl create -f命令创建,然后查看ingress:
代码语言:txt复制$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
test-ingress www.lingxin.site 134.175.254.100 80 1m
134.175.254.100就是ingress controller为了实现Ingress而分配的IP地址(这里是联动了clb的)
创建http的到此结束,接下来讲如何手动创建https的ingress
TLS
你可以通过指定包含TLS私钥和证书的secret来加密Ingress。目前,Ingress仅支持单个TLS端口443
1.在clb
ORTKE
的控制台中申请证书
这里请按个人需求申请证书
SSL证书格式要求及格式转换说明
2.在控制台选中对应的https证书并且创建ingress
效果图:
查看ingress
代码语言:txt复制$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
https-ingress-test localhost 134.175.254.220 80, 443 1m
在port 中可以看到443端口
实现过程:
1.创建https的ingress 需要有tls的secret
,我们在控制台中选中https证书,创建ingress时,会先创建一个secret
然后在创建ingress
引用对应的sercret
$ kubectl get secret
NAME TYPE DATA AGE
https-ingress-test Opaque 1 4m
secret的具体申明
代码语言:txt复制$ kubectl get secret https-ingress-test -o yaml
apiVersion: v1
data:
qcloud_cert_id: Tnd3eHJTM2k=
kind: Secret
metadata:
creationTimestamp: 2018-10-12T10:00:07Z
name: https-ingress-test
namespace: default
resourceVersion: "45966538468"
selfLink: /api/v1/namespaces/default/secrets/https-ingress-test
uid: 98e6951e-ce05-11e8-984e-52540008e6f8
type: Opaque
2.查看 ingress 的 yaml文件
代码语言:txt复制$ kubectl get ingress https-ingress-test -o yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
description: 创建https ingress
kubernetes.io/ingress.class: qcloud
kubernetes.io/ingress.http-rules: '[{"host":"localhost","path":"/","backend":{"serviceName":"non-service","servicePort":65535}}]'
kubernetes.io/ingress.https-rules: "null"
kubernetes.io/ingress.internetChargeType: BANDWIDTH_POSTPAID_BY_HOUR
kubernetes.io/ingress.internetMaxBandwidthOut: "1"
kubernetes.io/ingress.qcloud-loadbalance-id: lb-jgalbq0z
kubernetes.io/ingress.rule-mix: "true"
qcloud_cert_id: NwwxrS3i
random: "8847762025636723283"
creationTimestamp: 2018-10-12T10:00:07Z
generation: 1
name: https-ingress-test
namespace: default
resourceVersion: "45966587642"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/https-ingress-test
uid: 98eb880a-ce05-11e8-984e-52540008e6f8
spec:
rules:
- host: localhost
http:
paths:
- backend:
serviceName: non-service
servicePort: 65535
path: /
tls:
- secretName: https-ingress-test
status:
loadBalancer:
ingress:
- ip: 134.175.254.220
到此 对https的ingress应有一个大体上的了解。
由于通过控制台创建的ingress没有配置对应的转发规则,所以这里server默认都是non-service
端口65535
在控制台创建规则后 ingress会有对应的修改。
代码语言:txt复制$ kubectl get ing https-ingress-test -o yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
description: 创建https ingress
kubernetes.io/ingress.class: qcloud
kubernetes.io/ingress.http-rules: "null"
kubernetes.io/ingress.https-rules: '[{"host":"www.lingxin.xyz","path":"/","backend":{"serviceName":"nginx","servicePort":80}}]'
kubernetes.io/ingress.internetChargeType: BANDWIDTH_POSTPAID_BY_HOUR
kubernetes.io/ingress.internetMaxBandwidthOut: "1"
kubernetes.io/ingress.qcloud-loadbalance-id: lb-jgalbq0z
kubernetes.io/ingress.rule-mix: "true"
qcloud_cert_id: NwwxrS3i
random: "632049962850261178"
creationTimestamp: 2018-10-12T10:00:07Z
generation: 2
name: https-ingress-test
namespace: default
resourceVersion: "45968157271"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/https-ingress-test
uid: 98eb880a-ce05-11e8-984e-52540008e6f8
spec:
rules:
- host: www.lingxin.xyz
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
path: /
tls:
- secretName: https-ingress-test
status:
loadBalancer:
ingress:
- ip: 134.175.254.220
到此 https 的ingress已实现,如想通过命令行创建https思路如下
1.创建对应的secret
2.在ingress的yaml中填上qcloud_cert_id:证书ID
这里不同于k8s官网的实现细节。所以通过控制台创建https的ingress是最好的。
k8s ingress 官网地址
不管如何了解底层的知识后,还是用控制台创建是最佳的选择。