kubernetes系列教程(十八)TKE中实现ingress服务暴露

写在前面

上一篇文章中介绍了基于Nginx实现Ingress Controller的实现,介绍了Nginx Ingress Controller安装、相关功能,TLS,高级特性等介绍,本章开始介绍基于腾讯云TKE实现ingress服务暴露。

1. TKE ingress

1.1 TKE ingress架构

TKE是Tencent Kubernetes Engine即腾讯云基于kubernetes提供的公有云上容器云服务,TKE提供了两种暴露服务的方式:service和ingress。

  • 内网CLB,四层负载均衡,提供VPC内访问,通过node节点的NodePort转发至service;
  • 外网CLB,四层负载均衡,提供公网访问,需要node节点具有访问公网的能力;
  • ingress, 七层负载均衡,提供http和https接入,提供ingress控制器的功能,借助NodePort转发

要使用TKE的ingress功能,需要了解一下相关的组件内容:

  • l7-lb-controller ingress客户端,安装在kube-system,用于解析ingress配置并更新CLB的规则
  • CLB 七层负载均衡,提供ingress controller的功能,根据ingress规则创建http/https监听器,配置转发规则,以NodePort端口绑定后端RS
  • Service 用于ingress服务发现,通过NodePort方式接入CLB
  • 证书 用于提供https接入,配置在CLB负载均衡上,提供CA签名证书,通过Secrets封装给CLB使用

由于nginx ingress controller是直接以Pod的形势部署在kubernetes集群中,借助于service的服务发现可直接实现和pod通讯,而TKE中ingress controller未直接部署在k8s集群中,网络的接入需借助于service的NodePort实现接入,其数据流如下图:

1.2 ingress虚拟主机

环境说明: 创建两个Deployment并以NodePort方式暴露服务,www1.happylau.cn对应tke-app-1服务,同理www2.happylau.cn对应tke-app-2服务,如下演示操作过程:

1、创建两个Deployments

[[email protected]_10_2_centos ingress]# kubectl create deployment tke-app-1 --image=nginx:1.7.9
[[email protected]_10_2_centos ingress]# kubectl create deployment tke-app-2 --image=nginx:1.7.9

2、 将两个Deployment以NodePort的方式暴露服务

[[email protected]_10_2_centos ~]# kubectl expose deployment tke-app-1 --port=80 --type=NodePort
[[email protected]_10_2_centos ~]# kubectl expose deployment tke-app-2 --port=80 --type=NodePort

查看服务列表
[[email protected]_10_2_centos ~]# kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   172.16.255.1     <none>        443/TCP        83d
tke-app-1    NodePort    172.16.255.91    <none>        80:30597/TCP   2s
tke-app-2    NodePort    172.16.255.236   <none>        80:31674/TCP   73s

3、定义ingress规则,定义两个host将不同主机转发至backend不同的service

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tke-ingress-demo
  annotations:
    kubernetes.io/ingress.class: qcloud
spec:
  rules:
  - host: www1.happylau.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: tke-app-1
          servicePort: 80
  - host: www2.happylau.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: tke-app-2
          servicePort: 80 

4、 应用ingress规则,并查看ingress详情,可以看到ingress创建了一个公网CLB实例

#应用ingress规则
[[email protected]_10_2_centos ingress]# kubectl apply -f tke-ingress-demo.yaml
ingress.extensions/tke-ingress-demo created

#查看ingress列表
[[email protected]_10_2_centos ingress]# kubectl get ingresses
NAME               HOSTS                               ADDRESS         PORTS   AGE
tke-ingress-demo   www1.happylau.cn,www2.happylau.cn   140.143.84.xxx   80      67s

#查看 ingress详情
[[email protected]_10_2_centos ingress]# kubectl describe ingresses tke-ingress-demo
Name:             tke-ingress-demo
Namespace:        default
Address:          140.143.84.xxx
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host              Path  Backends
  ----              ----  --------
  www1.happylau.cn
                    /   tke-app-1:80 (172.16.1.15:80)
  www2.happylau.cn
                    /   tke-app-2:80 (172.16.2.17:80)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"qcloud"},"name":"tke-ingress-demo","namespace":"default"},"spec":{"rules":[{"host":"www1.happylau.cn","http":{"paths":[{"backend":{"serviceName":"tke-app-1","servicePort":80},"path":"/"}]}},{"host":"www2.happylau.cn","http":{"paths":[{"backend":{"serviceName":"tke-app-2","servicePort":80},"path":"/"}]}}]}}

  kubernetes.io/ingress.class:                  qcloud
  kubernetes.io/ingress.qcloud-loadbalance-id:  lb-a0xwhcx3
