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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 伴随着云原生生态的不断发展与壮大, 标准/工具链越发的成熟, 服务的部署与运维会越来越 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搭建和管理企业级网站应用
目录
相关文章
|
2天前
|
运维 监控 Cloud Native
云原生技术在现代企业中的应用与挑战####
【10月更文挑战第15天】 本文深入探讨了云原生技术如何重塑企业的IT架构,并分析了其带来的机遇与面临的挑战。通过案例分析,揭示了云原生技术在提升业务敏捷性、降低运维成本方面的显著优势,同时也指出了在安全性、多云管理等方面的潜在难题,为企业决策者提供了有价值的参考。 ####
12 3
|
6天前
|
人工智能 运维 Cloud Native
云原生应用开发平台 CAP(Cloud Application Platform)应用心得
云原生应用开发平台 CAP(Cloud Application Platform)是阿里云提供的一站式应用开发及应用生命周期管理平台。
14 1
|
8天前
|
运维 Cloud Native 持续交付
云原生技术:构建现代应用的基石
【10月更文挑战第9天】在数字化转型的浪潮中,云原生技术如同一股清流,引领着企业走向更加灵活、高效的未来。本文将深入探讨云原生的核心概念,揭示其在现代应用开发与部署中的重要作用,并通过实际案例分析,展现云原生技术如何助力企业实现敏捷开发和自动化运维,最终提升业务竞争力。
26 3
|
8天前
|
运维 Kubernetes Cloud Native
云原生技术:构建现代应用的新范式
【10月更文挑战第9天】 云原生是一种通过云计算环境优化的软件开发和运行方法论,旨在最大化利用云平台的灵活性、可扩展性和弹性。本文将深入探讨云原生技术的基本原理、核心组件以及其在实际项目中的应用。我们将从Kubernetes的容器编排机制入手,逐步探讨如何通过自动化工具实现持续集成与持续部署(CI/CD),最终展示如何构建一个高效、可靠的云原生应用。
26 2
|
5天前
|
Cloud Native Devops 云计算
云原生技术:构建现代应用的新基石
【10月更文挑战第12天】 本文深入探讨了云原生技术的核心理念、关键技术和实践方法,揭示了其在现代应用开发和运维中的重要地位。通过分析云原生技术的发展趋势和面临的挑战,本文为读者提供了全面而深入的理解,旨在帮助读者更好地利用云原生技术构建高效、灵活和可扩展的现代应用。
22 0
|
5天前
|
Cloud Native 安全 云计算
云原生技术在现代企业中的应用与挑战
本文探讨了云原生技术在现代企业中的重要性及其应用,并分析了企业在实施过程中面临的主要挑战。通过案例分析,本文展示了如何利用云原生技术提高企业的敏捷性和弹性,同时提出了相应的解决方案和建议。
|
Kubernetes Ubuntu Linux
使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
110 0
|
21天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
90 17
|
13天前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
113 1