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搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
1月前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战####
本文探讨了云原生技术在现代企业IT架构中的关键作用,分析了其带来的优势和面临的主要挑战。通过实际案例分析,揭示了如何有效应对这些挑战,以实现业务敏捷性和技术创新的平衡。 ####
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
1月前
|
Kubernetes Cloud Native 物联网
云原生技术在现代软件开发中的应用与挑战####
本文探讨了云原生技术的兴起背景、核心理念及其在现代软件开发中的广泛应用。通过具体案例分析,揭示了云原生架构如何促进企业数字化转型,并指出了在实施过程中面临的主要挑战及应对策略。 ####
|
1月前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
1月前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
2月前
|
消息中间件 Cloud Native 持续交付
云原生技术在现代企业中的应用与优势###
本文深入探讨了云原生技术在现代企业中的具体应用及其带来的显著优势。随着云计算的普及,云原生作为一种新兴的技术架构,正逐渐成为企业数字化转型的关键驱动力。文章将详细介绍云原生的核心概念、主要技术组件以及在实际业务场景中的成功案例,旨在为读者提供一个全面且实用的参考框架,以便更好地理解和应用云原生技术。 ###
|
2月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
155 1
|
2月前
|
Cloud Native JavaScript Devops
云原生技术在现代软件开发中的应用与实践
本文将深入探讨云原生技术如何改变现代软件开发的格局。通过分析云原生的核心概念、优势以及在实际开发中的应用案例,我们将了解这一前沿技术如何助力企业快速适应市场变化,提高开发效率和系统稳定性。文章还将提供实用的代码示例,帮助开发者更好地理解和运用云原生技术。

热门文章

最新文章