keel-hq/keel
GitHub: keel-hq/keel
轻量级 Kubernetes Operator,通过注解配置自动更新 Helm charts 和各类工作负载的容器镜像版本
Stars: 2695 | Forks: 312
# Keel - 面向大众的自动化 Kubernetes 部署工具
* 网站 [https://keel.sh](https://keel.sh)
* Slack - [kubernetes.slack.com](https://kubernetes.slack.com) 查找频道 #keel
Keel 是一个用于自动化 [Kubernetes](https://kubernetes.io/) 部署更新的工具。Keel 是无状态的、健壮且轻量级的。
Keel 提供了几个关键特性:
* __[Kubernetes](https://kubernetes.io/) 和 [Helm](https://helm.sh) 提供商__ - Keel 与 Kubernetes 和 Helm 直接集成。
* __无 CLI/API__ - 厌倦了到处都是 `f***ctl`?Keel 没有这些。它通过标签、注解和图表完成任务。
* __Semver 策略__ - 单独为每个部署/Helm release 指定更新策略。
* __自动 [Google Container Registry](https://cloud.google.com/container-registry/) 配置__ - Keel 通过定期扫描您的环境,自动为您的部署镜像设置主题和订阅。
* __[原生、DockerHub、Quay 和 Azure 容器仓库 Webhooks](https://keel.sh/docs/#triggers) 支持__ - 一旦收到 webhook,受影响的部署将被识别并更新。
* __[轮询](https://keel.sh/docs/#polling)__ - 当 webhooks 和 pubsub 不可用时,Keel 仍然可以通过检查 Docker Registry 中的新标签(如果当前标签是 semver)或相同标签的 SHA digest 变化(例如:`latest`)来发挥作用。
* __通知__ - 开箱即用,Keel 支持 Slack、Hipchat、Mattermost 和标准 webhook 通知,更多信息请见 [这里](https://keel.sh/docs/#notifications)
### Helm 快速入门
前置条件:
* [Helm](https://docs.helm.sh/using_helm/#installing-helm)
* Kubernetes
您需要将此 Chart 仓库添加到 Helm:
```
helm repo add keel https://keel-hq.github.io/keel/
helm repo update
```
通过 Helm 安装(默认启用 Helm 提供商):
```
helm upgrade --install keel --namespace=kube-system keel/keel
```
如果您主要使用常规的 Kubernetes manifests,可以安装不带 Helm 提供商支持的 Keel:
```
helm upgrade --install keel --namespace=keel keel/keel --set helmProvider.enabled="false"
```
要为 Helm v3 安装,请设置 helmProvider.version="v3"(默认为 "v2"):
```
helm install keel keel/keel --set helmProvider.version="v3"
```
使用 terraform 安装:
```
resource "helm_release" "keel" {
provider = helm.helm
name = "keel"
namespace = "keel"
repository = "https://keel-hq.github.io/keel"
chart = "keel"
version = "v1.0.4"
set {
name = "basicauth.enabled"
value = "true"
}
set {
name = "basicauth.user"
value = "admin"
}
set {
name = "basicauth.password"
value = "admin"
}
set {
name = "image.repository"
value = "keelhq/keel"
}
set {
name = "image.tag"
value = "0.19.1"
}
}
```
完成,现在请查看 [配置](https://github.com/keel-hq/keel#configuration) 章节。
### 快速入门
在 Keel 网站上可以查看在 Kubernetes 集群上安装 Keel 的分步指南:
[https://keel.sh/examples/#example-1-push-to-deploy](https://keel.sh/examples/#example-1-push-to-deploy)
### 配置
部署 Keel 后,您只需在部署文件或 Helm chart 上指定更新策略:
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: wd
namespace: default
labels:
name: "wd"
annotations:
keel.sh/policy: minor # <-- policy name according to https://semver.org/
keel.sh/trigger: poll # <-- actively query registry, otherwise defaults to webhooks
spec:
template:
metadata:
name: wd
labels:
app: wd
spec:
containers:
- image: karolisr/webhook-demo:0.0.8
imagePullPolicy: Always
name: wd
command: ["/bin/webhook-demo"]
ports:
- containerPort: 8090
```
不需要额外的配置。为您的工作负载启用持续交付从未如此简单!
### 文档
文档可在 Keel 网站上查看:
[https://keel.sh/docs/#introduction](https://keel.sh/docs/#introduction)
### 开发 Keel
如果您希望参与 Keel 本身的开发,您需要安装 Go 1.12+。确保将 Keel 放入正确的 Gopath 并执行 `go build`(依赖管理通过 [dep](https://github.com/golang/dep) 完成)。
要在开发时测试 Keel:
1. 启动一个 Kubernetes 集群,如 Minikube 或带 Kubernetes 的 Docker for Mac。
2. 更改配置以使用它:`kubectl config use-context docker-for-desktop`
3. 从 `cmd/keel` 目录构建 Keel。
4. 启动 Keel:`keel --no-incluster`。这将使用您主目录中的 Kubeconfig。
### 在 Windows 上调试 Keel
```
# 确保我们有 gcc 和 go
choco upgrade mingw -y
choco upgrade golang -y
# 移动并构建
cd cmd/keel
go build
$Env:XDG_DATA_HOME = $Env:APPDATA; # Data volume for the local database
$Env:HOME = $Env:USERPROFILE; # This is where the .kube/config will be read from
$Env:KUBERNETES_CONTEXT = "mycontext" #Use if you have more than one context in .kube/config
.\keel --no-incluster
```
### 运行单元测试
获取测试解析器(使输出更美观):
```
go get github.com/mfridman/tparse
```
运行单元测试:
```
make test
```
### 运行 e2e 测试
前置条件:
- 已配置 kubectl + kubeconfig
- 一个正在运行的集群(测试套件将创建测试命名空间并在测试后删除它们)
- Go 环境(将在运行前编译 Keel)
前置条件准备好后:
```
make e2e
```
### 在容器内针对远程集群调试 keel (Windows)
仓库中包含一个调试版本的 keel 容器,可用于远程调试。
您可以使用 powershell 启动调试容器(需要 docker desktop):
```
.\build.ps1 -StartDebugContainers
```
要连接到您的集群,请从集群内 keel pod 的以下位置复制身份验证详细信息:
```
/var/run/secrets/kubernetes.io/serviceaccount
```
到仓库根目录下的 serviceaccount 文件夹,并确保为 K8S 管理 API 端点设置环境变量:
```
# 可以在 envesttings.ps1 中配置,以便 build script 自动获取
$ENV:KUBERNETES_SERVICE_HOST = "mycluster-o5ff3caf.hcp.myregion.azmk8s.io"
$ENV:KUBERNETES_SERVICE_PORT = "443"
```
并确保您的 API server 可从您的客户端访问(VPN、IP 白名单或任何您用来保护集群管理 API 的方式)。
启动后,只需在 Go 调试器(例如 Jetbrains GoLand)中使用调试选项:
[在 Docker 容器内调试 Go 应用程序 | The GoLand Blog](https://blog.jetbrains.com/go/2020/05/06/debugging-a-go-application-inside-a-docker-container/)
标签:CD, DaemonSet, Deployment, Docker, DockerHub, EVTX分析, Google Cloud Registry, Go语言, Helm, Operator, Quay, Semver, Slack通知, StatefulSet, Webhook, 力导向图, 子域名突变, 安全可观测性, 安全防御评估, 容器编排, 持续部署, 无状态, 日志审计, 版本控制, 程序破解, 自动化更新, 自动化运维, 请求拦截, 镜像更新