Events:
  Type    Reason           Age                From                     Message
  ----    ------           ----               ----                     -------
  Normal  EnsuringIngress  69s (x3 over 89s)  loadbalancer-controller  Ensuring ingress
  Normal  CREATE           69s (x2 over 70s)  loadbalancer-controller  create loadbalancer succ
  Normal  EnsuredIngress   68s (x3 over 70s)  loadbalancer-controller  Ensured ingress

5、测试验证,将IP和域名写入到hosts文件中,访问域名测试验证,如下通过curl解析的方式测试验证

6、ingress会创建一个CLB,并在CLB中创建监听器、设置转发规则、绑定后端RS,下图是CLB上自动生成的规则

通过上面演示可知:

  • 自动创建CLB实例
  • CLB实例上配置监听器
  • 配置转发规则
  • 绑定Node节点
  • 绑定端口为service创建的NodePort

1.3 ingress证书加密

TKE支持将在CLB中加载证书实现https加密传输,证书是经过第三方认证的CA签名过的证书,需要先购买好证书,通过Secrets对象在kubernetes集群中定义,如下演示https的实现。

1、 通过Secrets创建证书,先获取到证书的id,如果没有则先创建证书,证书管理,本文以证书id TKPmsWb3 为例,通过stringData能实现base64自动加密

apiVersion: v1
kind: Secret
metadata:
  name: ingress-ssl-key
stringData:
  qcloud_cert_id: TKPmsWb3
type: Opaque

#生成Secrets对象
[[email protected]_10_2_centos ingress]# kubectl apply -f ingress-secret.yaml
secret/ingress-ssl-key created
[[email protected]_10_2_centos ingress]# kubectl get secrets ingress-ssl-key
NAME              TYPE     DATA   AGE
ingress-ssl-key   Opaque   1      7s

#查看secrets详情,可得知VEtQbXNXYjM= 已自动通过base64加密
[[email protected]_10_2_centos ingress]# kubectl get secrets ingress-ssl-key -o yaml
apiVersion: v1
data:
  qcloud_cert_id: VEtQbXNXYjM=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"ingress-ssl-key","namespace":"default"},"stringData":{"qcloud_cert_id":"TKPmsWb3"},"type":"Opaque"}
  creationTimestamp: "2020-01-03T11:53:33Z"
  name: ingress-ssl-key
  namespace: default
  resourceVersion: "7083702418"
  selfLink: /api/v1/namespaces/default/secrets/ingress-ssl-key
  uid: aaea4a86-2e1f-11ea-a618-ae9224ffad1a
type: Opaque

#可以通过base64查看解密后的内容,和配置文件中定义的id一致
[[email protected]_10_2_centos ingress]# echo VEtQbXNXYjM= | base64 -d
TKPmsWb3

2、准备环境,创建一个nginx的Deployment

[[email protected]_10_2_centos ~]# kubectl create deployment tke-ingress-ssl-demo --image=nginx:1.7.9
deployment.apps/tke-ingress-ssl-demo created
[[email protected]_10_2_centos ~]# kubectl get deployments
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
tke-ingress-ssl-demo   1/1     1            1           6s

3、将Deployment暴露以NodePort类型暴露service

[[email protected]_10_2_centos ~]# kubectl expose deployment tke-ingress-ssl-demo --port=80 --type=NodePort
service/tke-ingress-ssl-demo exposed
[[email protected]_10_2_centos ~]# kubectl get service tke-ingress-ssl-demo -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-01-03T12:00:05Z"
  labels:
    app: tke-ingress-ssl-demo
  name: tke-ingress-ssl-demo
  namespace: default
  resourceVersion: "7083890283"
  selfLink: /api/v1/namespaces/default/services/tke-ingress-ssl-demo
  uid: 94659f42-2e20-11ea-a618-ae9224ffad1a
