以下文章来源于网管叨bi叨 ,作者KevinYan11

介绍

今天的文章我准备和大家一起一步步地尝试做一个Go应用程序的Docker镜像,把它部署到Minikuebe上运行。今天的文章不需要什么基础,Kubernetes的新手朋友们先一起上车学起来。

应用程序代码

我们用Go写一个简单的HTTP Server,Server侦听3000端口包含"/"和"/health_check"两个路由,今天文章的关注点不在怎么用Go开发程序所以都是Hello World级别的代码,就不更多解释了,直接看代码吧。

package mainimport ( "fmt" "net/http")func index(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "

Hello World

")}func check(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "

Health check

")}func main() { http.HandleFunc("/", index) http.HandleFunc("/health_check", check) fmt.Println("Server starting...") http.ListenAndServe(":3000", nil)}

制作程序镜像

接下来开始制作包含应用程序代码的Docker镜像。关于docker相关的使用方法和如何编写Dockerfile,可以在公众号里回复关键字docker获取完整的参考笔记。

dockerfile

在应用程序的根目录添加名为Dockerfile的文件,在文件里添加如下指令:

FROM golang:alpineRUN mkdir /appCOPY . /appWORKDIR /appRUN go build -o main . CMD ["/app/main"]

build 镜像

在Dockerfile所在的目录下执行docker build构建镜像

➜  docker build -t go-app-img .

docker会依据Dockerfile里的指令构建镜像,整个构建的过程类似下面:

➜  docker build -t go-app-img .Sending build context to Docker daemon  9.216kBStep 1/6 : FROM golang:alpinealpine: Pulling from library/golangdf20fa9351a1: Pull complete ed8968b2872e: Pull complete a92cc7c5fd73: Pull complete 9e0cccf56431: Pull complete cbe0275821fc: Pull complete Digest: sha256:6042b9cfb4eb303f3bdcbfeaba79b45130d170939318de85ac5b9508cb6f0f7eStatus: Downloaded newer image for golang:alpine ---> 3289bf11c284Step 2/6 : RUN mkdir /app ---> Running in b34dccb1f3deRemoving intermediate container b34dccb1f3de ---> 1fa1a1c21aa2Step 3/6 : COPY . /app ---> 815660da9d1aStep 4/6 : WORKDIR /app ---> Running in 49dc25fe6bb7Removing intermediate container 49dc25fe6bb7 ---> 14776702ccf7Step 5/6 : RUN go build -o main . ---> Running in 3bd4dc1e2bf6Removing intermediate container 3bd4dc1e2bf6 ---> 59aa7f96ee42Step 6/6 : CMD ["/app/main"] ---> Running in 6309f604d662Removing intermediate container 6309f604d662 ---> 023baffdcb28Successfully built 023baffdcb28Successfully tagged go-app-img:latest

验证镜像

这一步其实可以省略,不过为了确保制作的镜像是没有问题,我们通过docker run命令用这个镜像运行容器验证一下。

➜ docker run -d -p 3333:3000 --rm --name go-app-container go-app-img

在这里,我们指示docker从镜像go-app-img运行容器,将主机端口3333绑定到容器的内部端口3000,以后台模式(-d)运行容器,给此容器命名为go-app-container,并在容器结束运行后自动删除容器(--rm)。

打开浏览器输入localhost:3333访问到的页面输出会是:

推送镜像到DockerHub

测试镜像没问题后,将镜像推送到DockerHub,到时候Kubernetes在部署应用时会根据指定的镜像名称从DockerHub上拉取镜像(镜像源是可配置的,不一定非得是DockerHub,可以是私有镜像仓库)。

➜  docker build -t kevinyan001/kube-go-app .   ...➜  docker push  kevinyan001/kube-go-app...

用Dockerfile重新构建镜像,指定镜像仓库名。构建完成后将镜像然后推送到DockerHub上。

上面仓库名中的kevinyan001是我自己的DockerHub账号,你们可以直接使用下面的命令拉取我的镜像使用,不过还是建议每个人动手制作自己的镜像。

docker pull kevinyan001/kube-go-app:latest

广告

Kubernetes权威指南:从Docker到Kubernetes实践全接触(第4版)

作者:龚正,吴治辉,崔秀龙,闫健勇

京东

Kubernetes部署应用

部署应用开始需要先定义预期状态,就是在yaml文件里声明具体的Kubernetes对象的各种预期的状态。然后让Kubernetes创建对象,之后它会始终驱动集群的当前状态向预期状态移动(比如有节点挂了,会新起节点替代挂掉的节点)。部署完应用后后我们还需要通过Service向外部暴露应用,这样才能访问运行在Kubernetes集群里的应用。

下面我们来一步步递进地执行这三个步骤。

开始之前我们需要启动一下Minikube

minikube start

如果你还没有安装可以参照《Minikube-运行在笔记本上的Kubernetes集群》里的安装步骤

定义预期状态

在部署清单文件(deployment.yaml)中定义预期状态

apiVersion: apps/v1kind: Deploymentmetadata:  name: my-go-appspec:  replicas: 1  selector:    matchLabels:      app: go-app  template:    metadata:      labels:        app: go-app    spec:      containers:        - name: go-app-container          image: kevinyan001/kube-go-app          resources:            limits:              memory: "128Mi"              cpu: "500m"          ports:            - containerPort: 3000

Kubernetes Deployment 对象(清单文件的kind里指定的)表示运行在集群中的应用。文件里还指定了应用需要一个副本运行(replicas),以及运行的容器名和容器的镜像、资源大小等信息。

Deployment是Kubernetes对象的一种,还有其他很多种对象分别对应Kubernetes里的不同类型的资源。

部署应用

使用上面定义的deployment.yaml创建Deployment对象来运行Go应用程序的容器:

➜ kubectl create -f deployment.yamldeployment.apps/my-go-app created➜ kubectl get deploymentsNAME        READY     UP-TO-DATE   AVAILABLE   AGEmy-go-app   1/1       1            1           24s➜ kubectl get podsNAME                         READY     STATUS    RESTARTS   AGEmy-go-app-5bb8767f6d-2pdtk   1/1       Running   0          43s

暴露应用

应用部署完后还不能从外部直接访问,需要把刚才Deployment对象运行的应用程序作为Kubernetes的一个Service对外暴露。

➜ kubectl expose deployment my-go-app --type=NodePort --name=go-app-svc --target-port=3000 service/go-app-svc exposed➜ kubectl get svcNAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGEgo-app-svc   NodePort    10.104.190.231           3000:31425/TCP   40hkubernetes   ClusterIP   10.96.0.1                443/TCP          6d13h➜ minikube ip192.168.64.4

通过kubectl get svc查询Service可以得到主机的31425端口映射到了Kubernetes运行着应用的容器的3000端口。在浏览器里使用Kubernetes集群IP加NodePort即可访问到Kubernetes部署的Go应用程序。

打开浏览器通过192.168.64.4:31425(以自己实践时查到的IP和端口为准)访问应用程序定义的两个路由的结果如下:

IndexPage

HealthCheckPage

总结

今天的文章简单的总结了一下将应用程序部署到Kubernetes集群的步骤,Kubernetes里有很多种对象来代表其内部的各种资源,今天部署应用用到的Deployment就是其中的一种,kubectl会根据.yaml文件中的配置信息请求Kubernetes的apiServer创建各种对象,我们后续要做的就是继续研究清楚这些常用到的Kubernetes对象。由于鄙人也是刚开始学习,难免有表达不精确的地方,还请见谅。

go 计算文件sha-256_Kubernetes入门实践--部署运行Go项目相关推荐

  1. Kubernetes入门实践--部署运行Go项目

    介绍 前面的几篇文章从概念层面介绍了Kubernetes是什么,它的内部架构是怎样的.并且也在电脑上安装了Minikube--拥有一个单节点的Kubernetes集群,让我们能够在自己的电脑上开始体验 ...

  2. 使用Apache Tomcat Maven插件部署运行 Web 项目

    2019独角兽企业重金招聘Python工程师标准>>> 什么是Apache Tomcat Maven Plugin? Maven Plugin 是Apache Tomcat 提供的一 ...

  3. Linux nginx 安装 部署运行前端项目

    (1)nginx介绍         Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 [13]  ,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔· ...

  4. 部署一个Javaweb项目到腾讯云服务器上,在腾讯云轻量应用服务器上部署javaweb项目

    博主每篇博文的浪漫主义 [听说,思念是一种病?] https://www.bilibili.com/video/BV1z14y177VT?share_source=copy_web&vd_so ...

  5. 腾讯云轻量级应用服务器部署并运行JavaWeb项目

    今天博主心血来潮,想要搭建一个服务器来将自己做的项目部署到上面去,之前博主曾经买过腾讯云的服务器,当时使用的学生身份,很便宜,然后想着再买一个,但由于其限定只能买一个,万般无奈下(就是没钱)发现腾讯云 ...

  6. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)...

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen, 发布日期: 2014-05 ...

  7. Python计算文件或字符串的MD5/SHA

    本文章讲如何通过Python实现计算文件或字符串的MD5, SHA1, SHA224, SHA256, SHA384, SHA512值. 原文:https://blog.zeruns.tech/arc ...

  8. Python入门 NUMECA计算文件处理(一)

    Python入门 NUMECA计算文件处理(一) 批量处理mf文件 读取指定文件目录(包括子目录)下的 "*.mf"文件,并提取指定行到excel表格 思路 os.walk 递归遍 ...

  9. JavaScript计算文件Hash值(sha1 sha 256 md5)

    一.引入外部库CryptoJS(简单) 1.字符串Hash <!DOCTYPE html> <html> <head><title>Hash算法< ...

