前言
以下是将Kubernetes与Edgio Delivery CDN服务集成的示例,适用于经验丰富的Kubernetes从业者。 它假定您对Kubernetes有一定程度的了解,并了解TCP,DNS和HTTP/HTTPS等标准互联网协议。 最后一个目标是演示一种使Edgio交付CDN服务显示为标准入口的方法。 Kubernetes用户可以在Portainer或Terraform等熟悉的系统中维护入口配置。
Kubernetes
Kubernetes.io将Kubernetes定义为”用于自动化部署,扩展和管理容器化应用程序的开源系统”。 有多种方法可以启动群集。 最快,最简单的方法是利用允许”一键式”部署的众多云提供商之一。
Kubernetes群集包含许多部分。 在演示中,我们将重点介绍总数中的一个子集。
Kubernetes Parts
- 节点:托管工作负载和服务的计算机或虚拟机。
- 工作负载:应用程序简单或复杂
- POD:在其中运行应用程序软件的容器。 一个或多个POD构成工作负载。
- 服务:将工作负荷暴露给其他工作负荷或入口的机制
- 入口:向外部世界公开服务的机制
Edgio
Edgio通过我们无缝集成的交付,应用程序和流媒体解决方案,在边缘支持无与伦比的速度,安全性和简便性,使互联生活更快,更安全,更易于管理。 我们在全球范围内扩展的技术和专家服务助力全球顶级品牌向每位用户提供最快,最动态和无摩擦的教育,娱乐,活动和应用。 Edgio致力于为客户提供无与伦比的关怀并在每一步拓展价值,是首选合作伙伴,推动全球互联网流量,支持最流行的节目,电影,体育,游戏和音乐以及即时加载网站。
体系结构
Edgio交付CDN
在这个演示中,我们使用GitHub上的Edgio python SDK–llnw/llnw-sdk-python:Limelight Networks Python SDK。 基本配置将保持简单。
配置CDN时,需要以下数据(身份验证除外)。
- 简称:Edgio交付CDN中包含CDN规则的唯一标识符。
- 已发布的主机名:从CDN面向Internet的主机名。在此演示中,主机名cstradtman.s.llnwi.net之前已配置。
- 已发布URL路径:映射到相关特定规则的路径。
- 源主机名:源服务器的主机名。 在这种情况下,循环记录指向Kubernetes群集。
- 源URL路径:与主机名关联的目标路径。 在这种情况下,它将是空白的,因为我们将在本文档后面介绍它。 在此演示中,工作负载将按端口号而不是路径来区分。
DNS
演示使用Vultr DNS API。 使用IP地址作为源服务器配置CDN不是最佳做法。 该演示使用API创建或修改指向群集节点的循环A记录。
群集
演示位于三节点群集上的Vultr中。
名称空间
该演示程序将存在于默认命名空间下,因为它是该群集上唯一运行的程序
节点
- VKE群集–每个节点3个
- 4g柱塞
- 80G磁盘
- 2个vCPU
- 1 G网络
工作负载
工作负载是一个简单的Python程序,它返回有关HTTP连接的基本信息。 我们以内联方式部署此演示,这不是典型的部署方法。 但是,它允许演示完全独立,而不是外部依赖来构建和存储容器。 源代码载于附录1。 实际的Python代码是斜体化的,而描述部署的YAML代码则不是。 工作负荷使用TCP端口8000。
服务
有多种服务类型可用。 我们正在使用”NodePort”服务类型。 它在随机选择的高端口号上显示群集外部IP地址上的服务。 Kubernetes负责与运行工作负载的节点的连接。
入口
Kubernetes入口是一个软件对象,它描述了使Kubernetes服务在群集外部可用的资源集合的行为。
Ingress控制器将实例化Ingress软件对象的软件和/或硬件组合在一起。
CDN是一种功能丰富的分布式反向代理,除了反向代理功能之外,CDN通常具有灵活的缓存算法,地理多样性,安全功能(ACL (GEO,方法,正则表达式),Web应用程序防火墙,水印和其他简单反向代理中找不到的高级功能。
Kubernetes对象监视的API定义完善,并扩展了许多HTTP反向代理和负载平衡器,以用作入口控制器。 例如,NGINX和HAProxy是旧派代理,已扩展为用作入口控制器,而Traefik和Itsio等代理是与Kubernetes并行开发的。 CDN是从简单的反向代理自然的下一个进步。 在本演示中,我们将创建一个自定义入口控制器来控制Edgio Delivery CDN。 描述入侵通常需要的数据是
- 公共主机名:Kubernetes服务可用的主机名
- public path:与Kubernetes服务可用的Public主机名关联的路径
- 后端服务名称:Kubernetes服务节定义的服务名称
- 后端端口:与服务说明中的端口说明匹配的名称
Edgio交付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 hub python 3正式映像
- Spec.template.spec.containers.ports.name:在这种情况下,要在其他对象服务中引用的端口的标签
- spec.template.spec.containers.ports.containerport:列出正在运行的容器中公开的TCP端口
服务
- 种类:部署–将对象描述为部署
- Metadata.name:入口对象使用名称来创建两者之间的链接。
- Spec.selector.app:指向部署对象中指定的部署名称pywai-inline-service。
- Spec.selector.type: Nodeport此选项将此服务定义为Nodeport类型,如上所述
- Spec.ports.name:要由其他对象引用的端口的标签(在本例中为入口)
- Spec.ports.protocol:定义使用的IP协议–TCP
- spec.ports.port:定义此服务公开的端口
- spec.ports.targetPort:指向部署公开的端口–pywai-inline-deployment
入口
在附录3中,您将看到描述Edgio入口控制器Kubernetes对象的YAML文件。 要关注的对象是:
- 种类:入口–这告诉Kubernetes这是一个入口对象
- Medatdata.name–Kubernetes中的所有内容都必须有一个名称
- metadata.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交付python SDK
- Kubernetes演示部署
- https://github.com/llnw/edgio-delivery-k8s-demo
- 这些是一系列Kubernetes对象,描述为YAML,展示了如何部署Edgio Delivery集成
- Edgio Delivery入口控制器演示
- https://github.com/llnw/edgio-delivery-k8s-ingress-demo
- 这是实现Edgio Delivery入口控制器的实际代码
- 从长远来看,它应该作为Kubernetes中的一项服务运行,但是为了保持演示的简单性,它只是作为一个单独的进程运行
未来对当前设计的添加和增强
在未来的帖子中,我们将展示如何利用其他Edgio解决方案,例如应用程序。 我们可以使用Kubernetes集群作为一种方式,在多个Edgio CDN产品之间利用和同步不同工作流的配置。
附录1–pywai-inline-deployment.yaml
apiVersion:apps/v1
种类:部署
元数据:
名称: pywai-inline-deployment
规格:
选择器:
MatchLabels:
应用程序:pywai-inline-deployment
复本:1
模板:
元数据:
标签:
应用程序:pywai-inline-deployment
规格:
容器:
–名称: Python
Image: 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()
定义DEF DO_GET (sell):
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).encode(‘UTF-8’))
self.wfile.write (“<pre{}> </pre>”.format(ClientInfo).encode(‘UTF-8’))
self.wfile.write (“<pre{}> </pre>”.format(lineinfo).encode(‘UTF-8’))
self.wfile.write (“<pre{}> </pre>”.format(versioninfo).encode(‘UTF-8’))
DEF运行(server_class=HTTPServer,handler_class=S,port=8080):
logging.basicConfig(level=logging.info)
SERVER_ADDRESS =(“,端口)
httpd =服务器类(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
Exec python / test.py 8000
端口:
名称:HTTP
容器端口:8000
附录2–pywai-inline-service.yaml
apiVersion: V1
种类:服务
元数据:
名称: pywai-inline-service
规格:
选择器:
应用程序:pywai-inline-deployment
类型:NodePort
端口:
名称:HTTP
协议:TCP
端口:80
TargetPort:8000
附录3–pywai-edgio-ingress.yaml
apiVersion:networking.k8s.io/v1
种类:入口
元数据:
名称:external-pywai-inline-ingress
注释:
Kubernetes.io/ingress.class:edgio
标签:
CDN:edgio
规格:
规则:
–主机:<输入唯一的简称>.s.llnwi.net
HTTP:
路径:
–路径:/fred
pathType:精确
后端:
服务:
名称:external-pywai-inline-service
端口:
名称: pywai-port