Ko
是 Google
开源的一款用于构建并部署 Go
应用的工具。
这是一款简单、快速的 Go
应用镜像构建器。并与 Kubernetes
集成,能够将应用快速部署到 Kubernetes
上。是云原生时代 Kubernetes
应用开发的一大利器。
特点:
- 需要构建的
Go
应用对系统镜像无太多依赖(例如,无cgo
,无OS
软件包依赖关系),最好是只有一个go
二进制。 - 构建镜像的过程不需要
Docker
,因此可以用在轻量化的CI/CD
场景。 - 支持
yaml
模板,可以直接用于部署Kubernetes
应用。
如何使用
官方地址在这 https://github.com/google/ko
1. 安装 ko
此处安装的是 v0.8.2
版本的 linux x86
版本,可以根据需要自行选择版本下载
Release 地址: https://github.com/google/ko/releases
手动安装
curl -L https://github.com/google/ko/releases/download/v0.8.2/ko_0.8.2_Linux_x86_64.tar.gz | tar xzf - ko |
brew 安装
brew install ko |
go install 安装
go install github.com/google/ko |
2. 镜像仓库的认证
Ko 依赖的是 Docker 的镜像仓库的认证( Docker config 文件),即 ~/.docker/config.json
cat ~/.docker/config.json |
如果镜像仓库没有登录过,需要先进行 Docker login
生成 对应的认证配置文件,比如我直接用的是 docker hub
,那么直接 docker login
即可。
3. 设置私有仓库的地址
Ko
通过 环境变量 KO_DOCKER_REPO
配置私有仓库的地址, 这决定了 Ko
会将编译好的镜像推到哪个仓库。
# 这是我的 dockerhub 账号, |
4. 镜像构建 Ko publish
首先代码一定要在本地的
Go path
中,可以下载示例代码 https://github.com/zhaojizhuang/http-helloworld
mkdir -p $GOPATH/src/github.com |
Ko publish
构建镜像,执行命令 ko publish github.com/http-helloworld/cmd/helloworld
(main函数所在的 GoPath
路径)。
$ ko publish github.com/http-helloworld/cmd/helloworld |
也支持相对路径编译,如下
cd $GOPATH/src/github.com/http-helloworld/cmd/helloworld |
5. Ko resolve
创建文件deploy.yaml
,yaml 内容如下
apiVersion: apps/v1 |
然后执行 ko resolve -f deploy.yaml
结果如下,可以看到 ko://github.com/http-helloworld/cmd/helloworld
被替换成了 zhaojizhuang66/helloworld-cbcbba9849adcc25ce56a08dfd597648@sha256:21d352ec9f9079f8da4c91cfe2461df51a404c079f262390b19fff4cb2ce15a0
$ ko resolve -f deploy.yaml |
6. Ko apply
ko apply -f xxx.yaml
用法同 kubectl apply -f xxx.yaml
,不同的是,ko apply -f
相当于先执行 resolve
将 ko://xxx
替换成镜像地址,然后再执行 kubectl apply -f
。
$ cd $GOPATH/src/github.com/http-helloworld/config |
7. 替换基础镜像
可以通过 ko
的 config
文件中的 defaultBaseImage
变量来设置基础镜像, 配置文件名为 .ko.yaml
,
ko 执行时默认会在当前目录下寻找 .ko.yaml
文件,也可以通过 环境变量 KO_CONFIG_PATH
来指定 .ko.yaml
的路径
# ~/.ko.yaml |
执行如下
|
还可以 通过.ko.yaml
文件中的 baseImageOverrides
对指定编译二进制替换基础镜像,如本示例中,设置如下:
# ~/.ko.yaml |
修改 .ko.yaml
后,执行命令
$ ko apply -f config |