作为Write for DOnations计划的一部分,作者选择了“编码女孩”来接受捐赠。
介绍
该Okteto CLI是一个开源项目,它提供了在运行的应用程序的本地开发经验Kubernetes。有了它,您可以在本地 IDE 上编写代码,一旦保存文件,更改就可以推送到您的 Kubernetes 集群,您的应用程序将立即更新。整个过程无需构建 Docker 镜像或应用 Kubernetes 清单,这可能需要相当长的时间。
在本教程中,您将在开发 Kubernetes 原生应用程序时使用 Okteto 来提高工作效率。首先,您将创建一个 Kubernetes 集群并使用它来运行标准的“Hello World”应用程序。然后,您将使用 Okteto 开发和自动更新您的应用程序,而无需在本地安装任何东西。
先决条件
在开始本教程之前,您需要具备以下条件:
- Kubernetes 1.12+ 集群。在本教程中,设置将使用具有三个节点的DigitalOcean Kubernetes集群,但您可以使用另一种方法自由创建集群。
kubectl
并doctl
安装并配置为与您的集群通信。- 一个Docker Hub 帐户
- 在本地机器上运行的Docker。
步骤 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!
。因此,让我们使用以下代码:
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/http
HTTP 服务器。 - 该
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
包含两个阶段,builder
并prod
:
- 该
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:latest
Docker 镜像的 Kubernetes 部署对象。将此内容添加到您的新文件中,但在您的情况下okteto
,将image
标签后列出的替换为your_DockerHub_username
:
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
图像,侦听端口8080
和app: hello-world
标签。请注意,此标签与本selector
节中使用的标签相同。
您现在需要一种方法来访问您的应用程序。您可以通过创建服务对象在 Kubernetes 上公开应用程序。让我们继续使用清单来做到这一点。创建一个service.yaml
使用您喜欢的 IDE 或文本编辑器调用的新文件:
- nano k8s/service.yaml
以下内容描述了一个公开hello-world
部署对象的服务,该服务在幕后将使用 DigitalOcean 负载均衡器:
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
您将看到以下输出:
Outputdeployment.apps "hello-world" created
service "hello-world" created
大约一分钟左右后,您将能够检索应用程序的 IP。使用此kubectl
命令检查您的服务:
- kubectl get service hello-world
您将看到这样的输出,其中列出了您的 Kubernetes 服务对象。在EXTERNAL-IP
列中记下您的应用程序的 IP :
OutputNAME 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”应用程序列表。在继续下一步之前,确认您的应用程序已启动并正在运行。
在此之前,您一直遵循相当传统的方式来使用 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。稍后我们将返回此信息。使用以下示例内容文件:
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
OutputStarting hello-world server...
第一次运行应用程序时,Go 将下载您的依赖项并编译您的应用程序。等待此过程完成并通过打开浏览器并刷新应用程序页面来测试您的应用程序,就像您之前所做的那样。
现在您已准备好开始直接在 Kubernetes 上进行开发。
第 5 步 – 直接在 Kubernetes 上开发
让我们开始对“Hello World”应用程序进行更改,然后看看这些更改如何反映在 Kubernetes 中。
main.go
使用您喜欢的 IDE 或文本编辑器打开文件。例如,打开一个单独的控制台并运行以下命令:
- nano main.go
然后,将您的响应消息更改为Hello world from DigitalOcean!
:
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
OutputStarting hello-world server...
返回浏览器并重新加载“Hello World”应用程序的页面。
您的代码更改会立即应用于 Kubernetes,并且无需任何提交、构建或推送。
结论
Okteto只需单击一个按钮,即可将您的 Kubernetes 集群转变为功能齐全的开发平台。在本教程中,您安装并配置了Okteto CLI,以与键入代码一样快地直接在 Kubernetes 上迭代您的代码更改。现在,您可以前往Okteto 示例存储库,了解如何将 Okteto 与不同的编程语言和调试器结合使用。
此外,如果您与团队共享 Kubernetes 集群,请考虑让每个成员访问安全的 Kubernetes 命名空间,该命名空间配置为与在同一集群上工作的其他开发人员隔离。这个强大的功能也由提供Okteto应用在DigitalOcean Kubernetes市场。