spec:
  clusterIP: 172.16.255.64
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30324
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: tke-ingress-ssl-demo
  sessionAffinity: None
  type: NodePort    #类型为NodePort
status:
  loadBalancer: {}

4、定义ingress规则,加载证书实现https转发

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tke-ingress-ssl
  annotations:
    kubernetes.io/ingress.class: qcloud
    qcloud_cert_id: TKPmsWb3
spec:
  rules:
  - host: www.happylauliu.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: tke-ingress-ssl-demo
          servicePort: 80
  tls:
  - hosts:
    - www.happylauliu.cn
    secretName: ingress-ssl-key

5、应用ingress规则,并查看详情,此时已正常创建CLB并配置规则

[[email protected]_10_2_centos ingress]# kubectl apply -f ingress-demo.yaml
ingress.extensions/tke-ingress-ssl created

#查看ingress详情
[[email protected]_10_2_centos ingress]# kubectl describe ingresses tke-ingress-ssl
Name:             tke-ingress-ssl
Namespace:        default
Address:          140.143.83.xxx    #CLB的外网IP
Default backend:  default-http-backend:80 (<none>)
TLS:
  ingress-ssl-key terminates www.happylauliu.cn
Rules:
  Host                Path  Backends
  ----                ----  --------
  www.happylauliu.cn
                      /   tke-ingress-ssl-demo:80 (172.16.0.25:80)
Annotations:
  qcloud_cert_id:                                    TKPmsWb3
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"qcloud","qcloud_cert_id":"TKPmsWb3"},"name":"tke-ingress-ssl","namespace":"default"},"spec":{"rules":[{"host":"www.happylauliu.cn","http":{"paths":[{"backend":{"serviceName":"tke-ingress-ssl-demo","servicePort":80},"path":"/"}]}}],"tls":[{"hosts":["www.happylauliu.cn"],"secretName":"ingress-ssl-key"}]}}

  kubernetes.io/ingress.class:                  qcloud
  kubernetes.io/ingress.qcloud-loadbalance-id:  lb-2kcrtwbn  #CLB的实例id
Events:
  Type    Reason           Age                From                     Message
  ----    ------           ----               ----                     -------
  Normal  EnsuringIngress  51s (x3 over 73s)  loadbalancer-controller  Ensuring ingress
  Normal  CREATE           51s (x2 over 52s)  loadbalancer-controller  create loadbalancer succ
  Normal  EnsuredIngress   49s (x3 over 52s)  loadbalancer-controller  Ensured ingress

6、测试验证,hosts文件中解析www.happylauliu.cn到CLB的VIP,或者DNS解析,打开浏览器访问站点,由于是经过CA认证签名的证书,因此没有提示告警信息,查看证书的详情信息

7、查看CLB的配置可得知,CLB上配置了443的监听端口,并关联了证书,采用单向认证方式

通过CLB的配置规则可知,CLB配置了监听443的监听器,80端口并未设置规则,因此此时无法访问http,如何实现在TKE使用ingress实现http和https共存呢,可以通过定义kubernetes.io/ingress.http-rules和

kubernetes.io/ingress.https-rules实现

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tke-ingress-ssl
  annotations:
    kubernetes.io/ingress.class: qcloud
    kubernetes.io/ingress.rule-mix: "true"  #开启混合规则配置,kubernetes.io/ingress.http-rules配置规则
    kubernetes.io/ingress.http-rules: ‘[{"host":"www.happylauliu.cn","path":"/","backend":{"serviceName":"tke-ingress-ssl-demo","servicePort":"80"}}]‘
    qcloud_cert_id: TKPmsWb3
spec:
  rules:
  - host: www.happylauliu.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: tke-ingress-ssl-demo
          servicePort: 80
  tls:
  - hosts:
    - www.happylauliu.cn
    secretName: ingress-ssl-key

设置ingress.http-rules和ingress.https-rules注解之后,会在监听器中创建http和https的转发规则,并绑定RS,此时访问http和https均能实现站点访问,CLB对应的规则内容如下图:

