从Go程序第一行代码,到在 K8s 上运行,要经历多少步?

一颗小胡椒2022-07-21 11:30:04

大家好,我是网管。咱们的 K8s 入门和实践,在经历了三篇理论知识的后,相信各位都已经期待许久(可能的吧),就差私信我:“你整着理论整半天有啥用,本大人写的程序怎么能放到 K8s 上运行”。

别急,今天这篇文章就带你从写第一行代码开始,一步步教你把程序放到 K8s 跑起来。这次咱们先用 Go 做个例子,后面再写一篇怎么把 Spring Boot 应用放到 K8s 上运行。

本文的重点,不在于那种语言写的程序,而是先学会应用 上到 K8s 的步骤,所以编程部分的演示非常简单,恨不能写一行代码就带你进入后面的 K8s 部署环节,不过要部署咱们得先有个环境,这里不需要你有啥云服务器,电脑上安装就行了。

K8s 本机环境安装

在个人电脑上安装 K8s 可选的软件,主要有这么几种:

  • minikube。
  • Kind。
  • Docker 桌面应用自带的 K8s 集群。

其中 minikube、DockerDesktop 内嵌K8s 这两种,咱们之前都写文章介绍过,不过两年过去了,我不再推荐各位安装 minikube,原因很简单我的 2021款 "诶嘛姨麦克斯,迈步可”都扛不住他造。还是用后两者吧,如果图省事Docker桌面应用自带的 K8s 集群完全就够用,安装指南可以参考:

一个 Go 应用,想在 K8s 上运行

怎么把一个 Go 开发的 Web 应用部署到 K8s 集群上运行,有哪几个步骤要完成的呢,这里我们先归纳一下,后面依次对每一步进行演示。

因为 K8s 是基于容器技术的分布式架构方案,所以首先我们需要把要部署的应用程序打包到容器镜像里,当然,在那之前我们得先写好应用代码。

这里会把我们上面理论部分的知识点再串一遍,主要有这么几个步骤:

  • 把 Web 程序打包成容器镜像
  • 使用上一步打包的镜像,创建应用的Pod
  • 用 Deployment 调度应用
  • 使用 Service 暴露应用
  • 通过 Ingress 代理应用

好了,这五步大家一定要记住,下面我们逐一展开,详细说说。

把 Web 程序打包成容器镜像

首先看下面这个简单的程序

这里是用 Go 程序起了一个特别简单的 HTTP Server,访问 "/" 路径后向页面上打印一行文字,告诉访问者他正在访问的网页的主机地址。

下面是打包镜像用的 Dockerfile

打包 Go 应用镜像的 Dockerfile

接下来,我们使用下面的命令打包应用镜像:

docker build -t registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-go:v0.2 .

打包好后,就是上传啦,这样各位就能用啦。

docker push registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-go:v0.2

这个镜像仓库是阿里云上的,不知道哪位好心人创建的,貌似谁都可以传,不过前提是你得在阿里云上开个镜像云的账号,然后用 docker login 命令配置下自己的客户端。这块,咱们就不细说啦

配置 Pod 和 Deployment

还记得我在上面文章 -- K8s 面向对象里说过

Deployment 是一个复合型的控制器,它包装了一个叫做 ReplicaSet -- 副本集的控制器。ReplicaSet 管理正在运行的Pod数量,Deployment 在其之上实现 Pod 滚动更新,对Pod的运行状况进行健康检查以及回滚更新的能力

所以,这里我们直接把步骤2、3合起来一起说。其实也没啥好说的,直接上-- Deployment 的 YAML 配置

拿到这个配置后,直接用 kubectl -f xxx.yaml 命令把 Deployment 提交给 K8s集群,让它帮助我们创建好,Deployment、ReplicaSet、Pod 这些对象就好。

这里我们只是使用了 Deployment 最基本的功能,想了解更多关于滚动更新配置和健康检查等进阶功能的,可以参考之前的文章:

用 Service 暴露服务

创建好上面这几个对象后,我们的应用只能在 K8s 集群的内部使用,想能从外部访问就得把应用暴露出来,这个时候就需要 Service 这个对象了。Service 对象具体的概念解释,咱们还是看上一篇文章,这里不再赘述了。

下面是一个 NodePort 型的 Service,它把咱们的服务暴露在 30088 这个端口。

这样在电脑上通过 127.0.0.1:30088 就能访问到我们的服务啦。

用 Ingress 代理服务

