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 即可

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
33 6
Go语言学习12-数据的使用
|
3天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
11 5
|
3天前
|
Kubernetes Linux Docker
Kubernetes详解(四)——基于kubeadm的Kubernetes部署
Kubernetes详解(四)——基于kubeadm的Kubernetes部署
14 2
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
5天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go
|
7天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
47 1
|
13天前
|
Kubernetes API 调度
|
13天前
|
Kubernetes 应用服务中间件 nginx
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
|
13天前
|
Kubernetes 网络安全 数据安全/隐私保护
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)