對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

寫這篇文章是因為我們的員工與客戶就在 Kubernetes 上開發應用程序以及在 OpenShift 上進行此類開發的具體細節進行了多次對話。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

我們通常從這樣的論點開始:Kubernetes 只是 Kubernetes,而 OpenShift 已經是一個 Kubernetes 平台,就像 Microsoft AKS 或 Amazon EKS 一樣。 這些平台都有自己的優勢,專注於特定的目標受眾。 之後,談話轉向比較特定平台的優缺點。

總的來說,我們在寫這篇文章時想得出這樣的結論:“聽著,在哪裡運行代碼並不重要,是在OpenShift 上還是在AKS 上、在EKS 上、在某些自定義Kubernetes上或在任何Kubernetes 上” (為簡潔起見,我們將其稱為 KUK) “這真的很簡單,無論是那裡還是那裡。”

然後我們打算以最簡單的“Hello World”為例,展示KUC和紅帽OpenShift容器平台(以下簡稱OCP或簡稱OpenShift)之間的共同點和區別。

然而,在撰寫這篇文章的過程中,我們意識到我們已經習慣了使用OpenShift,以至於我們根本沒有意識到它是如何成長並變成一個令人驚嘆的平台,而不僅僅是一個Kubernetes 發行版。 我們往往認為 OpenShift 的成熟和簡單是理所當然的,而忽視了它的輝煌。

總的來說,主動悔改的時候到了,現在我們將一步一步地比較我們的“Hello World”在KUK和OpenShift上的調試,我們將盡可能客觀地做到這一點(好吧,除了有時會表現出個人對主題的態度)。 如果您對這個問題的純粹主觀意見感興趣,那麼您可以閱讀它 這裡 (EN)。 在這篇文章中,我們將堅持事實,而且只講事實。

集群

所以,我們的“Hello World”需要集群。 我們將立即對任何公共雲說“不”,以免為服務器、註冊表、網絡、數據傳輸等付費。 因此,我們選擇一個簡單的單節點集群 迷你酷 (對於 KUK)和 代碼就緒容器 (對於 OpenShift 集群)。 這兩個選項都非常易於安裝,但需要筆記本電腦上的大量資源。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

在 KUK-e 上組裝

那麼我們走吧。

第 1 步 – 構建容器鏡像

讓我們首先將“Hello World”部署到 minikube。 為此,您將需要:

  1. 1.安裝了Docker。
  2. 2.安裝Git。
  3. 3.安裝Maven(實際上,這個項目使用mvnw二進製文件,所以你可以不用它)。
  4. 4. 實際上,來源本身,即存儲庫克隆 github.com/gcolman/quarkus-hello-world.git

第一步是創建 Quarkus 項目。 如果您從未使用過 Quarkus.io,請不要驚慌 - 這很簡單。 您只需選擇要在項目中使用的組件(RestEasy、Hibernate、Amazon SQS、Camel 等),然後 Quarkus 本身在沒有您任何參與的情況下配置 Maven 原型並將所有內容放在 github 上。 也就是說,只需單擊一下鼠標即可完成。 這就是我們喜愛 Quarkus 的原因。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

將“Hello World”構建到容器映像中的最簡單方法是使用 Docker 的 quarkus-maven 擴展,它將完成所有必要的工作。 隨著 Quarkus 的出現,這變得非常簡單:添加 container-image-docker 擴展,您就可以使用 maven 命令創建圖像。

./mvnw quarkus:add-extension -Dextensions=”container-image-docker”

最後,我們使用 Maven 構建鏡像。 這樣,我們的源代碼就變成了一個現成的容器鏡像,可以在容器運行時環境中運行。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

./mvnw -X clean package -Dquarkus.container-image.build=true

就這樣,現在你可以使用 docker run 命令啟動容器,將我們的服務映射到 8080 端口,以便可以訪問。

docker run -i — rm -p 8080:8080 gcolman/quarkus-hello-world

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

容器實例啟動後,剩下的就是使用curl命令檢查我們的服務是否正在運行:

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

所以一切都很順利,而且非常簡單。

第 2 步 - 將容器提交到容器鏡像存儲庫

目前,我們創建的圖像存儲在本地容器存儲中。 如果我們想在 COOK 環境中使用此映像,則必須將其放置在其他存儲庫中。 Kubernetes沒有這樣的功能,所以我們將使用dockerhub。 因為,首先,它是免費的,其次,(幾乎)每個人都這樣做。

這個也很簡單,只需要一個dockerhub賬號就可以了。

因此,我們安裝 dockerhub 並將圖像發送到那裡。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

第 3 步 – 啟動 Kubernetes

有很多方法可以組裝 kubernetes 配置來運行我們的“Hello World”,但我們將使用其中最簡單的一種,這就是我們的方式......

首先,讓我們啟動 minikube 集群:

minikube start

