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, 读书写作敲代码, 永远在路上

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
消息中间件 人工智能 安全
云原生进化论:加速构建 AI 应用
本文将和大家分享过去一年在支持企业构建 AI 应用过程的一些实践和思考。
440 26
|
2月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
269 86
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
312 0
|
3月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
295 0
|
2月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
3月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
452 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
2月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
182 8
|
3月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
3月前
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。

推荐镜像

更多