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搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
168 60
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
48 7
|
2月前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
68 3
|
2月前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
34 4
|
2月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
82 0
|
3月前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
26天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
72 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用