Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions controllers/job/heartbeat/deploy/Kubefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ FROM scratch
USER 65532:65532

COPY registry registry
COPY manifests manifests
COPY charts charts
COPY heartbeat-cronjob-entrypoint.sh heartbeat-cronjob-entrypoint.sh

CMD ["kubectl apply -f manifests"]
CMD ["bash heartbeat-cronjob-entrypoint.sh"]
64 changes: 64 additions & 0 deletions controllers/job/heartbeat/deploy/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# job-heartbeat

## 说明
sealos run 镜像时会在目标节点执行 Kubefile,本镜像通过 Helm 安装/升级 heartbeat CronJob。

## 必填参数

**无**

## 如何运行

```shell
# 最简配置
sealos run ghcr.io/labring/sealos-job-heartbeat-controller:latest
```

## 可选参数

- RELEASE_NAMESPACE: Helm 安装命名空间,默认 `heartbeat-system`
- RELEASE_NAME: Helm release 名称,默认 `heartbeat`
- HELM_OPTS: 透传 Helm 参数(例如 `--set schedule="0 */6 * * *"`)
- CHART_PATH: Helm chart 路径,默认 `./charts/heartbeat`

## 示例

```shell
# 1. 最简配置(每天午夜执行)
sealos run ghcr.io/labring/sealos-job-heartbeat-controller:latest

# 2. 自定义命名空间和执行计划
sealos run ghcr.io/labring/sealos-job-heartbeat-controller:latest \
--env RELEASE_NAMESPACE="my-namespace" \
--env HELM_OPTS="--set schedule=\"0 */6 * * *\""

# 3. 自定义资源限制
sealos run ghcr.io/labring/sealos-job-heartbeat-controller:latest \
--env HELM_OPTS="--set resources.limits.cpu=500m --set resources.limits.memory=256Mi"

# 4. 组合多个参数
sealos run ghcr.io/labring/sealos-job-heartbeat-controller:latest \
--env RELEASE_NAMESPACE="production" \
--env HELM_OPTS="--set schedule=\"0 2 * * *\" --set activeDeadlineSeconds=1800"
```

## Helm Chart 可配置参数

可通过 `HELM_OPTS` 传递以下参数:

- `schedule`: Cron 执行计划,默认 `"0 0 * * *"`(每天午夜执行)
- `activeDeadlineSeconds`: Job 超时时间,默认 `600`
- `backoffLimit`: 重试次数,默认 `1`
- `image`: 容器镜像,默认 `ghcr.io/labring/sealos-job-heartbeat-controller:latest`
- `imagePullPolicy`: 镜像拉取策略,默认 `Always`
- `resources.limits.cpu/memory`: CPU/内存限制
- `resources.requests.cpu/memory`: CPU/内存请求
- `nodeSelector`: 节点选择器
- `tolerations`: 容忍度配置
- `affinity`: 亲和性配置

## 测试立即创建job:

