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

作为Write for DOnations计划的一部分,作者选择了“编码女孩”来接受捐赠

介绍

Okteto CLI是一个开源项目,它提供了在运行的应用程序的本地开发经验Kubernetes有了它,您可以在本地 IDE 上编写代码,一旦保存文件,更改就可以推送到您的 Kubernetes 集群,您的应用程序将立即更新。整个过程无需构建 Docker 镜像或应用 Kubernetes 清单,这可能需要相当长的时间。

在本教程中,您将在开发 Kubernetes 原生应用程序时使用 Okteto 来提高工作效率。首先,您将创建一个 Kubernetes 集群并使用它来运行标准的“Hello World”应用程序。然后,您将使用 Okteto 开发和自动更新您的应用程序,而无需在本地安装任何东西。

先决条件

在开始本教程之前,您需要具备以下条件:

步骤 1 — 创建 Hello World 应用程序

“Hello World”程序是 Web 开发中的一项历史悠久的传统。在这种情况下,它是一个简单的 Web 服务,它对每个请求都响应“Hello World”。现在您已经创建了 Kubernetes 集群,让我们在 Golang 中创建一个“Hello World”应用程序以及您将用于在 Kubernetes 上部署它的清单。

首先切换到您的主目录:

  • cd ~

现在创建一个名为的新目录hello_world并在其中移动:

  • mkdir hello_world
  • cd hello_world

main.go使用您喜欢的 IDE 或文本编辑器以该名称创建并打开一个新文件

  • nano main.go

main.go将是一个返回消息的 Golang Web 服务器Hello world!因此,让我们使用以下代码:

main.go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    fmt.Println("Starting hello-world server...")
    http.HandleFunc("/", helloServer)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func helloServer(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello world!")
}

中的代码main.go执行以下操作:

  • Go 源文件中的第一条语句必须是package名称。可执行命令必须始终使用.package main
  • import部分指示代码依赖哪些包。在这种情况下,它fmt用于字符串操作和net/httpHTTP 服务器。
  • main函数是二进制文件的入口点。http.HandleFunc方法用于配置服务器在收到helloServer/路径的请求时调用该函数http.ListenAndServe启动一个 HTTP 服务器,它侦听端口 上的所有网络接口8080
  • helloServer函数包含请求处理程序的逻辑。在这种情况下,它将写入Hello world!作为对请求的响应。

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

Dockerfile使用您喜欢的 IDE 或文本编辑器以该名称打开一个新文件

  • nano Dockerfile

Dockerfile将包含构建应用程序的泊坞容器所需的命令。让我们使用以下代码:

文件
FROM golang:alpine as builder
RUN apk --update --no-cache add bash
WORKDIR /app
ADD . .
RUN go build -o app

FROM alpine as prod
WORKDIR /app
COPY --from=builder /app/app /app/app
EXPOSE 8080
CMD ["./app"]

Dockerfile包含两个阶段,builderprod

  • builder阶段包含 Go 构建工具。它负责复制文件并构建 Go 二进制文件。
  • prod阶段是最终图像。它将只包含一个精简的操作系统和应用程序二进制文件。

这是一个值得遵循的好习惯。它使您的生产容器更小、更安全,因为它们只包含您的应用程序以及运行它所需的内容。

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

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

现在将其推送到 Docker Hub:

  • docker push your_DockerHub_username/hello-world:latest

接下来,为 Kubernetes 清单创建一个新文件夹:

  • mkdir k8s

当您使用 Kubernetes 清单时,您可以告诉 Kubernetes 您希望应用程序如何运行。这一次,您将创建一个部署对象。因此,deployment.yaml使用您喜欢的 IDE 或文本编辑器创建一个新文件

  • nano k8s/deployment.yaml

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

~/hello_world/k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      app: hello-world
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: your_DockerHub_username/hello-world:latest
        ports:
        - containerPort: 8080

部署清单包含三个主要部分:

  • metadata 定义部署的名称。
  • replicas 定义您想要运行的副本数量。
  • template告诉 Kubernetes 部署什么,添加什么标签。在这种情况下,单个容器,带有okteto/hello-world:latest图像,侦听端口8080app: hello-world标签。请注意,此标签与本selector节中使用的标签相同

您现在需要一种方法来访问您的应用程序。您可以通过创建服务对象在 Kubernetes 上公开应用程序让我们继续使用清单来做到这一点。创建一个service.yaml使用您喜欢的 IDE 或文本编辑器调用的新文件

  • nano k8s/service.yaml

以下内容描述了一个公开hello-world部署对象的服务,该服务在幕后将使用 DigitalOcean 负载均衡器:

k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      name: http
  selector:
    app: hello-world

服务清单有四个主要部分:

  • metadata 告诉 Kubernetes 如何命名你的服务。
  • type告诉 Kubernetes 您希望如何公开您的服务。在这种情况下,它将通过 Digital Ocean 负载均衡器将其暴露在外部。
  • ports标签告诉 Kubernetes 您要公开哪些端口,以及如何将它们映射到您的部署。在这种情况下,您将在80外部公开端口并将其定向到8080部署中的端口
  • selector告诉 Kubernetes 如何引导流量。在这种情况下,任何带有app: hello-world标签的pod都会收到流量。

您现在已准备好在 Kubernetes 上部署“Hello World”应用程序。我们接下来会这样做。

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

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

首先在 Kubernetes 上部署您的应用程序:

  • kubectl apply -f k8s

您将看到以下输出:

Output
deployment.apps "hello-world" created service "hello-world" created