Node Port 类型的 Service 对象的缺点,咱们上一篇文章提到过,所以实际操作的时候,咱们可以把上面那个例子里的 type 字段去掉,创建一个默认的只能在集群内使用的 ClusterIp类型的 Service 对象,再用 Ingress 代理 Service,完成服务的向外暴露,这样更优雅也更好管理一些。

使用 Ingress 前需要先安装 Ingress Controller ,这里我们使用开源的 Ingress-Nginx

  • 安装参考这个,非常简单 :https://kubernetes.github.io/ingress-nginx/deploy/

然后就是声明代理我们的 Go Web 应用的 Ingress 对象

通过 kubctl apply -f 命令把它提交给 K8s 集群,创建 Ingress 对象。

Ingress 对象创建好后,我们就能通过 app.example.com 访问咱们的服务啦,当然前提是在电脑上配置一下咱们的 hosts 文件,添加一下这个域名到127.0.0.1 的绑定。

k8s虚拟侵入
本作品采用《CC 协议》,转载必须注明作者和本文链接
目前发现并没有将kubernetes和Docker技术产生背景和需求进行比较的文章,本文从最纯正的官方定义角度出发并展开,阐述二者产生背景及与传统技术对比。官方定义2:k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
初识Kubernetes 集群
2022-05-24 15:41:41
Kubernetes (K8s) 集群是一组节点,它们以高效、自动化、分布式和可扩展的方式运行容器化应用程序。 K8s 集群允许工程师跨多个物理、虚拟和云服务器编排和监控容器。这将容器与底层硬件层分离,并实现敏捷和健壮的部署。一个 Kubernetes 集群由一组工作机器组成,称为节点,运行容器化应用程序。 每个集群至少有一个工作节点,工作节点托管豆荚它们是应用程序工作负载的组成部分。这控制平
虽然网上有大量从零搭建 K8S 的文章,但大都针对老版本,若直接照搬去安装最新的 1.20 版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供 copy and paste 式的集群搭建帮助。
虽然网上有大量从零搭建?的文章,但大都针对老版本,若直接照搬去安装最新的?版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供?式的集群搭建帮助。服务等,可供用户免费下载、使用和分享。??启动的三节点服务已经配置好了以下使用?节点进行演示查看,其他节点操作均一致#?
容器安全之CVE-2022-0185
2022-03-28 16:35:58
最近的CVE-2022-0185还是挺有意思的,在谷歌kctf(基于 K8s 的 CTF)中被发现。这个洞是在Linux内核的文件系统上下文中功能中的legacy_parse_param函数验证长度的代码处有缺陷,导致了一个基于堆的缓冲区溢出(整数下溢)。 攻击影响为越界写入/拒绝服务/权限提升和特定场景下的容器逃逸(k8s)。 其中会涉及到一些容器安全的基础小知识,有必要简单学习一下这个洞。
工作需要,本周安装了vmware-tanzu社区版,记录如下, all in one,ubuntu20.04, sudo apt update, sudo apt dist-upgrade, 安装docker, sudo apt install docker.io, sudo systemctl enable docker, sudo gpasswd -a ubuntu docker
保留的这部分资源主要提供给系统进程使用。cpuManager 当前的限制:最大 numa node 数不能大于 8,防止状态爆炸。策略只支持静态分配 cpuset,未来会支持在容器生命周期内动态调整 cpuset。下文有介绍相应的提案。支持这种场景需要对 CPU 进行分组分配。
与此项目相关的赞助商列表。以他们认为合适的方式扩展他们的服务。拥有自己特定于其服务的监控、备份和灾难恢复。容器在如何使用网络方面受到限制。基本上,任何 Linux 可执行文件都可以受到限制,即可以“容器化”。通常这些文件,通常称为“容器镜像”,也称为容器。
2021 年 6 月 21 日,Scott Logic 发布了 2021 年 WebAssembly 用户报告。报告中显示 69% 的受访者认为 Wasm 将对未来的 Web 开发产生非常大的影响,同时受访者还预计 Wasm 将会对不同应用领域产生重要影响。
从云的虚拟化管理平台和云网络构架的一般性知识入手,以 Clos 云网络架构和 Kubernetes管理平台为例,俯瞰了当前云计算环境的全貌和细节,宏观上总览了云网络架构和 Kubernetes 管理平台,微观上深入连接 fabrics 和容器的细节。
一颗小胡椒
暂无描述