如何使用 Okteto 在 Kubernetes 上开发应用程序

作者选择了 Girls Who 代码作为 写给捐款计划的一部分,以获得捐款。

介绍

[Okteto CLI] (https://github.com/okteto/okteto)是一个开源项目,为运行在Kubernetes上的应用程序提供本地开发经验. 有了它,您就可以在本地的 IDE 上写入您的代码,一旦您保存了文件,这些修改就可以被推到您的 Kubernetes 集群, 您的应用程序将立即更新 。 整个过程发生时不需要构建多克图像或应用库伯涅特表,这可能需要相当长的时间.

在本教程中,你将使用Okteto提高你的生产力,当开发一个Kubernetes原生应用程序. 首先,你将创建一个Kubernetes集群,并使用它运行标准的Hello World应用程序. 然后你将使用Okteto开发和自动更新你的应用程序,而无需在本地安装任何东西。

前提条件

在您开始本教程之前,您将需要以下内容:

在本教程中,设置将使用一个有三个节点的 DigitalOcean Kubernetes群集,但您可以自由创建一个使用另一种方法的 群集。 * kubectldoctl 安装和配置与您的群集进行通信。 * A Docker Hub 帐户 * Docker在您的本地机器上运行。

第1步:创建Hello World应用程序

Hello World计划是网页开发的悠久传统,在这种情况下,它是一个简单的网页服务,它会响应每一个请求的Hello World。现在你已经创建了你的Kubernetes集群,让我们在Golang创建一个Hello World应用程序,以及你将使用的宣言来部署它在Kubernetes上。

首先改變您的家庭目錄:

1cd ~

现在创建一个名为hello_world的新目录,然后移动到里面:

1mkdir hello_world
2cd hello_world

使用您喜爱的 IDE 或文本编辑器创建并打开名为 main.go 的新文件:

1nano main.go

「main.go」將是一個 Golang 網頁伺服器,返回訊息「Hello world!」。

 1[label main.go]
 2package main
 3
 4import (
 5    "fmt"
 6    "net/http"
 7)
 8
 9func main() {
10    fmt.Println("Starting hello-world server...")
11    http.HandleFunc("/", helloServer)
12    if err := http.ListenAndServe(":8080", nil); err != nil {
13        panic(err)
14    }
15}
16
17func helloServer(w http.ResponseWriter, r *http.Request) {
18    fmt.Fprint(w, "Hello world!")
19}

main.go中的代码如下:

  • 联合国 Go源文件中的第一个声明必须是 " package " 名称。 可执行命令必须始终使用`包干'。
  • 联合国 " 进口 " 一节说明编码所依赖的包装。 在这种情况下,它使用 " fmt " 来操纵弦管,而HTTP服务器则使用 " net/http " 。
  • 联合国 主要功能是您二进制的切入点。 使用 http. HandleFunc 方法配置服务器以调用hello 服务器在收到/路径请求时运行。 `http.ListenAndServe'启用一个HTTP服务器,在 " 8080 " 端口的所有网络接口上收听。
  • 联合国 helloServer' 函数包含您请求处理者的逻辑 。 在这种情况下,它将写出Hello World! ' 作为对请求的回应。 .

您需要创建一个Docker图像并将其推到Docker注册表,以便Kubernetes可以拉动它,然后运行应用程序。

使用您最喜爱的 IDE 或文本编辑器打开名为 'Dockerfile' 的新文件:

1nano Dockerfile

Dockerfile将包含构建您的应用程序的Docker容器所需的命令。

 1[label Dockerfile]
 2FROM golang:alpine as builder
 3RUN apk --update --no-cache add bash
 4WORKDIR /app
 5ADD . .
 6RUN go build -o app
 7
 8FROM alpine as prod
 9WORKDIR /app
10COPY --from=builder /app/app /app/app
11EXPOSE 8080
12CMD ["./app"]

Dockerfile包含两个阶段,即builderprod:

*「builder」階段包含 Go build 工具. 它負責複製檔案並建立 Go 二進制. *「prod」階段是最終圖像. 它只會包含被刪除的 OS 和應用程式二進制。

它使您的生产容器更小,更安全,因为它们只包含您的应用程序以及运行它所需的内容。

构建容器图像(用您的 Docker Hub 用户名替换 your_DockerHub_username):

1docker build -t your_DockerHub_username/hello-world:latest

现在将其推到Docker Hub:

1docker push your_DockerHub_username/hello-world:latest

接下来,为 Kubernetes 宣言创建一个新的文件夹:

1mkdir k8s

當您使用 Kubernetes 宣言時,您會告訴 Kubernetes 您想要如何執行您的應用程式. 此時,您將創建一個 部署對象. 因此,使用您最喜愛的 IDE 或文本編輯器創建一個新的檔案 deployment.yaml:

1nano k8s/deployment.yaml

以下内容描述了运行okteto/hello-world:latest Docker 图像的 Kubernetes 部署对象. 将此内容添加到新文件中,但在您的情况下,在image 标签后列出的oktetoyour_DockerHub_username替换:

 1[label ~/hello_world/k8s/deployment.yaml]
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: hello-world
 6spec:
 7  selector:
 8    matchLabels:
 9      app: hello-world
10  replicas: 1
11  template:
12    metadata:
13      labels:
14        app: hello-world
15    spec:
16      containers:
17      - name: hello-world
18        image: your_DockerHub_username/hello-world:latest
19        ports:
20        - containerPort: 8080

部署宣言有三个主要部分:

*「元数据」定义了您部署的名称。 *「复制品」定义了您想要运行的复制品的副本数。 *「模板」告诉Kubernetes要部署什么,以及要添加哪些标签。

你现在需要一种方法来访问你的应用程序。你可以通过创建一个 服务对象来暴露一个应用程序在Kubernetes上。让我们继续使用宣言来做到这一点。用你最喜欢的IDE或文本编辑器创建一个名为 `service.yaml’的新文件:

1nano k8s/service.yaml

以下内容描述了一项暴露hello-world部署对象的服务,该对象将在帽子下使用数字海洋负载平衡器:

 1[label k8s/service.yaml]
 2apiVersion: v1
 3kind: Service
 4metadata:
 5  name: hello-world
 6spec:
 7  type: LoadBalancer
 8  ports:
 9    - protocol: TCP
10      port: 80
11      targetPort: 8080
12      name: http
13  selector:
14    app: hello-world

服务宣言有四个主要部分:

*`元数据 ' 说 Kubernets如何命名你的服务。

  • " 类型 " 说明 Kubernets 如何你想暴露你的服务。 在这种情况下,它将通过数字海洋负载平衡器对外曝光。
  • 联合国 " 港口 " 标签告诉Kubernetes,你想要揭露哪些港口,以及如何将其映射到你的部署。 在这种情况下,你们将对外公布 " 80 " 号港口,并在部署时将其引向 " 8080 " 港。
  • " 当选者 " 告诉 库伯内特如何指挥交通. 在这种情况下,任何带有 " app:Hello-world " 标签的吊舱都将接收流量。 .

现在,你已经准备好在Kubernetes上部署你的Hello World应用程序了。

第2步:部署您的Hello World应用程序

在此步骤中,您将部署您的Hello World应用程序在Kubernetes上,然后您将验证它是否正常工作。

开始通过在Kubernetes上部署您的应用程序:

1kubectl apply -f k8s

您将看到以下输出:

1[secondary_label Output]
2deployment.apps "hello-world" created
3service "hello-world" created

大约一分钟后,您将能够获取您的应用程序的IP。

1kubectl get service hello-world

您将看到这样的输出列出您的 Kubernetes 服务对象. 请在EXTERNAL-IP列中记住您的应用程序的 IP:

1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)    AGE
3hello-world ClusterIP your_cluster_ip your_external_ip 8080/TCP 37s

