Home 技术文章 在Kubernetes群集中将Edgio Delivery CDN实施为入口提供程序
Applications

在Kubernetes群集中将Edgio Delivery CDN实施为入口提供程序

About The Author

Outline

前言

以下是为经验丰富的Kubernetes从业人员将Kubernetes与Edgio Delivery CDN服务集成的示例。 它假定对Kubernetes有一定程度的了解,并对标准Internet协议(如TCP,DNS和HTTP/HTTPS)有一定的了解。 最终目标是演示一种使Edgio Delivery CDN服务显示为标准入口的方法。 Kubernetes用户可以在熟悉的系统(如Portainer或Terraform)中维护入口配置

Kubernetes

Kubernetes.io将Kubernetes定义为”用于实现容器化应用程序部署,扩展和管理自动化的开放源代码系统。” 有多种方法可以启动群集。 最快捷,最简单的方法是利用允许”一键式”部署的众多云提供商之一。

Kubernetes聚类包含许多部分。 在演示中,我们将重点介绍总数的子集。

Kubernetes部件

  • 节点:承载工作负载和服务的计算机或VM。
  • 工作负载:应用程序简单或复杂
  • POD:运行应用程序软件的容器。 一个或多个Pod构成工作负载。
  • 服务:将工作负荷暴露给其他工作负荷或服务器的机制
  • Ingress:向外界公开服务的机制

Edgio

Edgio通过我们无缝集成的交付,应用程序和流媒体解决方案,在边缘实现无与伦比的速度,安全性和简单性,从而使互联生活更快速,更安全,更易于管理。 我们全球范围的技术和专家服务为世界顶级品牌提供了动力,能够提供最快,最具活力且无摩擦的教育,娱乐,活动和 应用程序。 Edgio致力于为客户提供无与伦比的服务,并在每一步提供价值,Edgio是首选合作伙伴,推动全球互联网流量,以支持最受欢迎的节目,电影,体育,游戏和音乐以及即时加载网站。

体系结构

Edgio交付CDN

在这个演示中,我们使用了Edgio python SDK(位于GitHub )–llnw/llnw-sdk-python: Limelight Networks Python SDK。 基本配置将保持简单。

配置CDN时,需要以下数据(身份验证除外)。

  • 简称:Edgio Delivery CDN中包含CDN规则的唯一标识符
  • 已发布主机名:CDN面向Internet的主机名。 在本演示中,之前配置了主机名cstradtman.s.llnwi.net。
  • 发布的URL路径:映射到相关特定规则的路径。
  • 源主机名:源服务器的主机名。 在本例中,循环记录指向Kubernetes群集。
  • 源URL路径:与主机名关联的目标路径。 在这种情况下,它将是空白的,因为我们将在本文档后面介绍它。 在此演示中,工作负载将按端口号而不是路径进行区分。

DNS

本演示使用Vultr DNS API。 使用IP地址作为源服务器配置CDN不是最佳做法。 本演示使用API创建或修改指向群集节点的循环记录。

群集

演示在三节点群集上的Vultr中。

命名空间

该演示将存在于默认名称空间下,因为它是在此群集上运行的唯一对象

节点

  • VKE群集–3个节点,每个节点都有
    • 4G RAM
    • 80G磁盘
    • 2个虚拟CPU
    • 1 G网络

工作负载

工作负载是一个简单的Python程序,它返回有关HTTP连接的基本信息。 我们以内联方式部署此演示,这不是典型的部署方法。 但是,它允许演示完全独立,而不是依赖外部来构建容器并存储容器。 源代码见附录1。 实际的Python代码是斜体,描述部署的YAML代码则不是。 工作负载使用TCP端口8000。

服务

有几种服务类型可用。 我们使用的是”NodePort”服务类型。 它通过随机选择的高端口号公开群集外部IP地址上的服务。 Kubernetes负责与运行工作负载的节点的连接。

入口

Kubernetes入口是一个软件对象,用于描述使Kubernetes服务在群集外部可用的资源集合的行为。