大约一分钟左右后,您将能够检索应用程序的 IP。使用此kubectl命令检查您的服务:

  • kubectl get service hello-world

您将看到这样的输出,其中列出了您的 Kubernetes 服务对象。EXTERNAL-IP列中记下您的应用程序的 IP

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world ClusterIP your_cluster_ip your_external_ip 8080/TCP 37s

打开浏览器并转到your_external_ip“Hello World”应用程序列表。在继续下一步之前,确认您的应用程序已启动并正在运行。

你好世界 Okteto

在此之前,您一直遵循相当传统的方式来使用 Kubernetes 开发应用程序。展望未来,每当您想要更改应用程序中的代码时,您都必须构建并推送一个新的 Docker 镜像,然后从 Kubernetes 中提取该镜像。这个过程可能需要相当长的时间。Okteto 旨在简化此开发内部循环。让我们看看 Okteto CLI,看看它是如何提供帮助的。

步骤 3 — 安装 Okteto CLI

现在,您将通过安装 Okteto CLI 来提高 Kubernetes 开发效率。Okteto命令行界面是一个开源项目,让您同步应用程序代码的变化对Kubernetes运行的应用程序。您可以继续使用您喜欢的 IDE、调试器或编译器,而无需像在前面的步骤中那样提交、构建、推送或重新部署容器来测试您的应用程序。

要在 macOS 或 Linux 机器上安装 Okteto CLI,请运行以下命令:

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

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

  • curl命令用于向服务器传输数据和从服务器传输数据。
  • -s标志禁止任何输出。
  • -S标志显示错误。
  • -f标志会导致请求因 HTTP 错误而失败。
  • -L标志使请求遵循重定向。
  • |运营商管这个输出的sh命令,它会下载并安装最新okteto的本地计算机的二进制文件。

如果您运行的是 Windows,则可以交替地通过 Web 浏览器下载文件并手动将其添加到$PATH.

安装 Okteto CLI 后,您就可以将“Hello World”应用程序置于开发模式。

第 4 步 – 将您的 Hello World 应用程序置于开发模式

Okteto CLI 旨在将运行在 Kubernetes 集群上的应用程序与您机器中的代码进行交换。为此,Okteto 使用从Okteto 清单文件提供的信息此文件声明将与您的本地代码交换的 Kubernetes 部署对象。

创建一个okteto.yaml使用您喜欢的 IDE 或文本编辑器调用的新文件

  • nano okteto.yaml

让我们编写一个基本清单,您可以在其中定义部署对象名称、要使用的 Docker 基础映像和一个 shell。稍后我们将返回此信息。使用以下示例内容文件:

okteto.yaml
name: hello-world
image: okteto/golang:1
workdir: /app
command: ["bash"]

通过运行以下命令准备将您的应用程序置于开发模式:

  • okteto up
Output
✓ Development environment activated ✓ Files synchronized Namespace: default Name: hello-world Welcome to your development environment. Happy coding! default:hello-world /app>

okteto up命令将“Hello World”应用程序交换到开发环境中,这意味着:

  • Hello World 应用程序容器已更新为 docker 映像okteto/golang:1此映像包含构建、测试、调试和运行“Hello World”应用程序所需的开发工具。

  • 一个文件同步服务创建,让您改变了最新的本地文件系统和应用程序之间的豆荚。

  • 远程 shell 在您的开发环境中启动。现在您可以像在本地机器上一样构建、测试和运行您的应用程序。

  • 您在远程 shell 中运行的任何进程都将获得与原始“Hello World”应用程序 pod 相同的传入流量、相同的环境变量、卷或机密。这反过来又为您提供了一个高度逼真的、类似生产的开发环境。

在同一个控制台中,现在像往常一样运行应用程序(无需构建和推送 Docker 映像),如下所示:

  • go run main.go
Output
Starting hello-world server...

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

现在您已准备好开始直接在 Kubernetes 上进行开发。

第 5 步 – 直接在 Kubernetes 上开发

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

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

  • nano main.go

然后,将您的响应消息更改为Hello world from DigitalOcean!

main.go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    fmt.Println("Starting hello-world server...")
    http.HandleFunc("/", helloServer)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func helloServer(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello world from DigitalOcean!")
}

正是在这里,您的工作流程发生了变化。Okteto 不会构建镜像和重新部署容器来更新“Hello World”应用程序,而是将您的更改同步到 Kubernetes 上的开发环境。

在执行okteto up命令的控制台中go run main.go,按取消执行CTRL + C现在重新运行应用程序:

  • default:hello-world /app> go run main.go
Output
Starting hello-world server...

返回浏览器并重新加载“Hello World”应用程序的页面。

你好世界数字海洋”

您的代码更改会立即应用于 Kubernetes,并且无需任何提交、构建或推送。

结论

Okteto只需单击一个按钮,即可将您的 Kubernetes 集群转变为功能齐全的开发平台。在本教程中,您安装并配置了Okteto CLI,以与键入代码一样快地直接在 Kubernetes 上迭代您的代码更改。现在,您可以前往Okteto 示例存储库,了解如何将 Okteto 与不同的编程语言和调试器结合使用。

此外,如果您与团队共享 Kubernetes 集群,请考虑让每个成员访问安全的 Kubernetes 命名空间,该命名空间配置为与在同一集群上工作的其他开发人员隔离。这个强大的功能也由提供Okteto应用DigitalOcean Kubernetes市场

觉得文章有用?

点个广告表达一下你的爱意吧 !😁