打开您的浏览器,然后前往您的Hello World应用程序列出的your_external_ip

Hello World Okteto

到目前为止,你已经遵循了与Kubernetes一起开发应用程序的相当传统的途径。前进时,每当你想要在应用程序中更改代码时,你就必须构建和推送一个新的Docker图像,然后从Kubernetes中提取该图像。

步骤 3 – 安装 Okteto CLI

您现在可以通过安装 Okteto CLI 来提高您的 Kubernetes 开发效率。 Okteto 命令行接口是一个开源项目,允许您将应用程序代码的更改同步到运行在 Kubernetes 上的应用程序。

若要在 macOS 或 Linux 機器上安裝 Okteto CLI,請執行以下命令:

1curl https://get.okteto.com -sSfL | sh

让我们仔细看看这个命令:

  • curl 命令用于将数据传输到服务器和服务器上。 * -s 旗阻止任何输出。 * -S 旗显示错误。 * -f 旗导致请求在 HTTP 错误中失败。 * -L 旗使请求遵循重定向。

如果您正在运行 Windows,您可以替代 通过您的 Web 浏览器下载该文件并手动添加到您的 $PATH。

一旦安装了 Okteto CLI,您就可以将您的Hello World应用程序放入开发模式。

步骤4 — 将您的Hello World应用程序放入开发模式