```shell
kubectl create job --from=cronjob/heartbeat-cronjob heartbeat-manual-$(date +%Y%m%d-%H%M%S) -n heartbeat-system
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
apiVersion: v2
name: heartbeat
description: Helm chart for the sealos heartbeat cronjob
type: application
version: 0.1.0
appVersion: "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Heartbeat cronjob has been installed successfully!

CronJob name: {{ include "heartbeat.fullname" . }}-cronjob
Schedule: {{ .Values.schedule }}
Namespace: {{ .Release.Namespace }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "heartbeat.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully qualified app name.
*/}}
{{- define "heartbeat.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "heartbeat.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Common labels
*/}}
{{- define "heartbeat.labels" -}}
helm.sh/chart: {{ include "heartbeat.chart" . }}
{{ include "heartbeat.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "heartbeat.selectorLabels" -}}
app.kubernetes.io/name: {{ include "heartbeat.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Create the name of the service account to use
*/}}
{{- define "heartbeat.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "heartbeat.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: {{ include "heartbeat.fullname" . }}-cronjob
labels:
{{- include "heartbeat.labels" . | nindent 4 }}
spec:
schedule: {{ .Values.schedule | quote }}
jobTemplate:
metadata:
labels:
{{- include "heartbeat.labels" . | nindent 8 }}
spec:
activeDeadlineSeconds: {{ .Values.activeDeadlineSeconds }}
backoffLimit: {{ .Values.backoffLimit }}
template:
metadata:
annotations:
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 12 }}
{{- end }}
labels:
{{- include "heartbeat.labels" . | nindent 12 }}
{{- with .Values.podLabels }}
{{- toYaml . | nindent 12 }}
{{- end }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 12 }}
{{- end }}
serviceAccountName: {{ include "heartbeat.serviceAccountName" . }}
restartPolicy: Never
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 12 }}
containers:
- name: heartbeat
securityContext:
{{- toYaml .Values.securityContext | nindent 16 }}
image: "{{ .Values.image }}"
imagePullPolicy: {{ .Values.imagePullPolicy }}
resources:
{{- toYaml .Values.resources | nindent 16 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 12 }}
{{- end }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "heartbeat.fullname" . }}-cluster-role
labels:
{{- include "heartbeat.labels" . | nindent 4 }}
rules:
- apiGroups: [ "" ]
resources: [ "nodes" ]
verbs: [ "get", "list" ]
- apiGroups: [ "" ]
resources: [ "namespaces" ]
resourceNames: [ "kube-system" ]
verbs: [ "get" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "heartbeat.fullname" . }}-cluster-role-binding
labels:
{{- include "heartbeat.labels" . | nindent 4 }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "heartbeat.fullname" . }}-cluster-role
subjects:
- kind: ServiceAccount
name: {{ include "heartbeat.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{{- if .Values.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "heartbeat.serviceAccountName" . }}
labels:
{{- include "heartbeat.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
41 changes: 41 additions & 0 deletions controllers/job/heartbeat/deploy/charts/heartbeat/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Default values for heartbeat cronjob helm chart

schedule: "0 0 * * *"
activeDeadlineSeconds: 600
backoffLimit: 1

image: ghcr.io/labring/sealos-job-heartbeat-controller:latest
imagePullPolicy: Always

imagePullSecrets: []
nameOverride: ""
fullnameOverride: "heartbeat"

serviceAccount:
create: true
automount: true
annotations: {}
name: "heartbeat-cronjob"

podAnnotations: {}
podLabels: {}

podSecurityContext:
runAsNonRoot: false

securityContext:
allowPrivilegeEscalation: false

resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 100m
memory: 64Mi

nodeSelector: {}

tolerations: []

affinity: {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/bash
set -ex

HELM_OPTS=${HELM_OPTS:-""}
RELEASE_NAME=${RELEASE_NAME:-"heartbeat"}
RELEASE_NAMESPACE=${RELEASE_NAMESPACE:-"heartbeat-system"}
CHART_PATH=${CHART_PATH:-"./charts/heartbeat"}

adopt_cluster_resource() {
local kind="$1"
local name="$2"
if kubectl get "${kind}" "${name}" >/dev/null 2>&1; then
kubectl label "${kind}" "${name}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true
kubectl annotate "${kind}" "${name}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true
fi
}

adopt_namespaced_resource() {
local kind="$1"
local name="$2"
if kubectl -n "${RELEASE_NAMESPACE}" get "${kind}" "${name}" >/dev/null 2>&1; then
kubectl -n "${RELEASE_NAMESPACE}" label "${kind}" "${name}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true
kubectl -n "${RELEASE_NAMESPACE}" annotate "${kind}" "${name}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true
fi
}

if ! helm status "${RELEASE_NAME}" -n "${RELEASE_NAMESPACE}" >/dev/null 2>&1; then
if kubectl get namespace "${RELEASE_NAMESPACE}" >/dev/null 2>&1; then
kubectl label namespace "${RELEASE_NAMESPACE}" app.kubernetes.io/managed-by=Helm --overwrite >/dev/null 2>&1 || true
kubectl annotate namespace "${RELEASE_NAMESPACE}" meta.helm.sh/release-name="${RELEASE_NAME}" meta.helm.sh/release-namespace="${RELEASE_NAMESPACE}" --overwrite >/dev/null 2>&1 || true
fi

adopt_namespaced_resource serviceaccount heartbeat-cronjob
adopt_cluster_resource clusterrole heartbeat-cluster-role
adopt_cluster_resource clusterrolebinding heartbeat-cluster-role-binding
fi

helm upgrade -i "${RELEASE_NAME}" -n "${RELEASE_NAMESPACE}" --create-namespace "${CHART_PATH}" ${HELM_OPTS}
66 changes: 0 additions & 66 deletions controllers/job/heartbeat/deploy/manifests/deploy.yaml

This file was deleted.

Loading