前言
下麵是為經驗豐富的Kubernetes從業人員將Kubernetes與Edgio Delivery CDN服務集成的示例。 它假定具有Kubernetes方面的知識水平,並具有TCP,DNS和HTTP/HTTPS等標準網際網路協議的知識水平。 最終目標是展示一種使Edgio Delivery CDN服務顯示為標準入口的方法。 Kubernetes用戶可以在熟悉的系統(如Portainer或Terraform)中維護入口配置。
Kubernetes
Kubernetes.IO將Kubernetes定義為“用於自動部署,擴展和管理容器化應用程式的開源系統”。 有幾種方法可以啓動羣集。 最快捷,最簡單的方法是利用眾多允許“一鍵式”部署的雲提供商之一。
Kubernetes群集包含許多部分。 在演示中,我們將重點介紹總數的一部分。
Kubernetes零件
- 節點:託管工作負載和服務的計算機或虛擬機。
- 工作負載:應用程式簡單或復雜
- POD:執行應用程式軟體的容器。 一個或多個Pod組成一個工作負載。
- 服務:將工作負荷暴露給其他工作負荷或攝取的一種機制
- 入口:向外界公開服務的機制
Edgio
Edgio利用我們無縫集成的交付,應用程式和流媒體解決方案,在邊緣提供無與倫比的速度,安全性和簡單性,從而使互聯生活更快,更安全,更易於管理。 我們全球範圍內的技術和專家服務為世界頂級品牌提供動力,能夠為每位用戶提供最快,最動態且無摩擦的教育,娛樂,活動和應用程式。 Edgio致力於提供無與倫比的客戶關懷,並在每個步驟中擴展價值,是首選合作夥伴,推動全球網際網路流量,支援最受歡迎的節目,電影,體育,遊戲和音樂,以及即時載入網站。
體系結構
Edgio交付CDN
在本演示中,我們使用GitHub中的Edgio python SDK–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創建或修改指向群集節點的循環A記錄。
群集
演示在三節點群集上的Vultr中。
命名空間
該演示將存在於默認名稱空間下,因爲它是在該羣集上運行的唯一功能
節點
- VKE群集–3個節點,每個節點具有
- 4克柱塞
- 80G磁碟
- 2個vCPU
- 1 G網路
工作負載
工作負荷是一個簡單的Python程序,返回有關HTTP連接的基本信息。 我們將此演示內嵌部署,這不是典型的部署方法。 但是,它允許演示完全獨立,而不是使用外部依賴關係來構建和存儲容器。 原始碼位於附錄1。 實際的Python程式碼會以斜體顯示,而描述部署的YAML程式碼則不會顯示。 工作負載使用TCP埠8000。
服務
有幾種服務類型可用。 我們使用的是“NodePort”服務類型。 它在隨機選擇的高埠號上公開群集外部IP地址上的服務。 Kubernetes負責與執行工作負荷的節點的連接。
入口
Kubernetes入口是一個軟體對象,描述使Kubernetes服務在群集外部可用的資源集合的行為。
入口控制器結合了實例化入口軟體對象的軟體和/或硬體。
CDN是一種功能豐富的分布式反向代理,除了反向代理功能外,CDN通常具有靈活的暫存算法,地理多樣性,安全功能(ACL (GEO,方法,regex),Web應用程式防火牆,水印和其他在簡單反向代理中沒有的更高級功能。
Kubernetes對象監控的API定義良好,許多HTTP反向代理和負載平衡器已擴展為用作入口控制器。 例如,NGINX和HAProxy是舊的學校代理,它們已被擴展為用作入口控制器,而Traefik和Itsio等代理則與Kubernetes並行開發。 CDN是從簡單的反向代理開始的自然下一步發展。 在本演示中,我們將創建一個自定義入口控制器,用於控制Edgio Delivery CDN。 描述入口通常需要的數據是
- 公用主機名:Kubernetes服務將在其上使用的主機名
- 公共路徑:與Kubernetes服務將在其上可用的公共主機名關聯的路徑
- 後端服務名稱:由Kubernetes服務狀態定義的服務名稱
- 後端端口:與服務說明中的端口描述相匹配的名稱
Edgio Delivery CDN資產映射:
Kubernetes |
Edgio交付CDN |
公用主機名 |
已發佈的主機名 |
公共路徑 |
已發佈的URL路徑 |
後端服務名稱 在Kubernetes群集中是獨一無二的 外界不知道/無法使用 |
源主機名 完全限定域名 實際上不是一對一 |
其背後的邏輯是:
- 偵聽來自群集的名稱空間入口事件
- 如果事件類型爲“已添加”。
- 獲取群集中節點的IP地址
- 在vultr
- 在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:節點端口將此服務定義爲如上所述的節點端口類型
- Spec.ports.name:其它對象要引用的端口的標籤(在本例中爲入口)
- Spec.ports.protocol:定義使用中的IP協議–TCP
- spec.ports.port:定義此服務公開的埠
- spec.ports.targetPort:指向部署公開的端口–在本例中爲pywai-inline-deployment
入口
在附錄3中,您將看到描述Edgio入口控制器的Kubernetes對象的YAML文件。 要關注的對象是:
- Kind:入口–這告訴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 Delivery Python SDK
- Kubernetes演示部署
- https://github.com/llnw/edgio-delivery-k8s-demo
- 這些是一系列被稱為YAML的Kubernetes對象,展示如何部署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
appiVersion:apps/v1
類型:部署
元數據:
名稱:pywai-inline-deployment
規格:
選擇器:
匹配標籤:
應用程式:pywai-inline-deployment
複本:1.
模板:
元數據:
標籤:
應用程式:pywai-inline-deployment
規格:
容器:
–名稱:Python
圖像:Python:3
命令:
–/bin/sh
–“-c”
–|
第>test.py類<<
#!/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).encode(‘8’))
self.wfile.write(“<pre> {}</pre>”.format(ClientInfo).encode(‘8’))
self.wfile.write(“<pre> {}</pre>”.format(lineinfo).encode(‘8’))
self.wfile.write(“<pre> {}</pre>”.format(versioninfo).encode(‘8’))
DEF執行(server_class=HTTPServer,handler_class=S,埠= 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
Exec python / test.py 8000
埠:
–名稱:HTTP
ContainerPort:8000
附錄2–pywai-inline-service.YAML
影集版本:V1
類型:服務
元數據:
名稱:pywai-inline-service
規格:
選擇器:
應用程式:pywai-inline-deployment
鍵入:NodePort
埠:
–名稱:HTTP
協議:tcp
埠:80
TargetPort:8000
附錄3–pywai-edgio-ingress.YAML
apiVersion:Networking.12.io/v1 K8s
種類:入口
元數據:
名稱:external-pywai-inline-ingress
注釋:
Kubernetes.io/ingress.class:edgio
標籤:
CDN:edgio
規格:
規則:
–主持人:<輸入唯一的簡稱>.s.llnwi.net
HTTP:
路徑:
–路徑:/fred
PathType:精確
後端:
服務:
名稱:external-pywai-inline-service
埠:
名稱:Pywai-port