k8s 上 go 服务实战: 使用 helm 快速构建云原生应用

简介: 伴随着云原生生态的不断发展与壮大, 标准/工具链越发的成熟, 服务的部署与运维会越来越 easy, 一起期待更美好的明天~我是 dayday, 读书写作敲代码, 永远在路上

上一篇折腾了 [k8s 如何跑 go 服务](https://zhuanlan.zhihu.com/p/248866126 k8s运行go服务), 并且对 k8s 基础概念 deployment / replicaSet / pod 进行了详细的讲解


实践过的小伙伴可能会继续追问: 好多好多步骤呢, 尤其是写 `deployment.yml` 文件时, 还挺折腾的, 敢不敢更简单点?


一如既往: 敢!


> [helm: The package manager for Kubernetes](https://helm.sh/ "helm")


## 服务镜像准备


首先, 还是老三样, 准备好我们的镜像


- go 服务代码, 还是简单的 hello 为例


这里使用了 **环境变量**, 方便后续演示: 可以通过环境变量这种方式来控制应用


```go

package main


import (

   "fmt"

   "net/http"

   "os"

)


func main() {

   port := os.Getenv("PORT")

   if port == "" {

       port = "80"

   }

   username := os.Getenv("USERNAME")

   if username == "" {

       username = "world"

   }

   http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {

       fmt.Fprintf(writer, "hello %s\n\n", username)

   })

   http.ListenAndServe(":" + port, nil)

}

```


- Dockerfile 构建镜像, 依旧是 **两阶段构建**


```Dockerfile

FROM golang:alpine as builder

WORKDIR /app

COPY main.go .

RUN go build -o hello main.go


FROM alpine

WORKDIR /app

ARG PORT=80

COPY --from=builder /app/hello /app/hello

ENTRYPOINT ./hello

EXPOSE 80

```


- alibaba cloud toolkit 上传镜像, 依旧是一件搞定


![alibaba cloud toolkit 上传镜像](https://upload-images.jianshu.io/upload_images/567399-37ee8bf39f4e80b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


## helm: 主角登场


介绍一下概念, 方便理解:

- helm: k8s 的包管理工具, 能把 k8s 的应用/服务 打包好

- chart: helm 中对 k8s 中 应用/服务 的抽象, 简单理解 `chart = k8s 应用`


不废话, 直接一顿操作猛如虎:


```sh

brew info helm # 安装 helm


helm init hello # 初始化一个 helm chart 工程

➜ tree -L 2

.

├── Chart.yaml # chart 的基础新

├── charts

├── templates # k8s 的标准 yaml 文件

│   ├── NOTES.txt

│   ├── _helpers.tpl

│   ├── deployment.yaml

│   ├── hpa.yaml

│   ├── ingress.yaml

│   ├── service.yaml

│   ├── serviceaccount.yaml

│   └── tests

└── values.yaml # 主要需要修改的文件, 值都在这里定期, 供 templates 下的文件使用

```


只需要修改 2 个文件:


- `deployment.yaml`: 把环境变量加上


```yaml

     containers:

       - name: {{ .Chart.Name }}

         securityContext:

           {{- toYaml .Values.securityContext | nindent 12 }}

         image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

         imagePullPolicy: {{ .Values.image.pullPolicy }}

         env: # 添加环境变量

           - name: USERNAME

             value: {{ .Values.Username }}

```


- `values.yaml`: 修改镜像地址 + 配置环境变量


```yaml

image:

 repository: registry.cn-shanghai.aliyuncs.com/daydaygo/open

 pullPolicy: IfNotPresent

 # Overrides the image tag whose default is the chart appVersion.

 tag: "20200917224128"


Username: dayday

```


继续 helm 操作:


```sh

helm lint --strict hello # lint: 校验


➜ helm package hello # package: 打包

Successfully packaged chart and saved it to: /Users/dayday/coder_at_work/docker/k8s/helm_test/hello-0.1.0.tgz


➜ helm install hello hello-0.1.0.tgz # install: 安装

NAME: hello

LAST DEPLOYED: Thu Sep 17 22:54:54 2020

NAMESPACE: default

STATUS: deployed

REVISION: 1

NOTES:

1. Get the application URL by running these commands:

 export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=hello,app.kubernetes.io/instance=hello" -o jsonpath="{.items[0].metadata.name}")

 echo "Visit http://127.0.0.1:8080 to use your application"

 kubectl --namespace default port-forward $POD_NAME 8080:80


➜ kubectl port-forward hello-ffbd5b4d7-bhwtp 3000:80 # port-forward: 端口转发, 方便本地测试

Forwarding from 127.0.0.1:3000 -> 80

Forwarding from [::1]:3000 -> 80


➜ curl localhost:3000 # 大功告成

hello dayday

```


## 写在最后


很简单有木有, 赶紧也动手试试


更多例子: [cloudnativeapp/handbook](https://github.com/cloudnativeapp/handbook "Cloud Native App Handbook")


伴随着云原生生态的不断发展与壮大, 标准/工具链越发的成熟, 服务的部署与运维会越来越 easy, 一起期待更美好的明天~


我是 dayday, 读书写作敲代码, 永远在路上

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
28天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
3月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
19天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
60 1
|
20天前
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
29 1
|
27天前
|
Go UED
Go Web服务中如何优雅平滑重启?
在生产环境中,服务升级时如何确保不中断当前请求并应用新代码是一个挑战。本文介绍了如何使用 Go 语言的 `endless` 包实现服务的优雅重启,确保在不停止服务的情况下完成无缝升级。通过示例代码和测试步骤,详细展示了 `endless` 包的工作原理和实际应用。
39 3
|
28天前
|
JSON Go UED
Go Web服务中如何优雅关机?
在构建 Web 服务时,优雅关机是一个关键的技术点,它确保服务关闭时所有正在处理的请求都能顺利完成。本文通过一个简单的 Go 语言示例,展示了如何使用 Gin 框架实现优雅关机。通过捕获系统信号和使用 `http.Server` 的 `Shutdown` 方法,我们可以在服务关闭前等待所有请求处理完毕,从而提升用户体验,避免数据丢失或不一致。
23 1
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
97 7
|
1月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
62 6
|
2月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。