从代码到 Docker、Kubernetes、Istio、Knative……,或许是时候重新思考从代码到云的编程了...
作者 |?Lakmal Warusawithana
譯者 |彎月 責編 | 徐威龍
封圖|?CSDN 下載于視覺中國
早些時候,開發人員只需編寫程序、構建,然后運行。如今,開發人員還需要考慮各種運行方式,作為可執行文件在機器上運行(很有可能是虛擬機),還是打包到容器中;將容器部署到Kubernetes中,還是部署到serverless的環境中或服務網格中。然而,這些部署方式并不是開發人員編程經驗的一部分。開發人員必須以某種方式編寫代碼才能在特定的執行環境中正常工作,因此編程時不考慮這些問題是不行的。
?
Ballerina是一種開放源代碼編程語言,專門用于將代碼遷移到云,同時提供獨特的開發人員體驗。它的編譯器可以擴展為讀取源代碼中定義的注釋,并生成成果物將代碼部署到不同的云中。這些成果物包括Dockerfile、Docker鏡像、Kubernetes YAML文件或serverless的函數。
從代碼到Docker
?
敏捷是基于微服務的應用程序開發帶來的最大好處,而Docker在這里起著主要作用。Docker可以幫助我們將應用程序及其依賴項打包到一個二進制鏡像中,這個鏡像可以在本地、公共云或私有云中運行。
如果想創建Docker鏡像,開發人員必須選擇合適的基礎鏡像、打包捆綁所有依賴項、復制應用程序二進制文件,并設置具有適當權限的執行命令來創建Dockerfile。如果想創建優化的鏡像,開發人員必須遵循一系列最佳實踐,否則,構建的鏡像就會很大,安全性較低,且存在許多其他缺點。?
Ballerina編譯器能夠從應用程序源代碼中創建優化的Docker鏡像。以下代碼說明了如何將Ballerina hello服務打包成Docker容器并運行。
將@docker:Config {} 添加到服務中,即可生成Dockerfile和Docker鏡像。在listener對象中添加@docker:Expose {},即可公開端口讓流量進入容器。
下面,讓我們來構建源文件。
創建Coder鏡像:
生成Dockerfile:
創建的Docker鏡像遵循鏡像構建最佳實踐,并且開發人員只需使用docker run命令即可運行Docker容器。
Ballerina全面支持Docker功能:?
更改Docker鏡像的標簽和倉庫
將Docker鏡像推送到Docker鏡像庫
使用Docker遠程調試Ballerina服務
將文件復制到Docker鏡像
帶有Docker注釋的多個模塊
使用Docker在HTTP和HTTPS中運行Ballerina服務
覆蓋生成的Dockerfile CMD
Docker Hello World Main函數
使用Main函數復制文件
?
從代碼到Kubernetes
Docker可以幫助我們打包應用程序,并執行一些開發人員測試。但是,如果想在生產環境中運行具有多個微服務的應用程序,我建議使用像Kubernetes這樣的平臺。Kubernetes是一個開源平臺,用于自動化部署、擴展和管理容器化的應用程序。Kubernetes定義了一套獨特的基本模塊,提供了部署、維護和擴展應用程序的機制。Pod是一組邏輯的容器,可保證在主機上的同一位置運行。Kubernetes服務為其構成的Pod集提供發現、路由和負載平衡等功能。Kubernetes部署是一組Pod,包含定義好的副本集、運行狀況檢查和滾動更新等機制。所有這些Kubernetes對象都需要定義成YAML文件,并部署到Kubernetes集群中。
盡管開發人員希望在Kubernetes平臺上運行應用程序,但在許多情況下,創建這些YAML文件的工作讓開發人員十分頭疼。Ballerina編譯器能夠在編譯源代碼時創建這些YAML文件。讓我們修改上述示例,生成Kubernetes的對象。
將@kubernetes:Deployment{}添加到Ballerina服務,就可以生成Kubernetes部署的YAML,將hello應用程序部署到Kubernetes時這是必需的。添加@kubernetes:Service{}注釋即可生成Kubernetes服務的YAML。在這個例子中,我們將serviceType設置為NodeNode,通過nodeIP:Port訪問hello服務。
除了hello.jar二進制文件外,Ballerina編譯器還會生成Dockerfile、Docker鏡像、hello.yaml文件(帶有Kubernetes部署和服務)以及helm圖表的YAML文件。
生成的hello.yaml文件:?
--- apiVersion:?"v1" kind:?"Service" metadata:annotations:?{}labels:app:?"hello"name:?"helloworldep-svc" spec:ports:-?name:?"http-helloworldep-svc"port:?9090protocol:?"TCP"targetPort:?9090selector:app:?"hello"type:?"NodePort" --- apiVersion:?"apps/v1" kind:?"Deployment" metadata:annotations:?{}labels:app:?"hello"name:?"helloworld" spec:replicas:?1selector:matchLabels:app:?"hello"template:metadata:annotations:?{}labels:app:?"hello"spec:containers:-?image:?"hello:latest"imagePullPolicy:?"IfNotPresent"name:?"helloworld"ports:-?containerPort:?9090protocol:?"TCP"nodeSelector:?{}開發人員可以使用這些生成的Kubernetes對象,在Kubernetes平臺上部署應用程序。?
Ballerina為保證在Kubernetes平臺上運行應用程序提供全面的支持:
帶有存活探針和和主機名映射的Kubernetes Hello World
在多個端口中運行的多種服務的Ballerina程序
安全的Kubernetes Hello World
具有HTTP和HTTPS端點的Ballerina服務
Google云環境中的Kubernetes Hello World
將Secret掛載到部署
將配置映射卷掛載到部署
將持久卷聲明掛載到部署
帶有Kubernetes注釋的Ballerina模塊
帶有Ballerina函數的Kubernetes Hello World
將外部文件復制到Docker鏡像中
帶有依賴性的Ballerina模塊
在命名空間中部署Ballerina服務
命名空間的資源配額
除了常見的Kubernetes支持之外,如果你還想將Ballerina應用程序部署到OpenShift中,那么可以參照這個示例。
https://github.com/ballerinax/kubernetes/tree/master/samples/sample17
?
從代碼到Istio
?
微服務架構為開發人員提供了許多敏捷開發的優勢,有助于加快創新。但是微服務架構也有自身的復雜性。Docker和Kubernetes解決了其中一些復雜性。服務網格是一種現代的軟件體系結構,可以降低Kubernetes等平臺的復雜性。Istio是一個開源服務網格實現。主要關注領域包括:服務發現、負載平衡、故障恢復、指標和監視。Istio還支持復雜的操作要求,例如A/B測試、金絲雀發布、速率限制、訪問控制和端到端身份驗證等。
除了Kubernetes對象之外,Istio還引入了一些其他獨特的概念,其中最主要的是VirtualService和Gateway。VirtualService定義了一組流量路由規則,以實現上述復雜的操作要求。Istio Gateway是一個負載均衡器,在網格的邊緣運行,以接收傳入或傳出的HTTP/TCP連接。
如果在Ballerina listener對象上添加兩個注釋,Balerina就能夠生成部署VirtualService和Gateway的對象。下面的代碼片段顯示了兩個定義Istio支持的注釋:
構建這段源代碼即可生成Istio VirtualService和Gateway的對象。?
?
從代碼到Knative
Knative是serverless平臺,最初由Google創建,現已得到50多家公司的支持。Knative使用Kubernetes平臺功能構建了一個serverless平臺,幫助開發人員專注于編寫代碼,而不必擔心構建、部署和管理應用程序等“無聊卻很困難”的工作。Knative的主要功能之一是從零個副本自動擴展,并根據需求調整工作負載。
Knative也有自己的對象模型。Knative服務由路由和配置定義,它們與YAML文件中包含的服務同名。每次更新配置時,都會創建一個新的修訂版。
Ballerina能夠在編譯源代碼時生成這些必要的對象,唯一的要求是在代碼中添加一個簡單的注釋。
加入這個注釋可以生成在Knative集群中以serverless模式部署應用程序所需的對象。
為Knative部署生成的hello.yaml。
從代碼到AWS Lambda
?
AWS Lambda是一個事件驅動的serverless計算平臺。你只需添加@awslambda:Function即可在AWS Lambda中部署Ballerina函數。
CI/CD與GitHub Action
在微服務架構中,持續集成和持續交付(CI/CD)對于不斷改進系統的敏捷環境至關重要。提供CI/CD功能的技術有多種,最近GitHub引入了GitHub Actions。GitHub Actions提供了一種便捷的機制,可以在GitHub代碼庫中使用其工作流概念來實現CI/CD管道。
我們可以通過Ballerina GitHub Action(GitHub Marketplace中有提供)創建帶有CI/CD的Ballerina開發環境。
支持SaaS連接器
我們已經討論了Ballerina支持不同的技術來自動化云部署。為了獲得云的全部功能,應用程序應該能夠與不同云供應商提供的軟件即服務(SaaS)集成。
Ballerina提供了一個簡單的工作流來連接和集成這些SaaS服務。例如,以下代碼片段顯示了如何使用Twitter SaaS服務初始化和發送推文:
Ballerina有許多現成的SaaS連接器:
從Ballerina連接到Google Spreadsheets
從Ballerina連接到Gmail
從Ballerina連接到Bigquery
通過Ballerina連接到Azure CV服務
從Ballerina連接到Amazon S3
從Ballerina連接到Amazon SQS服務
從Ballerina連接到Salesforce
?
總結
以前,開發人員只需編寫、構建并運行程序。然而,如今開發人員面臨多種運行方式的選擇。
Docker、Kubernetes、服務網格和Serverless等云原生平臺在支持部署自動化的現代平臺中扮演著重要角色。
然而,對于開發人員而言,這些部署并不屬于編程。
Ballerina是一種開放源代碼編程語言,專門用于從代碼遷移到云,同時提供獨特的開發人員體驗。
Ballerina的編譯器可以通過擴展,讀取源代碼中定義的注釋,并生成將代碼部署到不同的云環境中的對象,其中包括Dockerfile、Docker鏡像、Kubernetes YAML文件或Serverless函數等。
原文:https://hackernoon.com/rethinking-programming-from-code-to-cloud-fy273yer
為了讓大家更好地了解開發者,CSDN特發起“開發者與AI大調查”活動。?點擊閱讀原文,填寫調查問卷,您將獲得價值299元的「2020 AI 開發者萬人大會」在線直播門票一張喲~
推薦閱讀:為何你的 SaaS 想法總是失敗?沒想清楚這 4 個原因可能會繼續失敗! 如何給女朋友解釋什么是撞庫、脫庫和洗庫? 開源的未來 10 年:中國開源社區建立是關鍵 萬字好文:智能合約編寫之Solidity的編程攻略,建議收藏! Python 爬取疫情期間全球股市走向,笑不出來...... 無代碼時代來臨,程序員如何保住飯碗? 真香,朕在看了!總結
以上是生活随笔為你收集整理的从代码到 Docker、Kubernetes、Istio、Knative……,或许是时候重新思考从代码到云的编程了...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行!人工智能玩大了!程序员:太牛!你怎么
- 下一篇: 主键索引 or 辅助索引?一文告诉你 M