通过测试访问http://www.happylauliu.cn/和https://www.happylauliu.cn/均能正常访问,如果要实现访问http自动跳转到https,则可以在控制台开启自动跳转的功能,如下图:

开启重定向功能后再次访问http站点后此时会自动跳转到https,如下图所示location已经跳转至https://www.happylauliu.cn/

写在最后

通过上述的演示在腾讯云公有云环境下ingress controller的实现,腾讯云TKE通过使用CLB实现和kubernetes ingress集成,借助于service的NodePort实现转发,通过公有云专用的CLB能够最大程度保障ingress接入性能。同时,ingress能够使用腾讯云上的证书实现https加密功能。

参考文献

Ingress配置:https://kubernetes.io/docs/concepts/services-networking/ingress/

Ingress控制器:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

ingress基本配置:https://cloud.tencent.com/document/product/457/31711

ingress证书:https://cloud.tencent.com/document/product/457/40538

CLB配置http自动跳转:https://cloud.tencent.com/document/product/214/8839



当你的才华撑不起你的野心时,你就应该静下心来学习

返回kubernetes系列教程目录

原文地址:https://blog.51cto.com/happylab/2464423

时间: 2024-08-24 07:48:14

kubernetes系列教程(十八)TKE中实现ingress服务暴露的相关文章

ComicEnhancerPro 系列教程十八:JPG文件长度与质量

作者:马健邮箱:[email protected] 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十八:JPG文件长度与质量 众所周知,JPG是一种"有损"压缩格式,与PNG等无损压缩格式相比,最大的问题是:如果反复压缩,会造成图像质量逐渐退化.所以在对JPG文件进行处理,并且输出仍然选择JPG格式的情况下,很多人都会问同样的一个问题:如何才能在尽情享受有损压缩带来的较小文件长度的便利前提下,尽量避免图像质量退化? 为了解

Spring Boot2 系列教程 (十八) | 整合 MongoDB

微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 如题,今天介绍下 SpringBoot 是如何整合 MongoDB 的. MongoDB 简介 MongoDB 是由 C++ 编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,它将数据存储为一个文档,数据结构由键值 (key=>value) 对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组,非常灵活.存储结构如下: { "studentId": &qu

kubernetes系列教程(九)初识Pod存储管理

写在前面 上一篇文章中kubernetes系列教程(八)Pod健康检查机制介绍了kubernetes中Pod健康检查机制,通过实战介绍了kubernetes中两种健康检查探针:livenessProbe存活检查,readinessProbe就绪检查,存活检查用于检查应用的可用性,就绪检查用于检查容器是否准备接受流量,健康检查包含三种探测的方法:exec命令行探测,tcpSocket端口检测,httpGet请求检测,分别适用于不同场景下的健康检查.接下来介绍kubernetes系列教程pod的存储

kubernetes系列教程(一)初探kubernetes功能与组件

1. kubernetes简介 1.1 kubernetes介绍 Kubernetes是google开源的一套微服务,容器化的编排引擎,是google内部容器十多年实战沉淀的结晶,已战胜Swarm,Messo成为容器编排的行业标准.kuberntes内置有很多非常优秀的特性使开发者专注于业务本身,其包含的功能如下: Service discovery and load balancing,服务发现和负载均衡,通过DNS实现内部解析,service实现负载均衡 Storage orchestrat

MongoDB系列教程(八):GridFS存储详解

MongoDB系列教程(八):GridFS存储详解 GridFS简介 mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS. GridFS实现原理 在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一

CRL快速开发框架系列教程十(导出对象结构)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

Cocos2d-x 3.x 图形学渲染系列二十八

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 昨天,刚从丈母娘家回来,继续博客的更新,接着Cocos2d-x 3.x图形学渲染系列二十七继续系列二十八的编写. 接下来读取FBX模型文件信息,首先要做的是把读取的模型信息进行归类并

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当

Unity3D脚本中文系列教程(十六)

Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocessGameObjectWithUserProperties (root : GameObject, propNames : string[], values : object[]) : void 描述:在导入文件时,为每个至少附加了一个用户属性的游戏物体调用propNames是一个string[ ],