第 4 步 – 部署我們的容器鏡像

現在我們需要將代碼和容器鏡像轉換為 kubernetes 配置。 換句話說,我們需要一個指向 dockerhub 上容器鏡像的 Pod 和部署定義。 最簡單的方法之一是運行指向我們的映像的創建部署命令:

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

kubectl create deployment hello-quarkus — image =gcolman/quarkus-hello-world:1.0.0-SNAPSHOT

通過此命令,我們告訴 COO 創建部署配置,其中應包含容器映像的 pod 規範。 此命令還將將此配置應用於我們的 minikube 集群,並創建一個部署來下載我們的容器映像並在集群中啟動 pod。

第 5 步 - 開放對我們服務的訪問

現在我們已經部署了容器鏡像,是時候考慮如何配置對這個 Restful 服務的外部訪問了,事實上,它是在我們的代碼中編寫的。

這裡有很多方法。 例如,您可以使用公開命令自動創建適當的 Kubernetes 組件,例如服務和端點。 實際上,這就是我們將通過為部署對象執行公開命令來執行的操作:

kubectl expose deployment hello-quarkus — type=NodePort — port=8080

讓我們花點時間討論一下 hide 命令的“-type”選項。

當我們公開並創建運行服務所需的組件時,我們需要能夠從外部連接到位於軟件定義網絡內部的 hello-quarkus 服務。 及參數 類型 允許我們創建和連接負載均衡器之類的東西,以將流量路由到該網絡。

例如,寫 類型=負載均衡器,我們自動在公共雲中配置一個負載均衡器來連接到我們的 Kubernetes 集群。 這當然很棒,但您需要了解,這樣的配置將嚴格綁定到特定的公共雲,並且在不同環境中的 Kubernetes 實例之間傳輸會更加困難。

在我們的例子中 類型=節點端口,也就是說,對我們服務的調用是通過節點的 IP 地址和端口號進行的。 此選項允許您不使用任何公共雲,但需要一些額外的步驟。 首先,您需要自己的負載均衡器,因此我們將在集群中部署 NGINX 負載均衡器。

第 6 步 - 設置負載均衡器

minikube 具有許多平台功能,可以更輕鬆地創建外部可訪問的組件,例如入口控制器。 Minikube 與 Nginx 入口控制器捆綁在一起,我們所要做的就是啟用它並配置它。

minikube addons enable ingress

現在我們將只用一個命令創建一個 Nginx 入口控制器,它將在我們的 minikube 集群中工作:

ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m

第 7 步 – 設置入口

現在我們需要配置 Nginx 入口控制器,以便它接受 hello-quarkus 請求。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

最後,我們需要應用此配置。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

kubectl apply -f ingress.yml

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

由於我們是在自己的計算機上完成所有這些操作,因此我們只需將節點的 IP 地址添加到 /etc/hosts 文件中,即可將 http 請求路由到我們的 minikube 到 NGINX 負載均衡器。

192.168.99.100 hello-quarkus.info

就是這樣,現在我們的 minikube 服務可以通過 Nginx 入口控制器從外部訪問。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

嗯,這很容易,對吧? 或者沒有那麼多?

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

在 OpenShift 上運行(代碼就緒容器)

現在讓我們看看這一切是如何在紅帽 OpenShift 容器平台 (OCP) 上完成的。

與 minikube 一樣,我們選擇 Code Ready Containers (CRC) 形式的單節點 OpenShift 集群設計。 以前,它被稱為 minishift,基於 OpenShift Origin 項目,但現在它是 CRC,基於紅帽的 OpenShift 容器平台構建。

在此,抱歉,我們不能不說:“OpenShift 太棒了!”

最初,我們認為 OpenShift 上的開發與 Kubernetes 上的開發沒有什麼不同。 本質上就是這樣。 但在撰寫這篇文章的過程中,我們記得當您沒有 OpenShift 時,您必須進行多少額外的操作,這就是為什麼它再次很棒。 我們喜歡一切都可以輕鬆完成,與 minikube 相比,我們的示例在 OpenShift 上部署和運行是多麼容易,這也是促使我們寫這篇文章的原因。

讓我們回顧一下整個過程,看看我們需要做什麼。

因此,在 minikube 示例中,我們從 Docker 開始……等等,我們不再需要在計算機上安裝 Docker。

而且我們不需要本地 git。
並且不需要 Maven。
而且您不必親手創建容器鏡像。
而且您不必尋找任何容器鏡像存儲庫。
並且無需安裝入口控制器。
而且你也不需要配置 ingress。

你明白吧? 要在 OpenShift 上部署和運行我們的應用程序,您不需要上述任何內容。 這個過程本身看起來像這樣。

步驟 1 – 啟動您的 OpenShift 集群

我們使用 Red Hat 的 Code Ready Containers,它本質上與 Minikube 相同,但僅具有成熟的單節點 Openshift 集群。

