k8s学习六-k8s部署go服务

简介: k8s学习六-k8s部署go服务

go代码

写一个最简单的http服务器:

package main
import (
   "flag"
   "github.com/gin-gonic/gin"
   "net/http"
   "os"
)
var version = flag.String("v", "v1", "v1")
func main() {
   router := gin.Default()
   router.GET("", func(c *gin.Context) {
      flag.Parse()
      hostname, _ := os.Hostname()
      c.String(http.StatusOK, "This is version:%s running in pod %s", *version, hostname)
   })
   router.Run(":8080")
}

测试下能不能用:

go run main.go

启动成功后,curl测试:

(base) tioncico@appledeMacBook-Pro test % curl 127.0.0.1:8080
This is version:v1 running in pod appledeMacBook-Pro.local%

dockerfile

编写go服务的dockerfile,在main.go同级目录编写(多阶段构建dockerfile):

FROM golang:latest AS build
WORKDIR /go/src/test
COPY . /go/src/test
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN CGO_ENABLED=0 go build -v -o main .
FROM alpine AS api
RUN mkdir /app
COPY --from=build /go/src/test/main /app
WORKDIR /app
ENTRYPOINT \["./main", "-v" ,"1.0.1"\]

构建docker镜像并打包上传

docker build -t go:v1.0.1 .   # 编译镜像
docker tag go:v1.0.1 tioncico/go:v1.0.1  # 增加tag
docker push tioncico/go:v1.0.1 # 上传到docker hub

此时,在dockerhub上,即可看到编译好的镜像:

image.png

编写k8s yaml文件

新增 go.yaml文件

\-\-\-
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-deployment
  labels:
    app: go
spec:
  selector:
    matchLabels:
      app: go
  replicas: 3
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: go
    spec:
      containers:
        - image: tioncico/go:v1.0.1
          name: go
          imagePullPolicy: Always
          command: \["./main","-v","v1.0.1"\]
          ports:
            - containerPort: 8080
              protocol: TCP
\-\-\-
apiVersion: v1
kind: Service
metadata:
  name: go-service
  labels:
    app: go
spec:
  selector:
    app: go
  ports:
    - name: go-port
      protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30080
  type: NodePort

k8s部署

kubectl apply -f go.yaml

即可部署成功,查看pod状态:

root@master:/home/tioncico# kubectl get pods
NAME                             READY   STATUS    RESTARTS       AGE
go-deployment-86f769995d-6j4pq   1/1     Running   0              2m20s
go-deployment-86f769995d-8pcsd   1/1     Running   0              2m20s
go-deployment-86f769995d-lz7vf   1/1     Running   0              2m20s
nginx-7cbb8cd5d8-w9tn2           1/1     Running   3 (140m ago)   28h

可看到,已经部署了3台,访问 集群任意一个节点ip:30080端口,可查看效果:

root@master:/home/tioncico# curl http://192.168.192.9:30080
This is version:v1.0.1 running in pod go-deployment-86f769995d-lz7vf
root@master:/home/tioncico# curl http://192.168.192.9:30080                          ^C
root@master:/home/tioncico# curl http://192.168.192.10:30080
This is version:v1.0.1 running in pod go-deployment-86f769995d-8pcsd
root@master:/home/tioncico#

为什么需要上传到docker hub?

在上面的教程中可以看到,我们先将镜像放到了docker hub,才开始进行k8s部署,这样相当于把自己的项目放到了公共的仓库,十分不安全

原因是: k8s有多个节点,如果我们只在一个节点编译镜像,其他节点就无法获取到这个自己编译后的镜像

解决方案有2种:

1:将所有镜像都编译到其他节点中去

2:创建一个私有的docker仓库,让k8s集群通过私有仓库去进行pull images 即可

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
存储 Kubernetes 对象存储
部署DeepSeek但GPU不足,ACK One注册集群助力解决IDC GPU资源不足
借助阿里云ACK One注册集群,充分利用阿里云强大ACS GPU算力,实现DeepSeek推理模型高效部署。
|
10天前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
本教程演示如何在ACK中使用vLLM框架快速部署DeepSeek R1模型推理服务。
|
11天前
|
存储 人工智能 弹性计算
NVIDIA NIM on ACK:优化生成式AI模型的部署与管理
本文结合NVIDIA NIM和阿里云容器服务,提出了基于ACK的完整服务化管理方案,用于优化生成式AI模型的部署和管理。
|
5天前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
2月前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
3月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
3月前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
90 3
|
3月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
102 0
|
Go 调度 Python
golang 服务平滑重启小结
背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。
1634 0
|
6天前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
54 20

热门文章

最新文章