Ingress控制器结合了实例化Ingress软件对象的软件和/或硬件。

CDN是功能丰富的分布式反向代理,除反向代理功能外,CDN通常还具有灵活的缓存算法,地理多样性,安全功能(ACL (GEO,方法,regex),Web应用程序防火墙,水印, 以及其他在简单反向代理中找不到的更高级功能。

Kubernetes对象监控的API定义完善,许多HTTP反向代理和负载平衡器已扩展为作为入口控制器工作。 例如,NGINX和HAProxy是已扩展为作为入口控制器工作的旧学校代理,而Traefik和Itsio等代理是与Kubernetes并行开发的。 CDN是从简单的反向代理自然发展而来的下一阶段。 在此演示中,我们将创建一个自定义入口控制器,用于控制Edgio Delivery CDN。 描述入口时通常需要的数据为

  • 公共主机名:Kubernetes服务可用的主机名
  • 公共路径:与Kubernetes服务可用的公共主机名关联的路径
  • 后端服务名称:Kubernetes服务节定义的service-name
  • 后端端口:与服务说明中的端口说明匹配的名称

Edgio Delivery CDN资产映射:

Kubernetes

Edgio交付CDN

公共主机名

已发布的主机名

公共路径

发布的URL路径

后端服务名称

在Kubernetes群集中是唯一的

外部世界不知道/不可用

源主机名

完全限定的域名

实际上不是一对一

其背后的逻辑是:

  • 侦听来自群集的命名空间入口事件
  • 如果事件类型为”已添加”。
    • 获取群集中节点的IP地址
    • 在vultr中创建DNS记录
    • 在Edgio CDN中创建指向已创建的DNS记录和NodePort服务分配的端口的CDN规则。
  • 如果事件类型为”已修改”。
    • 在Edgio CDN中查找与现有入口匹配的CDN规则
    • 修改Edgio CDN中的规则以反映事件中的新数据
  • 如果事件类型为”已删除”。
    • 在Edgio CDN中查找与已删除入口匹配的CDN规则
    • 删除Vultr中与此入口关联的DNS记录
    • 删除Edgio中与已删除入口匹配的CDN规则

配置

对象

Kubernetes对象在YAML文件中进行了说明 。 在Kubernetes中,每个配置都是一个对象。 您可以将所有部署配置放在一个文件中。 通常的做法是根据他们描述的部署部分对其进行细分。

部署

在附录1中,有一个很大的YAML文件,它是Python代码和YAML的组合。 ” spec.template.spec.containers.command”之后的所有内容都是在部署过程中转换为容器的Python代码。 从Kubernetes对象的角度来看,对我们演示非常重要的行是:

  • 种类:部署–将对象描述为部署
  • Metadata.name:服务对象使用名称来创建两者之间的链接。
  • Spec.selector.matchlabels.app:会告诉部署将应用到哪些Pod。
  • spec.template.spec.containers.image:指向Docker集线器python 3官方映像
  • Spec.template.spec.containers.ports.name:本例中要在其他对象服务中引用的端口的标签
  • spec.template.spec.containers.ports.containerport:列出从正在运行的容器公开的TCP端口

服务

  • 种类:部署–将对象描述为部署
  • Metadata.name:入口对象使用名称来创建两者之间的链接。
  • Spec.selector.app:指向部署对象中命名的部署的名称–天威-inline-service。
  • Spec.selector.type: Nouberage这将此服务定义为如上所述的Nouberage类型
  • Spec.ports.name:要由其他对象引用的端口的标签(在本例中为入口)
  • Spec.ports.protocol:定义了使用中的IP协议–TCP
  • spec.ports.port:定义此服务公开的端口
  • spec.ports.targetPort:指向部署公开的端口–在本例中为pywai-inline-deployment

入口

在附录3中,您将看到描述Edgio入口控制器的Kubernetes对象的YAML文件。 要关注的对象包括:

  • Kind:Ingress–这告诉Kubernetes它是Ingress对象
  • Medatdata.name–Kubernetes中的所有内容都必须有一个名称
  • metada.labels.cdn–此标记用于向入口控制器发出信号,表明此对象适用于edgio入口控制器
  • Spec.rules.host–公开服务的公共主机名。
  • Spec.rules.http.paths.path–与服务关联的路径。
  • Spec.rules.http.paths.backend.service.name–要公开的服务的标签
  • Spec.rules.http.paths.backend.service.port.name–要公开的服务端口的标签

配置映射

机密

Kubernetes具有用于存储敏感数据的内置机密概念。 本演示将此用于Edgio SDK和Vultr DNS API的用户名和共享密钥

代码示例

此演示的代码包含在git repos

当前设计的未来新增功能和增强功能

在未来的一篇文章中,我们将展示如何利用其他Edgio解决方案,例如应用程序。 我们可以使用Kubernetes群集作为一种方法,在不同工作流的多个Edgio CDN产品之间利用和同步配置。

附录1–pywai inline-deployment.yaml

apiVersion:APS/v1

种类:部署

元数据:

名称:pywai-inline-deployment

规格:

选择器:

匹配标签:

应用程序:pywai-inline-deployment

副本:1

模板:

元数据:

标签:

应用程序:pywai-inline-deployment

规格:

容器:

姓名: python

图片: Python:3

命令:

–/bin/sh

–”-c”

–|

CAT > / test.py <<EOF

#!/usr/bin/env python3

“”

python中用于记录请求的非常简单的HTTP服务器

用法:

server.py [<端口>]

“”

从http.server导入BaseHTTPRequestHandler,HTTPServer

导入日志记录

导入pprint

类S (BaseHTTPRequestHandler):

定义_set_response (self):

self.send_response(200)

self.send_header(‘Content-type’,”text/html”)

self.end_headers ()

定义do_get (self):

logging.info(“GET请求,\n路径:%s\n标题:\n%s\n”,str (self.path),str (pprint.pformat (self.headers))

self._set_response ()

headerinfo=pprint.pformat(self.headers.items )

ClientInfo=pprint.pformat (self.client_address)

lineinfo=pprint.pformat(self.requestline)

versioninfo=pprint.pformat(self.request_version)

self.wfile.write(“pre<> {} </pre>”.format(headerinfo -8 ). encode(‘utute’)

self.wfile.write(“pre<> {} </pre>-8 ‘)

self.wfile.write(“pre<> {} </pre>”.format(lineinfo ).-8 ‘)

self.wfile.write(“pre<> {} </pre>”.format(versioninfo -8 ). encode(‘utute’)

定义运行(server_class=HTTPServer,handler_class=S,port=8080):

logging.basicConfig(level=logging.info)

server_address =(“,端口)

httpd = server_class(server_address, handler_class)

logging.info(‘Starting httpd…\n’)

尝试:

httpd.serve_forever

键盘中断除外:

通过

httpd.server_close

logging.info(‘Stopping httpd…\n’)

如果__name__==‘__main__’:

从sys导入argv

如果len(argv)== 2:

run(port=int(argv[1])

否则:

Run()

EOF

执行python / test.py 8000

端口:

–名称:HTTP

容器端口:8000

附录2–pywai inline-service.yaml.

apiVersion:V1

种类:服务

元数据:

名称:pywai-inline-service.

规格:

选择器:

应用程序:pywai-inline-deployment

键入:NodePort

端口:

–名称:HTTP

协议:TCP

端口:80

目标端口:8000

附录3–pywai-edgio-inding.yaml

apiVersion:networking.K8s io/v1

种类:入口

元数据:

名称:external-pywai-inline-intin.

注释:

Kubernetes.io/Entry.class:edgio

标签:

CDN:边缘

规格:

规则:

–主机: <输入唯一的短名>.s.llnwi.net

HTTP:

路径:

–路径:/fred

路径类型:完全

后端:

服务:

名称:external-pywai-inline-service

端口:

名称: pywai-port

Tags

Just For You