TKE容器服务​创建ingress

2018-10-12 18:31:06 浏览数 (1)

这里会讲述通过控制台和命令行创建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的)

image.pngimage.png

创建http的到此结束,接下来讲如何手动创建https的ingress

TLS

你可以通过指定包含TLS私钥和证书的secret来加密Ingress。目前,Ingress仅支持单个TLS端口443

1.在clbORTKE的控制台中申请证书

image.pngimage.png

这里请按个人需求申请证书

image.pngimage.png

SSL证书格式要求及格式转换说明

2.在控制台选中对应的https证书并且创建ingress

image.pngimage.png

效果图:

image.pngimage.png

查看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

代码语言:txt复制
$ 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会有对应的修改。

image.pngimage.png
代码语言: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 官网地址

不管如何了解底层的知识后,还是用控制台创建是最佳的选择。

0 人点赞