crc start

步驟 2 – 構建應用程序並將其部署到 OpenShift 集群

正是在這一步,OpenShift 的簡單性和便利性才得以彰顯。 與所有 Kubernetes 發行版一樣,我們有多種方法在集群中運行應用程序。 而且,就像 KUK 的情況一樣,我們專門選擇了最簡單的一個。

OpenShift 始終被構建為用於創建和運行容器化應用程序的平台。 容器構建一直是該平台不可或缺的一部分,因此有大量額外的 Kubernetes 資源用於相關任務。

我們將使用 OpenShift 的 Source 2 Image (S2I) 流程,該流程有多種不同的方式來獲取源代碼(代碼或二進製文件)並將其轉換為在 OpenShift 集群上運行的容器化鏡像。

為此,我們需要做兩件事:

  • 我們的源代碼在git存儲庫中
  • 將在其基礎上執行構建的構建器映像。

Red Hat 和社區層面都維護著許多這樣的鏡像,我們將使用 OpenJDK 鏡像,因為我正在構建一個 Java 應用程序。

您可以從 OpenShift Developer 圖形控制台和命令行運行 S2I 構建。 我們將使用 new-app 命令,告訴它從哪裡獲取構建器映像和源代碼。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git

就這樣,我們的應用程序就創建好了。 為此,S2I 進程執行了以下操作:

  • 為與構建應用程序相關的各種事情創建了一個服務構建容器。
  • 創建了 OpenShift 構建配置。
  • 我將構建器映像下載到內部 OpenShift docker 註冊表。
  • 將“Hello World”克隆到本地存儲庫。
  • 我看到那裡有一個maven pom,所以我使用maven編譯了應用程序。
  • 創建一個包含已編譯的 Java 應用程序的新容器映像,並將該映像放入內部容器註冊表中。
  • 創建 Kubernetes 部署,其中包含 Pod、服務等規範。
  • 我開始部署容器鏡像。
  • 刪除了服務 build-pod。

這個列表中有很多內容,但最主要的是整個構建完全在 OpenShift 內部進行,內部 Docker 註冊表位於 OpenShift 內部,構建過程創建所有 Kubernetes 組件並在集群上運行它們。

如果您在控制台中直觀地監控 S2I 的啟動,您可以看到構建完成後構建 Pod 是如何啟動的。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

現在讓我們看一下構建器 Pod 日誌:首先,它顯示了 Maven 如何完成其​​工作並下載依賴項來構建我們的 Java 應用程序。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

maven構建完成後,就開始容器鏡像的構建,然後將這個構建好的鏡像發送到內部倉庫。

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

就這樣,構建過程就完成了。 現在讓我們確保應用程序的 Pod 和服務在集群中運行。

oc get service

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

就這樣。 而且只有一支球隊。 我們所要做的就是公開此服務以供外部訪問。

步驟 3 – 公開服務以供外部訪問

與 KUC 的情況一樣,在 OpenShift 平台上,我們的“Hello World”也需要一個路由器來將外部流量引導至集群內的服務。 在 OpenShift 中,這變得非常簡單。 首先,集群中默認安裝了HAProxy路由組件(可以改為同一個NGINX)。 其次,有一些特殊且高度可定制的資源,稱為路由,它們類似於舊式Kubernetes 中的Ingress 對象(事實上,OpenShift 的路由極大地影響了Ingress 對象的設計,現在可以在OpenShift 中使用),但是對於我們的“Hello World” ,而在幾乎所有其他情況下,標準 Route 對我們來說就足夠了,無需額外配置。

要為“Hello World”創建可路由的 FQDN(是的,OpenShiift 有自己的 DNS,用於按服務名稱進行路由),我們只需公開我們的服務:

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

oc expose service quarkus-hello-world

如果查看新創建的路由,您可以在其中找到 FQDN 和其他路由信息:

oc get route

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

最後,我們從瀏覽器訪問我們的服務:

對不起,OpenShift,我們沒有足夠感激你,認為你是理所當然的

但現在真的很容易!

我們喜歡 Kubernetes 以及這項技術允許我們做的一切,我們也喜歡它的簡單性和易用性。 Kubernetes 的創建是為了極大地簡化分佈式、可擴展容器的操作,但其簡單性如今已不足以將應用程序投入生產。 這就是 OpenShift 發揮作用的地方,它與時俱進並提供 Kubernetes,主要針對開發人員。 我們投入了大量精力專門為開發人員定制 OpenShift 平台,包括創建 S2I、ODI、開發人員門戶、OpenShift Operator Framework、IDE 集成、開發人員目錄、Helm 集成、監控等工具。

我們希望這篇文章對您來說有趣且有用。 您可以在門戶上找到對 OpenShift 平台上的開發有用的其他資源、材料和其他內容 紅帽開發人員.

來源: www.habr.com

添加評論