最新文章

  1. 优秀的 Java 项目是如何分层的?
  2. UI设计 - 首页(主页)的任务
  3. Django 笔记4 -- 模板
  4. MIPI参数配置解释
  5. StringFarmat控制字符串居中显示
  6. php post登陆 json,php 之 post json 数据
  7. javascript 高级程序设计_重读《JavaScript高级程序设计》
  8. idea复制java_IntelliJ IDEA的剪切、复制和粘贴
  9. bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)
  10. snowflake 数据库_Snowflake数据分析教程
  11. 第二十九期:运维之三大监控对比
  12. indesign使用教程,如何编辑段落样式?
  13. Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
  14. Confluence3.4的安装和配置
  15. iphone11支持es6吗_好久没用Carplay了:IOS11导航功能不错
  16. 第53天-代码审计-TP5 框架及无框架变量覆盖反序列化(待续)
  17. php视频怎么转mp4,PHP实现将视频转成MP4并获取视频预览图的方法_php技巧
  18. git rebase命令实际操作记录
  19. 拟合程度的评估--判定系数
  20. Python数据分析与挖掘实战学习12

热门文章

  1. php mysql切换版本5.7_phpstudy里升级mysql版本到5.7
  2. Cron 触发器及相关内容 (第二部分)
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生考勤管理系统
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的会员管理系统
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的记账本管理系统
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生请假管理系统
  7. windows下升级nodenpm
  8. 剑指Offer_47_求1+2+3+...+n
  9. Spring4 SpringMVC Hibernate4 Freemaker 集成示例
  10. 计算机网络即时通信系统设计_天天玩微信,Spring Boot 开发私有即时通信系统了解一下...