Okteto CLI 旨在将运行在 Kubernetes 集群上的应用程序与您在机器上的代码进行交换。 为此,Okteto 使用从 Okteto manifest 文件中提供的信息。

使用您喜爱的 IDE 或文本编辑器创建一个名为 'okteto.yaml' 的新文件:

1nano okteto.yaml

让我们写一个基本宣言,定义部署对象名称、要使用的 Docker 基础图像和壳。

1[label okteto.yaml]
2name: hello-world
3image: okteto/golang:1
4workdir: /app
5command: ["bash"]

准备将应用程序放入开发模式,运行以下命令:

1okteto up
1[secondary_label Output]
2 ✓  Development environment activated
3 ✓  Files synchronized
4    Namespace: default
5    Name:      hello-world
6
7Welcome to your development environment. Happy coding!
8default:hello-world /app>

okteto up命令将Hello World应用程序换成开发环境,这意味着:

  • 联合国 " Hello World " 应用容器更新了 " okteto/golang:1 " 的插头图像。 此图像包含所需的dev工具来构建,测试,调试,并运行"Hello World"应用程序.
  • 创建了文件同步服务,以保持本地文件系统与应用程序库之间的变化。
  • 远程外壳始于您的开发环境。 现在你可以建立,测试,运行你的应用程序 就像你在本地的机器。
  • 联合国 无论您在远程外壳中运行什么过程,都会得到与原作"Hello World"应用舱相同的传送流量,相同的环境变量,音量,或秘密. 这反过来又给你提供了一种非常现实,生产相类的发展环境. .

在相同的控制台中,现在像你通常所做的那样运行应用程序(没有构建和推导Docker图像),如下:

1go run main.go
1[secondary_label Output]
2Starting hello-world server...

第一次运行应用程序时,Go 将下载您的依赖性并编译您的应用程序,等待此过程完成并通过打开浏览器和更新应用程序页面来测试您的应用程序,就像您之前一样。

现在你已经准备好直接在Kubernetes上开始开发了。

第5步:直接在Kubernetes上开发

让我们开始对Hello World应用程序进行更改,然后看看这些更改如何反映在Kubernetes中。

使用您最喜欢的 IDE 或文本编辑器打开 main.go 文件. 例如,打开一个单独的控制台并执行以下命令:

1nano main.go

然后,将您的回复消息更改为Hello world from DigitalOcean!:

 1[label main.go]
 2package main
 3
 4import (
 5    "fmt"
 6    "net/http"
 7)
 8
 9func main() {
10    fmt.Println("Starting hello-world server...")
11    http.HandleFunc("/", helloServer)
12    if err := http.ListenAndServe(":8080", nil); err != nil {
13        panic(err)
14    }
15}
16
17func helloServer(w http.ResponseWriter, r *http.Request) {
18    fmt.Fprint(w, "Hello world from DigitalOcean!")
19}

而不是构建图像和重新部署容器以更新Hello World应用程序,Okteto 会将您的更改同步到您的 Kubernetes 开发环境。

从执行okteto up命令的控制台中,通过按CTRL + C来取消执行go run main.go

1default:hello-world /app> go run main.go
1[secondary_label Output]
2Starting hello-world server...

回到浏览器并重新加载您的Hello World应用程序的页面。

Hello world DigitalOcean"

您的代码更改立即应用于Kubernetes,而不需要任何承诺,构建或推动。

结论

Okteto将您的Kubernetes集群转化为一个功能齐全的开发平台,只需点击一个按钮。 在本教程中,您安装并配置了 Okteto CLI以便在Kubernetes上直接重复代码更改,您可以尽快输入代码。

此外,如果您与团队共享 Kubernetes 集群,请考虑让每个成员访问安全的 Kubernetes 名称空间,配置为与在同一集群上工作的其他开发人员隔离。

Published At
Categories with 技术
comments powered by Disqus