Use Werf with Spring — part 1

Jeff Yen
8 min readSep 8, 2024

--

123

學習如何與 Kubernetes 協作並將應用程式交付到 K8s 的開發人員。想要更高效解決 CI/CD 相關任務並成為熟練 werf 使用者的 DevOps 工程師也將從中受益。

First steps

在本章中,我們將構建一個映像並將應用程式部署到 Kubernetes。

我們將使用一個簡單的 shell 腳本作為範例應用程式。此腳本會在請求 /ping 端點時返回 pong。我們將設置 werf 環境,將應用程式部署到本地的 Minikube 叢集,對應用程式進行修改和配置變更,並回顧一些有關使用 werf 和 Kubernetes 的理論知識。

Building an image

我們將使用 werf 和 Dockerfile 構建應用程式的 Docker 映像。接著,我們會在本地運行它來測試構建的映像。

Create a new repository with the application

# Clone the example repository to ~/werf-guide/guides (if you have not cloned it yet).
test -e ~/werf-guide/guides || git clone https://github.com/werf/website ~/werf-guide/guides

# Copy the (unchanged) application files to ~/werf-guide/app.
rm -rf ~/werf-guide/app
cp -rf ~/werf-guide/guides/examples/basic/000_app ~/werf-guide/app

# Make the ~/werf-guide/app directory a git repository.
cd ~/werf-guide/app
git init
git add .
git commit -m initial

# To see what changes we will make later in this chapter, let's replace all the application files
# in the repository with new, modified files containing the changes described below.
git rm -r .
cp -rf ~/werf-guide/guides/examples/basic/001_build/. .
git add .
git commit -m WIP

What changes we will make

# Enter the command below to show files we are going to change.
git show --stat
# Enter the command below to show the changes that will be made.
git show

Dockerfile

將 werf 與 Dockerfile 整合
主要的 werf 配置檔 werf.yaml(位於倉庫的根目錄)指定了構建應用程式時使用的 Dockerfile:

werf.yaml 檔案可以同時描述多個映像的組裝。

Building using werf

請注意,在開始基於 werf 的構建/部署過程之前,您必須將所有檔案提交到版本控制中。

接下來,我們會討論為何這是必要的,以及如何在本地開發中避免創建不必要的提交。

我們在上面的「創建新應用程式倉庫」部分已經做過這個步驟。然而,通常情況下,您需要運行 git addgit commit 命令。

使用 werf build 命令開始構建:

werf build

Starting the application

您可以使用 werf run 命令,通過構建的映像在本地運行容器:

werf run app --docker-options="-ti --rm -p 8000:8000" -- /app/start.sh

--docker-options 標誌設置 Docker 參數,而要在容器中運行的命令則放在最後。
打開瀏覽器並訪問 http://127.0.0.1:8000/ping 來檢查應用程式是否正在運行。或者,您可以使用 curl 工具:

您將會收到 pong 訊息作為回應,並且容器日誌中會出現以下文字:

GET /ping HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: curl/7.67.0
Accept: */*

Preparing the environment

在本章中,我們將設置一個 Kubernetes 叢集、容器註冊表以及本地環境來部署應用程式。

Deploying a cluster

安裝並運行 Minikube,使用 Minikube 創建一個新的 Kubernetes 叢集:

## delete the existing minikube cluster (if exists)
minikube delete

## start a new minikube cluster
minikube start --driver=hyperkit

Minikube hyperkit不支援ARM,我改用docker驅動

Installing NGINX Ingress Controller

安裝 NGINX Ingress 控制器

#Install the NGINX Ingress Controller:
minikube addons enable ingress

#Give it a few minutes and check if the Ingress Controller has started successfully:
kubectl -n ingress-nginx get pod

Updating the hosts file

修改 hosts 文件的目的是將 werf-guide-app.test 這個域名映射到特定的 IP 地址或主機名。

echo "$(minikube ip) werf-guide-app.test" | sudo tee -a /etc/hosts

Configuring the container registry

Authorizing in Docker Hub

創建一個 Docker Hub ID 並建立一個名為 werf-guide-app 的私人倉庫。我們將把構建的映像存儲在其中。

werf cr login https://index.docker.io/v1/ -u <DOCKER HUB USERNAME> -p <DOCKER HUB PASSWORD> 

Creating a Secret

kubectl create namespace werf-guide-app

kubectl create secret docker-registry registrysecret \
--docker-server='https://index.docker.io/v1/' \
--docker-username='<DOCKER HUB USERNAME>' \
--docker-password='<DOCKER HUB PASSWORD>'

--

--