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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
27天前
|
Cloud Native 数据处理 云计算
探索云原生技术在大数据分析中的应用
随着云计算技术的不断发展,云原生架构作为一种全新的软件开发和部署模式,正逐渐引起企业的广泛关注。本文将探讨云原生技术在大数据分析领域的应用,介绍其优势与挑战,并探讨如何利用云原生技术提升大数据分析的效率和可靠性。
|
10天前
|
Cloud Native 安全 开发者
云原生技术的未来演进与应用展望
【4月更文挑战第9天】 随着企业数字化转型的不断深入,云原生技术以其独特的弹性、敏捷性和可扩展性成为推动创新的重要力量。本文将探讨云原生技术的发展趋势,分析其在各行各业中的应用前景,并针对未来的挑战提出相应的对策和建议。我们还将讨论如何利用云原生技术优化资源配置,提高业务连续性,并最终实现企业的技术升级和价值增长。
|
5天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
11 4
|
6天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
15 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
15天前
|
存储 安全 编译器
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
|
17天前
|
人工智能 Cloud Native 物联网
探索云原生技术的发展趋势与应用前景
在当今数字化时代,云原生技术已经成为企业数字化转型的核心驱动力之一。本文将深入探讨云原生技术的发展趋势和应用前景,分析其在大数据、人工智能、物联网等领域的应用,并探讨未来可能的发展方向。
11 1
|
17天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
21天前
|
运维 Cloud Native 云计算
云原生技术在企业信息化中的应用与挑战
随着云计算技术的快速发展,云原生技术作为一种新兴的应用方式,正逐渐成为企业信息化转型中的热门话题。本文将探讨云原生技术在企业信息化中的应用现状、优势以及面临的挑战,并结合具体案例分析其实际效益和发展趋势。
15 3
|
25天前
|
消息中间件 Cloud Native 网络安全
云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE
该文档介绍了基于云原生应用的产品构建的微服务架构实践。
|
25天前
|
运维 Cloud Native 云计算
云原生技术的发展与应用前景
随着云计算技术的快速发展,云原生技术作为一种新兴的技术范式,正在逐渐引起人们的关注。本文将从云原生技术的概念、特点及其在实际应用中的优势等方面进行阐述,并探讨云原生技术在未来的发展前景。