Added chart versions:
yugabyte/yugabyte: - 2.18.9 yugabyte/yugaware: - 2.18.9pull/1059/head
parent
454c762f75
commit
5982611810
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
tests
|
|
@ -0,0 +1,22 @@
|
|||
annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB
|
||||
catalog.cattle.io/kube-version: '>=1.18-0'
|
||||
catalog.cattle.io/release-name: yugabyte
|
||||
charts.openshift.io/name: yugabyte
|
||||
apiVersion: v2
|
||||
appVersion: 2.18.9.0-b17
|
||||
description: YugabyteDB is the high-performance distributed SQL database for building
|
||||
global, internet-scale apps.
|
||||
home: https://www.yugabyte.com
|
||||
icon: file://assets/icons/yugabyte.jpg
|
||||
kubeVersion: '>=1.18-0'
|
||||
maintainers:
|
||||
- email: sanketh@yugabyte.com
|
||||
name: Sanketh Indarapu
|
||||
- email: gjalla@yugabyte.com
|
||||
name: Govardhan Reddy Jalla
|
||||
name: yugabyte
|
||||
sources:
|
||||
- https://github.com/yugabyte/yugabyte-db
|
||||
version: 2.18.9
|
|
@ -0,0 +1 @@
|
|||
YugabyteDB can be deployed in various Kubernetes configurations (including single zone, multi-zone and multi-cluster) using this Helm Chart. Detailed documentation is available in [YugabyteDB Docs for Kubernetes Deployments](https://docs.yugabyte.com/latest/deploy/kubernetes/).
|
|
@ -0,0 +1 @@
|
|||
This chart bootstraps an RF3 YugabyteDB version 2.18.9.0-b17 cluster using the Helm Package Manager.
|
|
@ -0,0 +1,14 @@
|
|||
serviceEndpoints:
|
||||
- name: "yb-master-service"
|
||||
type: LoadBalancer
|
||||
app: "yb-master"
|
||||
ports:
|
||||
ui: "7000"
|
||||
|
||||
- name: "yb-tserver-service"
|
||||
type: LoadBalancer
|
||||
app: "yb-tserver"
|
||||
ports:
|
||||
yql-port: "9042"
|
||||
yedis-port: "6379"
|
||||
ysql-port: "5433"
|
|
@ -0,0 +1,24 @@
|
|||
serviceEndpoints:
|
||||
- name: "yb-master-ui"
|
||||
type: LoadBalancer
|
||||
app: "yb-master"
|
||||
ports:
|
||||
ui: "7000"
|
||||
|
||||
- name: "yql-service"
|
||||
type: LoadBalancer
|
||||
app: "yb-tserver"
|
||||
ports:
|
||||
yql-port: "9042"
|
||||
|
||||
- name: "yedis-service"
|
||||
type: LoadBalancer
|
||||
app: "yb-tserver"
|
||||
ports:
|
||||
yedis-port: "6379"
|
||||
|
||||
- name: "ysql-service"
|
||||
type: LoadBalancer
|
||||
app: "yb-tserver"
|
||||
ports:
|
||||
ysql-port: "5433"
|
|
@ -0,0 +1,219 @@
|
|||
#!/usr/bin/python
|
||||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
# This script would generate a kubeconfig for the given servie account
|
||||
# by fetching the cluster information and also add the service account
|
||||
# token for the authentication purpose.
|
||||
|
||||
import argparse
|
||||
from subprocess import check_output
|
||||
from sys import exit
|
||||
import json
|
||||
import base64
|
||||
import tempfile
|
||||
import time
|
||||
import os.path
|
||||
|
||||
|
||||
def run_command(command_args, namespace=None, as_json=True, log_command=True):
|
||||
command = ["kubectl"]
|
||||
if namespace:
|
||||
command.extend(["--namespace", namespace])
|
||||
command.extend(command_args)
|
||||
if as_json:
|
||||
command.extend(["-o", "json"])
|
||||
if log_command:
|
||||
print("Running command: {}".format(" ".join(command)))
|
||||
output = check_output(command)
|
||||
if as_json:
|
||||
return json.loads(output)
|
||||
else:
|
||||
return output.decode("utf8")
|
||||
|
||||
|
||||
def create_sa_token_secret(directory, sa_name, namespace):
|
||||
"""Creates a service account token secret for sa_name in
|
||||
namespace. Returns the name of the secret created.
|
||||
|
||||
Ref:
|
||||
https://k8s.io/docs/concepts/configuration/secret/#service-account-token-secrets
|
||||
|
||||
"""
|
||||
token_secret = {
|
||||
"apiVersion": "v1",
|
||||
"data": {
|
||||
"do-not-delete-used-for-yugabyte-anywhere": "MQ==",
|
||||
},
|
||||
"kind": "Secret",
|
||||
"metadata": {
|
||||
"annotations": {
|
||||
"kubernetes.io/service-account.name": sa_name,
|
||||
},
|
||||
"name": sa_name,
|
||||
},
|
||||
"type": "kubernetes.io/service-account-token",
|
||||
}
|
||||
token_secret_file_name = os.path.join(directory, "token_secret.yaml")
|
||||
with open(token_secret_file_name, "w") as token_secret_file:
|
||||
json.dump(token_secret, token_secret_file)
|
||||
run_command(["apply", "-f", token_secret_file_name], namespace)
|
||||
return sa_name
|
||||
|
||||
|
||||
def get_secret_data(secret, namespace):
|
||||
"""Returns the secret in JSON format if it has ca.crt and token in
|
||||
it, else returns None. It retries 3 times with 1 second timeout
|
||||
for the secret to be populated with this data.
|
||||
|
||||
"""
|
||||
secret_data = None
|
||||
num_retries = 5
|
||||
timeout = 2
|
||||
while True:
|
||||
secret_json = run_command(["get", "secret", secret], namespace)
|
||||
if "ca.crt" in secret_json["data"] and "token" in secret_json["data"]:
|
||||
secret_data = secret_json
|
||||
break
|
||||
|
||||
num_retries -= 1
|
||||
if num_retries == 0:
|
||||
break
|
||||
print(
|
||||
"Secret '{}' is not populated. Sleep {}s, ({} retries left)".format(
|
||||
secret, timeout, num_retries
|
||||
)
|
||||
)
|
||||
time.sleep(timeout)
|
||||
return secret_data
|
||||
|
||||
|
||||
def get_secrets_for_sa(sa_name, namespace):
|
||||
"""Returns a list of all service account token secrets associated
|
||||
with the given sa_name in the namespace.
|
||||
|
||||
"""
|
||||
secrets = run_command(
|
||||
[
|
||||
"get",
|
||||
"secret",
|
||||
"--field-selector",
|
||||
"type=kubernetes.io/service-account-token",
|
||||
"-o",
|
||||
'jsonpath="{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name == "'
|
||||
+ sa_name
|
||||
+ '")].metadata.name}"',
|
||||
],
|
||||
as_json=False,
|
||||
)
|
||||
return secrets.strip('"').split()
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description="Generate KubeConfig with Token")
|
||||
parser.add_argument("-s", "--service_account", help="Service Account name", required=True)
|
||||
parser.add_argument("-n", "--namespace", help="Kubernetes namespace", default="kube-system")
|
||||
parser.add_argument("-c", "--context", help="kubectl context")
|
||||
parser.add_argument("-o", "--output_file", help="output file path")
|
||||
args = vars(parser.parse_args())
|
||||
|
||||
# if the context is not provided we use the current-context
|
||||
context = args["context"]
|
||||
if context is None:
|
||||
context = run_command(["config", "current-context"], args["namespace"], as_json=False)
|
||||
|
||||
cluster_attrs = run_command(
|
||||
["config", "get-contexts", context.strip(), "--no-headers"], args["namespace"], as_json=False
|
||||
)
|
||||
|
||||
cluster_name = cluster_attrs.strip().split()[2]
|
||||
endpoint = run_command(
|
||||
[
|
||||
"config",
|
||||
"view",
|
||||
"-o",
|
||||
'jsonpath="{.clusters[?(@.name =="' + cluster_name + '")].cluster.server}"',
|
||||
],
|
||||
args["namespace"],
|
||||
as_json=False,
|
||||
)
|
||||
service_account_info = run_command(["get", "sa", args["service_account"]], args["namespace"])
|
||||
|
||||
tmpdir = tempfile.TemporaryDirectory()
|
||||
|
||||
# Get the token and ca.crt from service account secret.
|
||||
sa_secrets = list()
|
||||
|
||||
# Get secrets specified in the service account, there can be multiple
|
||||
# of them, and not all are service account token secrets.
|
||||
if "secrets" in service_account_info:
|
||||
sa_secrets = [secret["name"] for secret in service_account_info["secrets"]]
|
||||
|
||||
# Find the existing additional service account token secrets
|
||||
sa_secrets.extend(get_secrets_for_sa(args["service_account"], args["namespace"]))
|
||||
|
||||
secret_data = None
|
||||
for secret in sa_secrets:
|
||||
secret_data = get_secret_data(secret, args["namespace"])
|
||||
if secret_data is not None:
|
||||
break
|
||||
|
||||
# Kubernetes 1.22+ doesn't create the service account token secret by
|
||||
# default, we have to create one.
|
||||
if secret_data is None:
|
||||
print("No usable secret found for '{}', creating one.".format(args["service_account"]))
|
||||
token_secret = create_sa_token_secret(tmpdir.name, args["service_account"], args["namespace"])
|
||||
secret_data = get_secret_data(token_secret, args["namespace"])
|
||||
if secret_data is None:
|
||||
exit(
|
||||
"Failed to generate kubeconfig: No usable credentials found for '{}'.".format(
|
||||
args["service_account"]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
context_name = "{}-{}".format(args["service_account"], cluster_name)
|
||||
kube_config = args["output_file"]
|
||||
if not kube_config:
|
||||
kube_config = "/tmp/{}.conf".format(args["service_account"])
|
||||
|
||||
|
||||
ca_crt_file_name = os.path.join(tmpdir.name, "ca.crt")
|
||||
ca_crt_file = open(ca_crt_file_name, "wb")
|
||||
ca_crt_file.write(base64.b64decode(secret_data["data"]["ca.crt"]))
|
||||
ca_crt_file.close()
|
||||
|
||||
# create kubeconfig entry
|
||||
set_cluster_cmd = [
|
||||
"config",
|
||||
"set-cluster",
|
||||
cluster_name,
|
||||
"--kubeconfig={}".format(kube_config),
|
||||
"--server={}".format(endpoint.strip('"')),
|
||||
"--embed-certs=true",
|
||||
"--certificate-authority={}".format(ca_crt_file_name),
|
||||
]
|
||||
run_command(set_cluster_cmd, as_json=False)
|
||||
|
||||
user_token = base64.b64decode(secret_data["data"]["token"]).decode("utf-8")
|
||||
set_credentials_cmd = [
|
||||
"config",
|
||||
"set-credentials",
|
||||
context_name,
|
||||
"--token={}".format(user_token),
|
||||
"--kubeconfig={}".format(kube_config),
|
||||
]
|
||||
run_command(set_credentials_cmd, as_json=False, log_command=False)
|
||||
|
||||
set_context_cmd = [
|
||||
"config",
|
||||
"set-context",
|
||||
context_name,
|
||||
"--cluster={}".format(cluster_name),
|
||||
"--user={}".format(context_name),
|
||||
"--kubeconfig={}".format(kube_config),
|
||||
]
|
||||
run_command(set_context_cmd, as_json=False)
|
||||
|
||||
use_context_cmd = ["config", "use-context", context_name, "--kubeconfig={}".format(kube_config)]
|
||||
run_command(use_context_cmd, as_json=False)
|
||||
|
||||
print("Generated the kubeconfig file: {}".format(kube_config))
|
|
@ -0,0 +1,4 @@
|
|||
# OCP compatible values for yugabyte
|
||||
|
||||
Image:
|
||||
repository: "quay.io/yugabyte/yugabyte-ubi"
|
|
@ -0,0 +1,174 @@
|
|||
---
|
||||
questions:
|
||||
## Default images for yugabyte
|
||||
- variable: questions.defaultYugabyteDB
|
||||
default: true
|
||||
description: "Use default settings for YugabyteDB"
|
||||
label: Use default
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "YugabyteDB"
|
||||
subquestions:
|
||||
- variable: Image.repository
|
||||
default: "yugabytedb/yugabyte"
|
||||
required: true
|
||||
type: string
|
||||
label: YugabyteDB image repository
|
||||
description: "YugabyteDB image repository"
|
||||
- variable: Image.tag
|
||||
default: "2.5.1.0-b153"
|
||||
required: true
|
||||
type: string
|
||||
label: YugabyteDB image tag
|
||||
description: "YugabyteDB image tag"
|
||||
- variable: Image.pullPolicy
|
||||
default: "IfNotPresent"
|
||||
required: false
|
||||
type: enum
|
||||
options:
|
||||
- "Always"
|
||||
- "IfNotPresent"
|
||||
label: YugabyteDB image pull policy
|
||||
description: "YugabyteDB image pull policy"
|
||||
- variable: storage.ephemeral
|
||||
default: false
|
||||
required: false
|
||||
type: boolean
|
||||
label: YugabyteDB ephemeral storage
|
||||
description: "Won't allocate PVs when true"
|
||||
- variable: replicas.master
|
||||
default: 3
|
||||
description: "Number of replicas for Master"
|
||||
type: int
|
||||
required: true
|
||||
label: Replication Factor Master
|
||||
- variable: replicas.tserver
|
||||
default: 3
|
||||
description: "Number of replicas for TServer"
|
||||
type: int
|
||||
required: true
|
||||
label: Replication Factor TServer
|
||||
- variable: statefulSetAnnotations
|
||||
description: Annotations for the StatefulSet
|
||||
type: dict
|
||||
required: false
|
||||
label: "Annotations for the StatefulSet"
|
||||
- variable: questions.defaultMasterStorage
|
||||
default: true
|
||||
description: "Use default storage configurations for YugabyteDB Master"
|
||||
label: Use default storage configurations
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Master Storage"
|
||||
subquestions:
|
||||
- variable: storage.master.count
|
||||
default: 2
|
||||
required: true
|
||||
type: int
|
||||
label: YugabyteDB master storage disk count
|
||||
description: "YugabyteDB master storage disk count"
|
||||
- variable: storage.master.size
|
||||
default: "10Gi"
|
||||
required: true
|
||||
type: string
|
||||
label: YugabyteDB master storage size
|
||||
description: "YugabyteDB master storage size"
|
||||
- variable: storage.master.storageClass
|
||||
default: ""
|
||||
required: false
|
||||
type: storageclass
|
||||
label: YugabyteDB master storage class
|
||||
description: "YugabyteDB master storage class"
|
||||
- variable: questions.defaultTServerStorage
|
||||
default: true
|
||||
description: "Use default storage configurations for YugabyteDB TServer"
|
||||
label: Use default storage configuration
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "TServer Storage"
|
||||
subquestions:
|
||||
- variable: storage.tserver.count
|
||||
default: 2
|
||||
required: true
|
||||
type: int
|
||||
label: YugabyteDB TServer storage disk count
|
||||
description: "YugabyteDB TServer storage disk count"
|
||||
- variable: storage.tserver.size
|
||||
default: "10Gi"
|
||||
required: true
|
||||
type: string
|
||||
label: YugabyteDB TServer storage size
|
||||
description: "YugabyteDB TServer storage size"
|
||||
- variable: storage.tserver.storageClass
|
||||
default: ""
|
||||
required: false
|
||||
type: storageclass
|
||||
label: YugabyteDB TServer storage class
|
||||
description: "YugabyteDB TServer storage class"
|
||||
## Default resources
|
||||
- variable: questions.defaultResources
|
||||
default: true
|
||||
description: "Use default resources for YugabyteDB"
|
||||
label: Use default resources
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Resources"
|
||||
subquestions:
|
||||
- variable: resource.master.requests.cpu
|
||||
default: "2"
|
||||
description: "Master vcpu allocation for YugabyteDB"
|
||||
type: string
|
||||
required: true
|
||||
label: vcpu allocation for master
|
||||
- variable: resource.master.requests.memory
|
||||
default: "2Gi"
|
||||
description: "Master RAM allocation for YugabyteDB"
|
||||
type: string
|
||||
required: true
|
||||
label: RAM allocation for master
|
||||
- variable: resource.tserver.requests.cpu
|
||||
default: "2"
|
||||
description: "TServer vcpu allocation for YugabyteDB"
|
||||
type: string
|
||||
required: true
|
||||
label: vcpu allocation for tserver
|
||||
- variable: resource.tserver.requests.memory
|
||||
default: "4Gi"
|
||||
description: "TServer RAM allocation for YugabyteDB"
|
||||
type: string
|
||||
required: true
|
||||
label: RAM allocation for tserver
|
||||
## TLS
|
||||
- variable: tls.enabled
|
||||
default: false
|
||||
description: "Enable TLS - TLS disabled by default"
|
||||
label: Enable TLS
|
||||
type: boolean
|
||||
show_subquestion_if: true
|
||||
group: "TLS"
|
||||
subquestions:
|
||||
- variable: tls.nodeToNode
|
||||
default: true
|
||||
description: "Node to Node"
|
||||
type: boolean
|
||||
required: false
|
||||
label: Node to Node
|
||||
- variable: tls.clientToServer
|
||||
default: true
|
||||
description: "Client to server"
|
||||
type: boolean
|
||||
required: false
|
||||
label: Client to server
|
||||
- variable: tls.insecure
|
||||
default: false
|
||||
description: "Insecure - no service will connect on unencrypted connection"
|
||||
type: boolean
|
||||
required: false
|
||||
label: Insecure communication
|
||||
- variable: tls.certManager.enabled
|
||||
default: false
|
||||
description: "Use cert-manager to provide cluster certificates"
|
||||
type: boolean
|
||||
required: false
|
||||
label: Cert-Manager Support
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
1. Get YugabyteDB Pods by running this command:
|
||||
kubectl --namespace {{ .Release.Namespace }} get pods
|
||||
|
||||
2. Get list of YugabyteDB services that are running:
|
||||
kubectl --namespace {{ .Release.Namespace }} get services
|
||||
|
||||
3. Get information about the load balancer services:
|
||||
kubectl get svc --namespace {{ .Release.Namespace }}
|
||||
|
||||
4. Connect to one of the tablet server:
|
||||
kubectl exec --namespace {{ .Release.Namespace }} -it yb-tserver-0 bash
|
||||
|
||||
5. Run YSQL shell from inside of a tablet server:
|
||||
kubectl exec --namespace {{ .Release.Namespace }} -it yb-tserver-0 -- /home/yugabyte/bin/ysqlsh -h yb-tserver-0.yb-tservers.{{ .Release.Namespace }}
|
||||
|
||||
6. Cleanup YugabyteDB Pods
|
||||
For helm 2:
|
||||
helm delete {{ .Release.Name }} --purge
|
||||
For helm 3:
|
||||
helm delete {{ .Release.Name }} -n {{ .Release.Namespace }}
|
||||
NOTE: You need to manually delete the persistent volume
|
||||
{{- $root := . -}}
|
||||
{{- range .Values.Services }}
|
||||
kubectl delete pvc --namespace {{ $root.Release.Namespace }} -l app={{.label}}
|
||||
{{- end }}
|
|
@ -0,0 +1,415 @@
|
|||
{{/* vim: set filetype=mustache: */}}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
The components in this chart create additional resources that expand the longest created name strings.
|
||||
The longest name that gets created of 20 characters, so truncation should be 63-20=43.
|
||||
*/}}
|
||||
{{- define "yugabyte.fullname" -}}
|
||||
{{- if .Values.fullnameOverride -}}
|
||||
{{- .Values.fullnameOverride | trunc 43 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||
{{- if contains $name .Release.Name -}}
|
||||
{{- .Release.Name | trunc 43 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 43 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate common labels.
|
||||
*/}}
|
||||
{{- define "yugabyte.labels" }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: {{ .Chart.Name | quote }}
|
||||
component: {{ .Values.Component | quote }}
|
||||
{{- if .Values.commonLabels}}
|
||||
{{ toYaml .Values.commonLabels }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Generate app label.
|
||||
*/}}
|
||||
{{- define "yugabyte.applabel" }}
|
||||
{{- if .root.Values.oldNamingStyle }}
|
||||
app: "{{ .label }}"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "{{ .label }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Generate app selector.
|
||||
*/}}
|
||||
{{- define "yugabyte.appselector" }}
|
||||
{{- if .root.Values.oldNamingStyle }}
|
||||
app: "{{ .label }}"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "{{ .label }}"
|
||||
release: {{ .root.Release.Name | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create secrets in DBNamespace from other namespaces by iterating over envSecrets.
|
||||
*/}}
|
||||
{{- define "yugabyte.envsecrets" -}}
|
||||
{{- range $v := .secretenv }}
|
||||
{{- if $v.valueFrom.secretKeyRef.namespace }}
|
||||
{{- $secretObj := (lookup
|
||||
"v1"
|
||||
"Secret"
|
||||
$v.valueFrom.secretKeyRef.namespace
|
||||
$v.valueFrom.secretKeyRef.name)
|
||||
| default dict }}
|
||||
{{- $secretData := (get $secretObj "data") | default dict }}
|
||||
{{- $secretValue := (get $secretData $v.valueFrom.secretKeyRef.key) | default "" }}
|
||||
{{- if (and (not $secretValue) (not $v.valueFrom.secretKeyRef.optional)) }}
|
||||
{{- required (printf "Secret or key missing for %s/%s in namespace: %s"
|
||||
$v.valueFrom.secretKeyRef.name
|
||||
$v.valueFrom.secretKeyRef.key
|
||||
$v.valueFrom.secretKeyRef.namespace)
|
||||
nil }}
|
||||
{{- end }}
|
||||
{{- if $secretValue }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
{{- $secretfullname := printf "%s-%s-%s-%s"
|
||||
$.root.Release.Name
|
||||
$v.valueFrom.secretKeyRef.namespace
|
||||
$v.valueFrom.secretKeyRef.name
|
||||
$v.valueFrom.secretKeyRef.key
|
||||
}}
|
||||
name: {{ printf "%s-%s-%s-%s-%s-%s"
|
||||
$.root.Release.Name
|
||||
($v.valueFrom.secretKeyRef.namespace | substr 0 5)
|
||||
($v.valueFrom.secretKeyRef.name | substr 0 5)
|
||||
( $v.valueFrom.secretKeyRef.key | substr 0 5)
|
||||
(sha256sum $secretfullname | substr 0 4)
|
||||
($.suffix)
|
||||
| lower | replace "." "" | replace "_" ""
|
||||
}}
|
||||
namespace: "{{ $.root.Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.labels" $.root | indent 4 }}
|
||||
type: Opaque # should it be an Opaque secret?
|
||||
data:
|
||||
{{ $v.valueFrom.secretKeyRef.key }}: {{ $secretValue | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Add env secrets to DB statefulset.
|
||||
*/}}
|
||||
{{- define "yugabyte.addenvsecrets" -}}
|
||||
{{- range $v := .secretenv }}
|
||||
- name: {{ $v.name }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
{{- if $v.valueFrom.secretKeyRef.namespace }}
|
||||
{{- $secretfullname := printf "%s-%s-%s-%s"
|
||||
$.root.Release.Name
|
||||
$v.valueFrom.secretKeyRef.namespace
|
||||
$v.valueFrom.secretKeyRef.name
|
||||
$v.valueFrom.secretKeyRef.key
|
||||
}}
|
||||
name: {{ printf "%s-%s-%s-%s-%s-%s"
|
||||
$.root.Release.Name
|
||||
($v.valueFrom.secretKeyRef.namespace | substr 0 5)
|
||||
($v.valueFrom.secretKeyRef.name | substr 0 5)
|
||||
($v.valueFrom.secretKeyRef.key | substr 0 5)
|
||||
(sha256sum $secretfullname | substr 0 4)
|
||||
($.suffix)
|
||||
| lower | replace "." "" | replace "_" ""
|
||||
}}
|
||||
{{- else }}
|
||||
name: {{ $v.valueFrom.secretKeyRef.name }}
|
||||
{{- end }}
|
||||
key: {{ $v.valueFrom.secretKeyRef.key }}
|
||||
optional: {{ $v.valueFrom.secretKeyRef.optional | default "false" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{/*
|
||||
Create Volume name.
|
||||
*/}}
|
||||
{{- define "yugabyte.volume_name" -}}
|
||||
{{- printf "%s-datadir" (include "yugabyte.fullname" .) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Derive the memory hard limit for each POD based on the memory limit.
|
||||
Since the memory is represented in <x>GBi, we use this function to convert that into bytes.
|
||||
Multiplied by 870 since 0.85 * 1024 ~ 870 (floating calculations not supported).
|
||||
*/}}
|
||||
{{- define "yugabyte.memory_hard_limit" -}}
|
||||
{{- printf "%d" .limits.memory | regexFind "\\d+" | mul 1024 | mul 1024 | mul 870 -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "yugabyte.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate a preflight check script invocation.
|
||||
*/}}
|
||||
{{- define "yugabyte.preflight_check" -}}
|
||||
{{- if not .Values.preflight.skipAll -}}
|
||||
{{- $port := .Preflight.Port -}}
|
||||
{{- range $addr := split "," .Preflight.Addr -}}
|
||||
if [ -f /home/yugabyte/tools/k8s_preflight.py ]; then
|
||||
PYTHONUNBUFFERED="true" /home/yugabyte/tools/k8s_preflight.py \
|
||||
dnscheck \
|
||||
--addr="{{ $addr }}" \
|
||||
{{- if not $.Values.preflight.skipBind }}
|
||||
--port="{{ $port }}"
|
||||
{{- else }}
|
||||
--skip_bind
|
||||
{{- end }}
|
||||
fi && \
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Get YugaByte fs data directories.
|
||||
*/}}
|
||||
{{- define "yugabyte.fs_data_dirs" -}}
|
||||
{{- range $index := until (int (.count)) -}}
|
||||
{{- if ne $index 0 }},{{ end }}/mnt/disk{{ $index -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Get files from fs data directories for readiness / liveness probes.
|
||||
*/}}
|
||||
{{- define "yugabyte.fs_data_dirs_probe_files" -}}
|
||||
{{- range $index := until (int (.count)) -}}
|
||||
{{- if ne $index 0 }} {{ end }}"/mnt/disk{{ $index -}}/disk.check"
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
{{/*
|
||||
Command to do a disk write and sync for liveness probes.
|
||||
*/}}
|
||||
{{- define "yugabyte.fs_data_dirs_probe" -}}
|
||||
echo "disk check at: $(date)" \
|
||||
| tee {{ template "yugabyte.fs_data_dirs_probe_files" . }} \
|
||||
&& sync {{ template "yugabyte.fs_data_dirs_probe_files" . }}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
{{/*
|
||||
Generate server FQDN.
|
||||
*/}}
|
||||
{{- define "yugabyte.server_fqdn" -}}
|
||||
{{- if .Values.multicluster.createServicePerPod -}}
|
||||
{{- printf "$(HOSTNAME).$(NAMESPACE).svc.%s" .Values.domainName -}}
|
||||
{{- else if (and .Values.oldNamingStyle .Values.multicluster.createServiceExports) -}}
|
||||
{{ $membershipName := required "A valid membership name is required! Please set multicluster.kubernetesClusterId" .Values.multicluster.kubernetesClusterId }}
|
||||
{{- printf "$(HOSTNAME).%s.%s.$(NAMESPACE).svc.clusterset.local" $membershipName .Service.name -}}
|
||||
{{- else if .Values.oldNamingStyle -}}
|
||||
{{- printf "$(HOSTNAME).%s.$(NAMESPACE).svc.%s" .Service.name .Values.domainName -}}
|
||||
{{- else -}}
|
||||
{{- if .Values.multicluster.createServiceExports -}}
|
||||
{{ $membershipName := required "A valid membership name is required! Please set multicluster.kubernetesClusterId" .Values.multicluster.kubernetesClusterId }}
|
||||
{{- printf "$(HOSTNAME).%s.%s-%s.$(NAMESPACE).svc.clusterset.local" $membershipName (include "yugabyte.fullname" .) .Service.name -}}
|
||||
{{- else -}}
|
||||
{{- printf "$(HOSTNAME).%s-%s.$(NAMESPACE).svc.%s" (include "yugabyte.fullname" .) .Service.name .Values.domainName -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate server broadcast address.
|
||||
*/}}
|
||||
{{- define "yugabyte.server_broadcast_address" -}}
|
||||
{{- include "yugabyte.server_fqdn" . }}:{{ index .Service.ports "tcp-rpc-port" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate server RPC bind address.
|
||||
|
||||
In case of multi-cluster services (MCS), we set it to $(POD_IP) to
|
||||
ensure YCQL uses a resolvable address.
|
||||
See https://github.com/yugabyte/yugabyte-db/issues/16155
|
||||
|
||||
We use a workaround for above in case of Istio by setting it to
|
||||
$(POD_IP) and localhost. Master doesn't support that combination, so
|
||||
we stick to 0.0.0.0, which works for master.
|
||||
*/}}
|
||||
{{- define "yugabyte.rpc_bind_address" -}}
|
||||
{{- $port := index .Service.ports "tcp-rpc-port" -}}
|
||||
{{- if .Values.istioCompatibility.enabled -}}
|
||||
{{- if (eq .Service.name "yb-masters") -}}
|
||||
0.0.0.0:{{ $port }}
|
||||
{{- else -}}
|
||||
$(POD_IP):{{ $port }},127.0.0.1:{{ $port }}
|
||||
{{- end -}}
|
||||
{{- else if (or .Values.multicluster.createServiceExports .Values.multicluster.createServicePerPod) -}}
|
||||
$(POD_IP):{{ $port }}
|
||||
{{- else -}}
|
||||
{{- include "yugabyte.server_fqdn" . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate server web interface.
|
||||
*/}}
|
||||
{{- define "yugabyte.webserver_interface" -}}
|
||||
{{- eq .Values.ip_version_support "v6_only" | ternary "[::]" "0.0.0.0" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate server CQL proxy bind address.
|
||||
*/}}
|
||||
{{- define "yugabyte.cql_proxy_bind_address" -}}
|
||||
{{- if or .Values.istioCompatibility.enabled .Values.multicluster.createServiceExports .Values.multicluster.createServicePerPod -}}
|
||||
0.0.0.0:{{ index .Service.ports "tcp-yql-port" -}}
|
||||
{{- else -}}
|
||||
{{- include "yugabyte.server_fqdn" . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate server PGSQL proxy bind address.
|
||||
*/}}
|
||||
{{- define "yugabyte.pgsql_proxy_bind_address" -}}
|
||||
{{- eq .Values.ip_version_support "v6_only" | ternary "[::]" "0.0.0.0" -}}:{{ index .Service.ports "tcp-ysql-port" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Get YugaByte master addresses
|
||||
*/}}
|
||||
{{- define "yugabyte.master_addresses" -}}
|
||||
{{- $master_replicas := .Values.replicas.master | int -}}
|
||||
{{- $domain_name := .Values.domainName -}}
|
||||
{{- $newNamingStylePrefix := printf "%s-" (include "yugabyte.fullname" .) -}}
|
||||
{{- $prefix := ternary "" $newNamingStylePrefix $.Values.oldNamingStyle -}}
|
||||
{{- range .Values.Services -}}
|
||||
{{- if eq .name "yb-masters" -}}
|
||||
{{- range $index := until $master_replicas -}}
|
||||
{{- if ne $index 0 }},{{ end -}}
|
||||
{{- $prefix }}yb-master-{{ $index }}.{{ $prefix }}yb-masters.$(NAMESPACE).svc.{{ $domain_name }}:7100
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Compute the maximum number of unavailable pods based on the number of master replicas
|
||||
*/}}
|
||||
{{- define "yugabyte.max_unavailable_for_quorum" -}}
|
||||
{{- $master_replicas_100x := .Values.replicas.master | int | mul 100 -}}
|
||||
{{- $max_unavailable_master_replicas := 100 | div (100 | sub (2 | div ($master_replicas_100x | add 100))) -}}
|
||||
{{- printf "%d" $max_unavailable_master_replicas -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Set consistent issuer name.
|
||||
*/}}
|
||||
{{- define "yugabyte.tls_cm_issuer" -}}
|
||||
{{- if .Values.tls.certManager.bootstrapSelfsigned -}}
|
||||
{{ .Values.oldNamingStyle | ternary "yugabyte-selfsigned" (printf "%s-selfsigned" (include "yugabyte.fullname" .)) }}
|
||||
{{- else -}}
|
||||
{{ .Values.tls.certManager.useClusterIssuer | ternary .Values.tls.certManager.clusterIssuer .Values.tls.certManager.issuer}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Verify the extraVolumes and extraVolumeMounts mappings.
|
||||
Every extraVolumes should have extraVolumeMounts
|
||||
*/}}
|
||||
{{- define "yugabyte.isExtraVolumesMappingExists" -}}
|
||||
{{- $lenExtraVolumes := len .extraVolumes -}}
|
||||
{{- $lenExtraVolumeMounts := len .extraVolumeMounts -}}
|
||||
|
||||
{{- if and (eq $lenExtraVolumeMounts 0) (gt $lenExtraVolumes 0) -}}
|
||||
{{- fail "You have not provided the extraVolumeMounts for extraVolumes." -}}
|
||||
{{- else if and (eq $lenExtraVolumes 0) (gt $lenExtraVolumeMounts 0) -}}
|
||||
{{- fail "You have not provided the extraVolumes for extraVolumeMounts." -}}
|
||||
{{- else if and (gt $lenExtraVolumes 0) (gt $lenExtraVolumeMounts 0) -}}
|
||||
{{- $volumeMountsList := list -}}
|
||||
{{- range .extraVolumeMounts -}}
|
||||
{{- $volumeMountsList = append $volumeMountsList .name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $volumesList := list -}}
|
||||
{{- range .extraVolumes -}}
|
||||
{{- $volumesList = append $volumesList .name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- range $volumesList -}}
|
||||
{{- if not (has . $volumeMountsList) -}}
|
||||
{{- fail (printf "You have not provided the extraVolumeMounts for extraVolume %s" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- range $volumeMountsList -}}
|
||||
{{- if not (has . $volumesList) -}}
|
||||
{{- fail (printf "You have not provided the extraVolumes for extraVolumeMounts %s" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Default nodeAffinity for multi-az deployments
|
||||
*/}}
|
||||
{{- define "yugabyte.multiAZNodeAffinity" -}}
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
nodeSelectorTerms:
|
||||
- matchExpressions:
|
||||
- key: failure-domain.beta.kubernetes.io/zone
|
||||
operator: In
|
||||
values:
|
||||
- {{ quote .Values.AZ }}
|
||||
- matchExpressions:
|
||||
- key: topology.kubernetes.io/zone
|
||||
operator: In
|
||||
values:
|
||||
- {{ quote .Values.AZ }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Default podAntiAffinity for master and tserver
|
||||
|
||||
This requires "appLabelArgs" to be passed in - defined in service.yaml
|
||||
we have a .root and a .label in appLabelArgs
|
||||
*/}}
|
||||
{{- define "yugabyte.podAntiAffinity" -}}
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- weight: 100
|
||||
podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
{{- if .root.Values.oldNamingStyle }}
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- "{{ .label }}"
|
||||
{{- else }}
|
||||
- key: app.kubernetes.io/name
|
||||
operator: In
|
||||
values:
|
||||
- "{{ .label }}"
|
||||
- key: release
|
||||
operator: In
|
||||
values:
|
||||
- {{ .root.Release.Name | quote }}
|
||||
{{- end }}
|
||||
topologyKey: kubernetes.io/hostname
|
||||
{{- end -}}
|
|
@ -0,0 +1,150 @@
|
|||
{{- $root := . -}}
|
||||
---
|
||||
{{- if $root.Values.tls.certManager.enabled }}
|
||||
{{- if $root.Values.tls.certManager.bootstrapSelfsigned }}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: {{ (printf "%s-bootstrap" (include "yugabyte.tls_cm_issuer" $root)) | quote }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
spec:
|
||||
selfSigned: {}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary "yugabyte-ca" (printf "%s-ca" (include "yugabyte.fullname" $root)) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
spec:
|
||||
isCA: true
|
||||
privateKey:
|
||||
algorithm: {{ $root.Values.tls.certManager.certificates.algorithm | quote }}
|
||||
encoding: PKCS8
|
||||
size: {{ $root.Values.tls.certManager.certificates.keySize }}
|
||||
commonName: Yugabyte Selfsigned CA
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary "yugabyte-ca" (printf "%s-ca" (include "yugabyte.fullname" $root)) }}
|
||||
issuerRef:
|
||||
name: {{ (printf "%s-bootstrap" (include "yugabyte.tls_cm_issuer" $root)) | quote }}
|
||||
kind: Issuer
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: {{ include "yugabyte.tls_cm_issuer" $root | quote }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
spec:
|
||||
ca:
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary "yugabyte-ca" (printf "%s-ca" (include "yugabyte.fullname" $root)) }}
|
||||
---
|
||||
{{- else }}
|
||||
{{/* when bootstrapSelfsigned = false, ie. when using an external CA.
|
||||
Create a Secret with just the rootCA.cert value and mount into master/tserver pods.
|
||||
This will be used as a fall back in case the Secret generated by cert-manager does not
|
||||
have a root ca.crt. This can happen for certain certificate issuers like LetsEncrypt.
|
||||
*/}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ printf "%s-root-ca" (include "yugabyte.fullname" $root) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
ca.crt: {{ $root.Values.tls.rootCA.cert }}
|
||||
---
|
||||
{{- end }}
|
||||
|
||||
|
||||
{{/*
|
||||
The below Certificate resource will trigger cert-manager to issue crt/key into Secrets.
|
||||
These secrets are mounted into master/tserver pods.
|
||||
*/}}
|
||||
{{- range .Values.Services }}
|
||||
{{- $service := . -}}
|
||||
{{- $appLabelArgs := dict "label" .label "root" $root -}}
|
||||
{{- $serviceValues := (dict "Service" $service "Values" $root.Values "Chart" $root.Chart "Release" $root.Release) -}}
|
||||
{{- $replicas := (eq .name "yb-masters") | ternary $root.Values.replicas.master $root.Values.replicas.tserver -}}
|
||||
|
||||
{{- if (gt (int $replicas) 0) }}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" $service.label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) $service.label) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
spec:
|
||||
secretTemplate:
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 6 }}
|
||||
{{- include "yugabyte.labels" $root | indent 6 }}
|
||||
issuerRef:
|
||||
name: {{ include "yugabyte.tls_cm_issuer" $root | quote }}
|
||||
{{- if $root.Values.tls.certManager.useClusterIssuer }}
|
||||
kind: ClusterIssuer
|
||||
{{- else }}
|
||||
kind: Issuer
|
||||
{{- end }}
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" $service.label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) $service.label) }}
|
||||
duration: {{ $root.Values.tls.certManager.certificates.duration | quote }}
|
||||
renewBefore: {{ $root.Values.tls.certManager.certificates.renewBefore | quote }}
|
||||
isCA: false
|
||||
privateKey:
|
||||
algorithm: {{ $root.Values.tls.certManager.certificates.algorithm | quote }}
|
||||
encoding: PKCS8
|
||||
size: {{ $root.Values.tls.certManager.certificates.keySize }}
|
||||
rotationPolicy: Always
|
||||
usages:
|
||||
- server auth
|
||||
- client auth
|
||||
# At least one of a DNS Name, URI, or IP address is required.
|
||||
dnsNames:
|
||||
{{- range $index := until ( int ( $replicas ) ) }}
|
||||
{{- $nodeOldStyle := printf "%s-%d.%s.%s.svc.%s" $service.label $index $service.name $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- $nodeNewStyle := printf "%s-%s-%d.%s-%s.%s.svc.%s" (include "yugabyte.fullname" $root) $service.label $index (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- $node := $root.Values.oldNamingStyle | ternary $nodeOldStyle $nodeNewStyle }}
|
||||
- {{$node}}
|
||||
{{- end }}
|
||||
- {{ printf "%s-%s.%s.svc.%s" (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace $root.Values.domainName }}
|
||||
uris: []
|
||||
ipAddresses: []
|
||||
---
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
spec:
|
||||
secretTemplate:
|
||||
labels:
|
||||
{{- include "yugabyte.labels" $root | indent 6 }}
|
||||
issuerRef:
|
||||
name: {{ include "yugabyte.tls_cm_issuer" $root | quote }}
|
||||
{{- if $root.Values.tls.certManager.useClusterIssuer }}
|
||||
kind: ClusterIssuer
|
||||
{{- else }}
|
||||
kind: Issuer
|
||||
{{- end }}
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
duration: {{ $root.Values.tls.certManager.certificates.duration | quote }}
|
||||
renewBefore: {{ $root.Values.tls.certManager.certificates.renewBefore | quote }}
|
||||
commonName: yugabyte
|
||||
isCA: false
|
||||
privateKey:
|
||||
algorithm: {{ $root.Values.tls.certManager.certificates.algorithm | quote }}
|
||||
encoding: PKCS8
|
||||
size: {{ $root.Values.tls.certManager.certificates.keySize }}
|
||||
rotationPolicy: Always
|
||||
usages:
|
||||
- client auth
|
||||
dnsNames: []
|
||||
uris: []
|
||||
ipAddresses: []
|
||||
---
|
||||
{{- end }}
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-master-hooks
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
data:
|
||||
{{- range $index := until ( int ( .Values.replicas.master ) ) }}
|
||||
yb-master-{{.}}-pre_debug_hook.sh: "echo 'hello-from-pre' "
|
||||
yb-master-{{.}}-post_debug_hook.sh: "echo 'hello-from-post' "
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-tserver-hooks
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
data:
|
||||
{{- range $index := until ( int ( .Values.replicas.tserver) ) }}
|
||||
yb-tserver-{{.}}-pre_debug_hook.sh: "echo 'hello-from-pre' "
|
||||
yb-tserver-{{.}}-post_debug_hook.sh: "echo 'hello-from-post' "
|
||||
{{- end }}
|
||||
---
|
|
@ -0,0 +1,80 @@
|
|||
{{- if or .Values.authCredentials.ycql.user .Values.authCredentials.ycql.password .Values.authCredentials.ycql.keyspace .Values.authCredentials.ysql.password .Values.authCredentials.ysql.user .Values.authCredentials.ysql.database }}
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-setup-credentials
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
labels:
|
||||
app: "setup-credentials"
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: "{{ .Chart.Name }}"
|
||||
component: "{{ .Values.Component }}"
|
||||
annotations:
|
||||
"helm.sh/hook": post-install
|
||||
"helm.sh/hook-weight": "0"
|
||||
"helm.sh/hook-delete-policy": hook-succeeded
|
||||
spec:
|
||||
backoffLimit: 2
|
||||
template:
|
||||
metadata:
|
||||
name: "setup-credentials"
|
||||
labels:
|
||||
app: "setup-credentials"
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: "{{ .Chart.Name }}"
|
||||
component: "{{ .Values.Component }}"
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
containers:
|
||||
- name: setup-credentials
|
||||
image: "{{ .Values.Image.repository }}:{{ .Values.Image.tag }}"
|
||||
env:
|
||||
{{- if .Values.authCredentials.ysql.user }}
|
||||
- name: YSQL_USER
|
||||
value: "{{ .Values.authCredentials.ysql.user }}"
|
||||
{{- end }}
|
||||
{{- if .Values.authCredentials.ysql.password }}
|
||||
- name: YSQL_PASSWORD
|
||||
value: "{{ .Values.authCredentials.ysql.password }}"
|
||||
{{- end }}
|
||||
{{- if .Values.authCredentials.ysql.database }}
|
||||
- name: YSQL_DB
|
||||
value: "{{ .Values.authCredentials.ysql.database }}"
|
||||
{{- end }}
|
||||
{{- if .Values.authCredentials.ycql.user }}
|
||||
- name: YCQL_USER
|
||||
value: "{{ .Values.authCredentials.ycql.user }}"
|
||||
{{- end }}
|
||||
{{- if .Values.authCredentials.ycql.password }}
|
||||
- name: YCQL_PASSWORD
|
||||
value: "{{ .Values.authCredentials.ycql.password }}"
|
||||
{{- end }}
|
||||
{{- if .Values.authCredentials.ycql.keyspace }}
|
||||
- name: YCQL_KEYSPACE
|
||||
value: "{{ .Values.authCredentials.ycql.keyspace }}"
|
||||
{{- end }}
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: SSL_CERTFILE
|
||||
value: "/root/.yugabytedb/root.crt"
|
||||
{{- end }}
|
||||
command:
|
||||
- 'bash'
|
||||
- '/home/yugabyte/bin/setup-credentials/setup-credentials.sh'
|
||||
volumeMounts:
|
||||
- name: setup-credentials-script
|
||||
mountPath: "/home/yugabyte/bin/setup-credentials"
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: yugabyte-tls-client-cert
|
||||
mountPath: "/root/.yugabytedb/"
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: setup-credentials-script
|
||||
configMap:
|
||||
name: {{ include "yugabyte.fullname" . }}-setup-credentials-script
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: yugabyte-tls-client-cert
|
||||
secret:
|
||||
secretName: yugabyte-tls-client-cert
|
||||
defaultMode: 256
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,51 @@
|
|||
{{- if and .Values.serviceMonitor.enabled .Values.serviceMonitor.master.enabled }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-yb-master
|
||||
labels:
|
||||
{{- if .Values.oldNamingStyle }}
|
||||
app: "yb-master"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "yb-master"
|
||||
{{- end }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: "{{ .Chart.Name }}"
|
||||
component: "{{ .Values.Component }}"
|
||||
{{- with .Values.serviceMonitor.extraLabels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
jobLabel: "release"
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- if .Values.oldNamingStyle }}
|
||||
app: "yb-master"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "yb-master"
|
||||
{{- end }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
service-type: "headless"
|
||||
endpoints:
|
||||
|
||||
{{- with .Values.serviceMonitor.master }}
|
||||
{{- if .enabled }}
|
||||
- port: {{ .port }}
|
||||
path: {{ .path }}
|
||||
{{- if .interval }}
|
||||
interval: {{ .interval }}
|
||||
{{- else }}
|
||||
interval: {{ $.Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
relabelings:
|
||||
- targetLabel: "group"
|
||||
replacement: "yb-master"
|
||||
- targetLabel: "export_type"
|
||||
replacement: "master_export"
|
||||
- targetLabel: "node_prefix"
|
||||
replacement: {{ $.Release.Name | quote }}
|
||||
metricRelabelings:
|
||||
{{- toYaml $.Values.serviceMonitor.commonMetricRelabelings | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,23 @@
|
|||
{{- if (and .Values.multicluster.createCommonTserverService (not .Values.oldNamingStyle)) }}
|
||||
{{- range $service := .Values.serviceEndpoints }}
|
||||
{{- if eq $service.name "yb-tserver-service" }}
|
||||
{{- $appLabelArgs := dict "label" $service.app "root" $ -}}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: "yb-tserver-common"
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $ | indent 4 }}
|
||||
spec:
|
||||
ports:
|
||||
{{- range $label, $port := $service.ports }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 4 }}
|
||||
---
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,21 @@
|
|||
{{- /*
|
||||
Ref - https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-services#registering_a_service_for_export
|
||||
https://github.com/kubernetes/enhancements/tree/master/keps/sig-multicluster/1645-multi-cluster-services-api#exporting-services
|
||||
*/}}
|
||||
{{- if .Values.multicluster.createServiceExports }}
|
||||
apiVersion: {{ .Values.multicluster.mcsApiVersion }}
|
||||
kind: ServiceExport
|
||||
metadata:
|
||||
name: {{ .Values.oldNamingStyle | ternary "yb-masters" (printf "%s-%s" (include "yugabyte.fullname" .) "yb-masters") | quote }}
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.labels" . | indent 4 }}
|
||||
---
|
||||
apiVersion: {{ .Values.multicluster.mcsApiVersion }}
|
||||
kind: ServiceExport
|
||||
metadata:
|
||||
name: {{ .Values.oldNamingStyle | ternary "yb-tservers" (printf "%s-%s" (include "yugabyte.fullname" .) "yb-tservers") | quote }}
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.labels" . | indent 4 }}
|
||||
{{ end -}}
|
|
@ -0,0 +1,34 @@
|
|||
{{- if .Values.multicluster.createServicePerPod }}
|
||||
{{- range $server := .Values.Services }}
|
||||
{{- range $replicaNum := until (int (ternary $.Values.replicas.master $.Values.replicas.tserver (eq $server.name "yb-masters"))) }}
|
||||
{{- $appLabelArgs := dict "label" $server.label "root" $ -}}
|
||||
{{- $podName := $.Values.oldNamingStyle | ternary $server.label (printf "%s-%s" (include "yugabyte.fullname" $) $server.label) -}}
|
||||
{{- $podName := printf "%s-%d" $podName $replicaNum -}}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ $podName | quote }}
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $ | indent 4 }}
|
||||
service-type: "non-endpoint"
|
||||
spec:
|
||||
ports:
|
||||
{{- range $label, $port := $server.ports }}
|
||||
{{- if (eq $label "grpc-ybc-port") }}
|
||||
{{- if $.Values.ybc.enabled }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
selector:
|
||||
statefulset.kubernetes.io/pod-name: {{ $podName | quote }}
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 4 }}
|
||||
---
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,7 @@
|
|||
{{- $root := . -}}
|
||||
--- # Create secrets from other namespaces for masters.
|
||||
{{- $data := dict "secretenv" $.Values.master.secretEnv "root" . "suffix" "master"}}
|
||||
{{- include "yugabyte.envsecrets" $data }}
|
||||
--- # Create secrets from other namespaces for tservers.
|
||||
{{- $data := dict "secretenv" $.Values.tserver.secretEnv "root" . "suffix" "tserver" }}
|
||||
{{- include "yugabyte.envsecrets" $data }}
|
|
@ -0,0 +1,774 @@
|
|||
{{- $root := . -}}
|
||||
---
|
||||
{{- if and (eq $root.Values.tls.enabled true) (eq $root.Values.tls.certManager.enabled false) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
{{- if $root.Values.tls.rootCA.key }}
|
||||
{{- $rootCAClient := buildCustomCert $root.Values.tls.rootCA.cert $root.Values.tls.rootCA.key -}}
|
||||
{{- $client := genSignedCert "yugabyte" ( default nil ) ( default nil ) 3650 $rootCAClient }}
|
||||
root.crt: {{ $rootCAClient.Cert | b64enc }}
|
||||
yugabytedb.crt: {{ $client.Cert | b64enc }}
|
||||
yugabytedb.key: {{ $client.Key | b64enc }}
|
||||
{{- else }}
|
||||
root.crt: {{ $root.Values.tls.rootCA.cert }}
|
||||
yugabytedb.crt: {{ $root.Values.tls.clientCert.cert }}
|
||||
yugabytedb.key: {{ $root.Values.tls.clientCert.key }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- end }}
|
||||
---
|
||||
{{- range .Values.Services }}
|
||||
{{- $service := . -}}
|
||||
{{- $appLabelArgs := dict "label" .label "root" $root -}}
|
||||
{{- $serviceValues := (dict "Service" $service "Values" $root.Values "Chart" $root.Chart "Release" $root.Release) -}}
|
||||
|
||||
{{- if and (eq $root.Values.tls.enabled true) (eq $root.Values.tls.certManager.enabled false) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" $service.label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) $service.label) }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
{{- $replicas := (eq .name "yb-masters") | ternary $root.Values.replicas.master $root.Values.replicas.tserver -}}
|
||||
{{- range $index := until ( int ( $replicas ) ) }}
|
||||
{{- $nodeOldStyle := printf "%s-%d.%s.%s.svc.%s" $service.label $index $service.name $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- $nodeNewStyle := printf "%s-%s-%d.%s-%s.%s.svc.%s" (include "yugabyte.fullname" $root) $service.label $index (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace $root.Values.domainName }}
|
||||
|
||||
{{- if $root.Values.multicluster.createServiceExports -}}
|
||||
{{- $nodeOldStyle = printf "%s-%d.%s.%s.%s.svc.clusterset.local" $service.label $index $root.Values.multicluster.kubernetesClusterId $service.name $root.Release.Namespace }}
|
||||
{{- $nodeNewStyle = printf "%s-%s-%d.%s.%s-%s.%s.svc.clusterset.local" (include "yugabyte.fullname" $root) $service.label $index $root.Values.multicluster.kubernetesClusterId (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace }}
|
||||
{{- end -}}
|
||||
|
||||
{{- if $root.Values.multicluster.createServicePerPod -}}
|
||||
{{- $nodeOldStyle = printf "%s-%d.%s.svc.%s" $service.label $index $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- $nodeNewStyle = printf "%s-%s-%d.%s.svc.%s" (include "yugabyte.fullname" $root) $service.label $index $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- end -}}
|
||||
|
||||
{{- $node := $root.Values.oldNamingStyle | ternary $nodeOldStyle $nodeNewStyle }}
|
||||
{{- if $root.Values.tls.rootCA.key }}
|
||||
{{- $dns1 := printf "*.%s-%s.%s" (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace }}
|
||||
{{- $dns2 := printf "%s.svc.%s" $dns1 $root.Values.domainName }}
|
||||
{{- if $root.Values.multicluster.createServiceExports -}}
|
||||
{{- $dns1 = printf "*.%s.%s-%s.%s.svc.clusterset.local" $root.Values.multicluster.kubernetesClusterId (include "yugabyte.fullname" $root) $service.name $root.Release.Namespace }}
|
||||
{{- end -}}
|
||||
{{- if $root.Values.multicluster.createServicePerPod -}}
|
||||
{{- $dns1 = printf "*.%s.svc.%s" $root.Release.Namespace $root.Values.domainName }}
|
||||
{{- end -}}
|
||||
{{- $rootCA := buildCustomCert $root.Values.tls.rootCA.cert $root.Values.tls.rootCA.key -}}
|
||||
{{- $server := genSignedCert $node ( default nil ) (list $node $dns1 $dns2 ) 3650 $rootCA }}
|
||||
node.{{$node}}.crt: {{ $server.Cert | b64enc }}
|
||||
node.{{$node}}.key: {{ $server.Key | b64enc }}
|
||||
{{- else }}
|
||||
node.{{$node}}.crt: {{ $root.Values.tls.nodeCert.cert }}
|
||||
node.{{$node}}.key: {{ $root.Values.tls.nodeCert.key }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
ca.crt: {{ $root.Values.tls.rootCA.cert }}
|
||||
{{- end }}
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary .name (printf "%s-%s" (include "yugabyte.fullname" $root) .name) | quote }}
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
service-type: "headless"
|
||||
spec:
|
||||
clusterIP: None
|
||||
ports:
|
||||
{{- range $label, $port := .ports }}
|
||||
{{- if (eq $label "grpc-ybc-port") }}
|
||||
{{- if $root.Values.ybc.enabled }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
selector:
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 4 }}
|
||||
|
||||
{{- if $root.Values.enableLoadBalancer }}
|
||||
{{- range $endpoint := $root.Values.serviceEndpoints }}
|
||||
{{- if eq $service.label $endpoint.app }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary $endpoint.name (printf "%s-%s" (include "yugabyte.fullname" $root) $endpoint.name) | quote }}
|
||||
annotations:
|
||||
{{ toYaml $endpoint.annotations | indent 4 }}
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
service-type: "endpoint"
|
||||
spec:
|
||||
{{- if eq $root.Release.Service "Tiller" }}
|
||||
clusterIP:
|
||||
{{- else }}
|
||||
{{- if $endpoint.clusterIP }}
|
||||
clusterIP: {{ $endpoint.clusterIP }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
ports:
|
||||
{{- range $label, $port := $endpoint.ports }}
|
||||
- name: {{ $label | quote }}
|
||||
port: {{ $port }}
|
||||
{{- end}}
|
||||
selector:
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 4 }}
|
||||
type: {{ $endpoint.type }}
|
||||
externalTrafficPolicy: {{ $endpoint.externalTrafficPolicy | default "Cluster" }}
|
||||
{{- if $endpoint.loadBalancerIP }}
|
||||
loadBalancerIP: {{ $endpoint.loadBalancerIP }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
{{- end}}
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary .label (printf "%s-%s" (include "yugabyte.fullname" $root) .label) | quote }}
|
||||
namespace: "{{ $root.Release.Namespace }}"
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 4 }}
|
||||
{{- include "yugabyte.labels" $root | indent 4 }}
|
||||
{{- if $root.Values.statefulSetAnnotations }}
|
||||
annotations:
|
||||
{{ toYaml $root.Values.statefulSetAnnotations | indent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
serviceName: {{ $root.Values.oldNamingStyle | ternary .name (printf "%s-%s" (include "yugabyte.fullname" $root) .name) | quote }}
|
||||
podManagementPolicy: {{ $root.Values.PodManagementPolicy }}
|
||||
{{ if eq .name "yb-masters" }}
|
||||
replicas: {{ $root.Values.replicas.master }}
|
||||
{{ else }}
|
||||
replicas: {{ $root.Values.replicas.tserver }}
|
||||
{{ end }}
|
||||
{{- $storageInfo := (eq .name "yb-masters") | ternary $root.Values.storage.master $root.Values.storage.tserver -}}
|
||||
{{ if not $root.Values.storage.ephemeral }}
|
||||
volumeClaimTemplates:
|
||||
{{- range $index := until (int ($storageInfo.count )) }}
|
||||
- metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary (printf "datadir%d" $index) (printf "%s%d" (include "yugabyte.volume_name" $root) $index) }}
|
||||
{{- if $root.Values.legacyVolumeClaimAnnotations }}
|
||||
annotations:
|
||||
volume.beta.kubernetes.io/storage-class: {{ $storageInfo.storageClass | quote }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "yugabyte.labels" $root | indent 10 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- "ReadWriteOnce"
|
||||
{{- if $storageInfo.storageClass }}
|
||||
storageClassName: {{ $storageInfo.storageClass }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ $storageInfo.size }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
updateStrategy:
|
||||
type: RollingUpdate
|
||||
rollingUpdate:
|
||||
{{ if eq .name "yb-masters" }}
|
||||
partition: {{ $root.Values.partition.master }}
|
||||
{{ else }}
|
||||
partition: {{ $root.Values.partition.tserver }}
|
||||
{{ end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- if eq .name "yb-masters" }}
|
||||
{{- if (or $root.Values.networkAnnotation $root.Values.master.podAnnotations $root.Values.tls.enabled) }}
|
||||
annotations:
|
||||
{{- with $root.Values.networkAnnotation }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- with $root.Values.master.podAnnotations }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
checksum/rootCA: {{ cat $root.Values.tls.rootCA.cert $root.Values.tls.rootCA.key | sha256sum }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if (or $root.Values.networkAnnotation $root.Values.tserver.podAnnotations $root.Values.tls.enabled) }}
|
||||
annotations:
|
||||
{{- with $root.Values.networkAnnotation }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- with $root.Values.tserver.podAnnotations }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
checksum/rootCA: {{ cat $root.Values.tls.rootCA.cert $root.Values.tls.rootCA.key | sha256sum }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "yugabyte.applabel" ($appLabelArgs) | indent 8 }}
|
||||
{{- include "yugabyte.labels" $root | indent 8 }}
|
||||
{{- if $root.Values.istioCompatibility.enabled }}
|
||||
sidecar.istio.io/inject: "true"
|
||||
{{- end }}
|
||||
{{- if eq .name "yb-masters" }}
|
||||
{{- with $root.Values.master.podLabels }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- else }}
|
||||
{{- with $root.Values.tserver.podLabels }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if $root.Values.Image.pullSecretName }}
|
||||
imagePullSecrets:
|
||||
- name: {{ $root.Values.Image.pullSecretName }}
|
||||
{{ end }}
|
||||
{{- if $root.Values.podSecurityContext.enabled }}
|
||||
securityContext: {{- omit $root.Values.podSecurityContext "enabled" | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml $root.Values.nodeSelector | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if eq .name "yb-masters" }} # yb-masters
|
||||
{{- with $root.Values.master.serviceAccount }}
|
||||
serviceAccountName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.master.tolerations }}
|
||||
tolerations:
|
||||
{{- with $root.Values.master.tolerations }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- end }}
|
||||
{{- else }} # yb-tservers
|
||||
{{- with $root.Values.tserver.serviceAccount }}
|
||||
serviceAccountName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.tserver.tolerations }}
|
||||
tolerations:
|
||||
{{- with $root.Values.tserver.tolerations }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
terminationGracePeriodSeconds: 300
|
||||
affinity:
|
||||
# Set the anti-affinity selector scope to YB masters and tservers.
|
||||
{{- $nodeAffinityData := dict}}
|
||||
{{- if eq .name "yb-masters" -}}
|
||||
{{- $nodeAffinityData = get $root.Values.master.affinity "nodeAffinity" | default (dict) -}}
|
||||
{{- else -}}
|
||||
{{- $nodeAffinityData = get $root.Values.tserver.affinity "nodeAffinity" | default (dict) -}}
|
||||
{{- end -}}
|
||||
{{ if $root.Values.AZ }}
|
||||
{{- $userSelectorTerms := dig "requiredDuringSchedulingIgnoredDuringExecution" "nodeSelectorTerms" "" $nodeAffinityData | default (list) -}}
|
||||
{{- $baseAffinity := include "yugabyte.multiAZNodeAffinity" $root | fromYaml -}}
|
||||
{{- $requiredSchedule := (list) -}}
|
||||
{{- if $userSelectorTerms -}}
|
||||
{{- range $userSelectorTerms -}}
|
||||
{{- $userTerm := . -}}
|
||||
{{- range $baseAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms -}}
|
||||
{{- $matchExpr := concat .matchExpressions $userTerm.matchExpressions | dict "matchExpressions" -}}
|
||||
{{- $requiredSchedule = mustMerge $matchExpr $userTerm | append $requiredSchedule -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- $requiredSchedule = $baseAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- with $baseAffinity.requiredDuringSchedulingIgnoredDuringExecution -}}
|
||||
{{- $_ := set . "nodeSelectorTerms" $requiredSchedule -}}
|
||||
{{- end -}}
|
||||
{{- $nodeAffinityData = mustMerge $baseAffinity $nodeAffinityData -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $podAntiAffinityData := dict -}}
|
||||
{{- $basePodAntiAffinity := include "yugabyte.podAntiAffinity" ($appLabelArgs) | fromYaml -}}
|
||||
{{- if eq .name "yb-masters" -}}
|
||||
{{- with $root.Values.master.affinity -}}
|
||||
{{- $userPodAntiAffinity := get . "podAntiAffinity" | default (dict) -}}
|
||||
{{- if $userPodAntiAffinity -}}
|
||||
{{- $preferredList := dig "preferredDuringSchedulingIgnoredDuringExecution" "" $userPodAntiAffinity | default (list) | concat $basePodAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}}
|
||||
{{- $_ := set $basePodAntiAffinity "preferredDuringSchedulingIgnoredDuringExecution" $preferredList -}}
|
||||
{{- end -}}
|
||||
{{- $podAntiAffinityData = mustMerge $basePodAntiAffinity $userPodAntiAffinity -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- with $root.Values.tserver.affinity -}}
|
||||
{{- $userPodAntiAffinity := get . "podAntiAffinity" | default (dict) -}}
|
||||
{{- if $userPodAntiAffinity -}}
|
||||
{{- $preferredList := dig "preferredDuringSchedulingIgnoredDuringExecution" "" $userPodAntiAffinity | default (list) | concat $basePodAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}}
|
||||
{{- $_ := set $basePodAntiAffinity "preferredDuringSchedulingIgnoredDuringExecution" $preferredList -}}
|
||||
{{- end -}}
|
||||
{{- $podAntiAffinityData = mustMerge $basePodAntiAffinity $userPodAntiAffinity -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- if eq .name "yb-masters" -}}
|
||||
{{- if $nodeAffinityData -}}
|
||||
{{- $_ := set $root.Values.master.affinity "nodeAffinity" $nodeAffinityData -}}
|
||||
{{- end -}}
|
||||
{{- $_ := set $root.Values.master.affinity "podAntiAffinity" $podAntiAffinityData -}}
|
||||
{{ toYaml $root.Values.master.affinity | nindent 8 }}
|
||||
{{- else -}}
|
||||
{{- if $nodeAffinityData -}}
|
||||
{{- $_ := set $root.Values.tserver.affinity "nodeAffinity" $nodeAffinityData -}}
|
||||
{{- end -}}
|
||||
{{- $_ := set $root.Values.tserver.affinity "podAntiAffinity" $podAntiAffinityData -}}
|
||||
{{ toYaml $root.Values.tserver.affinity | nindent 8 }}
|
||||
{{ end }}
|
||||
{{- with $root.Values.dnsConfig }}
|
||||
dnsConfig: {{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $root.Values.dnsPolicy }}
|
||||
dnsPolicy: {{ . | quote }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: "{{ .label }}"
|
||||
image: "{{ $root.Values.Image.repository }}:{{ $root.Values.Image.tag }}"
|
||||
imagePullPolicy: {{ $root.Values.Image.pullPolicy }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- "bash"
|
||||
- "-c"
|
||||
- >
|
||||
mkdir -p /mnt/disk0/cores;
|
||||
mkdir -p /mnt/disk0/yb-data/scripts;
|
||||
if [ ! -f /mnt/disk0/yb-data/scripts/log_cleanup.sh ]; then
|
||||
if [ -f /home/yugabyte/bin/log_cleanup.sh ]; then
|
||||
cp /home/yugabyte/bin/log_cleanup.sh /mnt/disk0/yb-data/scripts;
|
||||
fi;
|
||||
fi
|
||||
{{- if (and (not $root.Values.storage.ephemeral) (not $service.skipHealthChecks)) }}
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- bash
|
||||
- -v
|
||||
- -c
|
||||
- |
|
||||
{{- include "yugabyte.fs_data_dirs_probe" $storageInfo | nindent 14 }};
|
||||
exit_code="$?";
|
||||
echo "disk check exited with: ${exit_code}";
|
||||
exit "${exit_code}"
|
||||
failureThreshold: 3
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
{{- end }}
|
||||
env:
|
||||
- name: POD_IP
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: status.podIP
|
||||
- name: HOSTNAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: YBDEVOPS_CORECOPY_DIR
|
||||
value: "/mnt/disk0/cores"
|
||||
{{- if eq .name "yb-masters" }}
|
||||
{{- with $root.Values.master.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }}
|
||||
{{- $data := dict "secretenv" $root.Values.master.secretEnv "root" $root "suffix" "master"}}
|
||||
{{- include "yugabyte.addenvsecrets" $data | nindent 8 }}
|
||||
{{- else }}
|
||||
{{- with $root.Values.tserver.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }}
|
||||
{{- $data := dict "secretenv" $root.Values.tserver.secretEnv "root" $root "suffix" "tserver" }}
|
||||
{{- include "yugabyte.addenvsecrets" $data | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if and $root.Values.tls.enabled $root.Values.tls.clientToServer (ne .name "yb-masters") }}
|
||||
- name: SSL_CERTFILE
|
||||
value: /root/.yugabytedb/root.crt
|
||||
{{- end }}
|
||||
resources:
|
||||
{{- if eq .name "yb-masters" }}
|
||||
{{ toYaml $root.Values.resource.master | indent 10 }}
|
||||
{{ else }}
|
||||
{{ toYaml $root.Values.resource.tserver | indent 10 }}
|
||||
{{ end }}
|
||||
# core dumps are collected to workingDir if
|
||||
# kernel.core_pattern is set to a relative path like
|
||||
# core.%e.%p.%t ref:
|
||||
# https://github.com/yugabyte/charts/issues/11
|
||||
workingDir: "/mnt/disk0/cores"
|
||||
command:
|
||||
- "/sbin/tini"
|
||||
- "--"
|
||||
args:
|
||||
- "/bin/bash"
|
||||
- "-c"
|
||||
- |
|
||||
{{- if and (not $root.Values.preflight.skipUlimit) (not $root.Values.preflight.skipAll) }}
|
||||
if [ -f /home/yugabyte/tools/k8s_preflight.py ]; then
|
||||
/home/yugabyte/tools/k8s_preflight.py all
|
||||
fi && \
|
||||
{{- end }}
|
||||
{{- if (and (not $root.Values.storage.ephemeral) (not $root.Values.preflight.skipAll)) }}
|
||||
{{- include "yugabyte.fs_data_dirs_probe" $storageInfo | nindent 12 }} && \
|
||||
{{- end }}
|
||||
{{- $rpcAddr := include "yugabyte.rpc_bind_address" $serviceValues -}}
|
||||
{{- $rpcPort := index $service.ports "tcp-rpc-port" -}}
|
||||
{{- $rpcDict := dict "Addr" $rpcAddr "Port" $rpcPort -}}
|
||||
{{- $rpcPreflight := include "yugabyte.preflight_check" (set $serviceValues "Preflight" $rpcDict) -}}
|
||||
{{- if $rpcPreflight -}}{{ $rpcPreflight | nindent 12 }}{{ end -}}
|
||||
{{- $broadcastAddr := include "yugabyte.server_broadcast_address" $serviceValues -}}
|
||||
{{/* skip bind check for servicePerPod multi-cluster, we cannot/don't bind to service IP */}}
|
||||
{{- if not $root.Values.multicluster.createServicePerPod }}
|
||||
{{- $broadcastPort := index $service.ports "tcp-rpc-port" -}}
|
||||
{{- $broadcastDict := dict "Addr" $broadcastAddr "Port" $broadcastPort -}}
|
||||
{{- $broadcastPreflight := include "yugabyte.preflight_check" (set $serviceValues "Preflight" $broadcastDict) -}}
|
||||
{{- if $broadcastPreflight -}}{{ $broadcastPreflight | nindent 12 }}{{ end -}}
|
||||
{{- end }}
|
||||
{{- $webserverAddr := include "yugabyte.webserver_interface" $serviceValues -}}
|
||||
{{- $webserverPort := index $service.ports "http-ui" -}}
|
||||
{{- $webserverDict := dict "Addr" $webserverAddr "Port" $webserverPort -}}
|
||||
{{- $webserverPreflight := include "yugabyte.preflight_check" (set $serviceValues "Preflight" $webserverDict) -}}
|
||||
{{- if $webserverPreflight -}}{{ $webserverPreflight | nindent 12 }}{{ end }}
|
||||
if [[ -f /home/yugabyte/tools/k8s_parent.py ]]; then
|
||||
k8s_parent="/home/yugabyte/tools/k8s_parent.py"
|
||||
else
|
||||
k8s_parent=""
|
||||
fi && \
|
||||
{{- if and $root.Values.tls.enabled $root.Values.tls.certManager.enabled }}
|
||||
echo "Creating ephemeral /opt/certs/yugabyte/ as symlink to persisted /mnt/disk0/certs/" && \
|
||||
mkdir -p /mnt/disk0/certs && \
|
||||
mkdir -p /opt/certs && \
|
||||
ln -s /mnt/disk0/certs /opt/certs/yugabyte && \
|
||||
if [[ ! -f /opt/certs/yugabyte/ca.crt ]]; then
|
||||
echo "Fresh install of /opt/certs/yugabyte/ca.crt"
|
||||
cp /home/yugabyte/cert-manager/ca.crt /opt/certs/yugabyte/ca.crt;
|
||||
fi && \
|
||||
cmp -s /home/yugabyte/cert-manager/ca.crt /opt/certs/yugabyte/ca.crt;sameRootCA=$? && \
|
||||
if [[ $sameRootCA -eq 0 ]]; then
|
||||
echo "Refreshing tls certs at /opt/certs/yugabyte/";
|
||||
cp /home/yugabyte/cert-manager/tls.crt /opt/certs/yugabyte/node.{{$rpcAddr}}.crt;
|
||||
cp /home/yugabyte/cert-manager/tls.key /opt/certs/yugabyte/node.{{$rpcAddr}}.key;
|
||||
chmod 600 /opt/certs/yugabyte/*
|
||||
else
|
||||
echo "WARNING: Not refreshing certificates as the root ca.crt has changed"
|
||||
fi && \
|
||||
{{- end }}
|
||||
{{- if eq .name "yb-masters" }}
|
||||
exec ${k8s_parent} /home/yugabyte/bin/yb-master \
|
||||
{{- if not $root.Values.storage.ephemeral }}
|
||||
--fs_data_dirs={{ template "yugabyte.fs_data_dirs" $storageInfo }} \
|
||||
{{- else }}
|
||||
--fs_data_dirs=/var/yugabyte \
|
||||
{{- end }}
|
||||
{{- if eq $root.Values.ip_version_support "v6_only" }}
|
||||
--net_address_filter=ipv6_external,ipv6_non_link_local,ipv6_all,ipv4_external,ipv4_all \
|
||||
{{- end }}
|
||||
{{- if $root.Values.isMultiAz }}
|
||||
--master_addresses={{ $root.Values.masterAddresses }} \
|
||||
--replication_factor={{ $root.Values.replicas.totalMasters }} \
|
||||
{{- else }}
|
||||
--master_addresses={{ template "yugabyte.master_addresses" $root }} \
|
||||
--replication_factor={{ $root.Values.replicas.master }} \
|
||||
{{- end }}
|
||||
{{- if not $root.Values.disableYsql }}
|
||||
--enable_ysql=true \
|
||||
{{- else }}
|
||||
--enable_ysql=false \
|
||||
{{- end }}
|
||||
--metric_node_name=$(HOSTNAME) \
|
||||
--memory_limit_hard_bytes={{ template "yugabyte.memory_hard_limit" $root.Values.resource.master }} \
|
||||
--stderrthreshold=0 \
|
||||
--num_cpus={{ ceil $root.Values.resource.master.requests.cpu }} \
|
||||
--undefok=num_cpus,enable_ysql \
|
||||
{{- range $flag, $override := $root.Values.gflags.master }}
|
||||
--{{ $flag }}={{ quote $override }} \
|
||||
{{- end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
--certs_dir=/opt/certs/yugabyte \
|
||||
--use_node_to_node_encryption={{ $root.Values.tls.nodeToNode }} \
|
||||
--allow_insecure_connections={{ $root.Values.tls.insecure }} \
|
||||
{{- end }}
|
||||
--rpc_bind_addresses={{ $rpcAddr }} \
|
||||
--server_broadcast_addresses={{ $broadcastAddr }} \
|
||||
--webserver_interface={{ $webserverAddr }}
|
||||
{{- else }}
|
||||
{{- $cqlAddr := include "yugabyte.cql_proxy_bind_address" $serviceValues -}}
|
||||
{{- $cqlPort := index $service.ports "tcp-yql-port" -}}
|
||||
{{- $cqlDict := dict "Addr" $cqlAddr "Port" $cqlPort -}}
|
||||
{{- $cqlPreflight := include "yugabyte.preflight_check" (set $serviceValues "Preflight" $cqlDict) -}}
|
||||
{{- if $cqlPreflight -}}{{ $cqlPreflight | nindent 12 }}{{ end -}}
|
||||
{{- $ysqlAddr := include "yugabyte.pgsql_proxy_bind_address" $serviceValues -}}
|
||||
{{- $ysqlPort := index $service.ports "tcp-ysql-port" -}}
|
||||
{{- if not $root.Values.disableYsql -}}
|
||||
{{- $ysqlDict := dict "Addr" $ysqlAddr "Port" $ysqlPort -}}
|
||||
{{- $ysqlPreflight := include "yugabyte.preflight_check" (set $serviceValues "Preflight" $ysqlDict) -}}
|
||||
{{- if $ysqlPreflight -}}{{ $ysqlPreflight | nindent 12 }}{{ end -}}
|
||||
{{- end }}
|
||||
exec ${k8s_parent} /home/yugabyte/bin/yb-tserver \
|
||||
{{- if not $root.Values.storage.ephemeral }}
|
||||
--fs_data_dirs={{ template "yugabyte.fs_data_dirs" $storageInfo }} \
|
||||
{{- else }}
|
||||
--fs_data_dirs=/var/yugabyte \
|
||||
{{- end }}
|
||||
{{- if eq $root.Values.ip_version_support "v6_only" }}
|
||||
--net_address_filter=ipv6_external,ipv6_non_link_local,ipv6_all,ipv4_external,ipv4_all \
|
||||
{{- end }}
|
||||
{{- if $root.Values.isMultiAz }}
|
||||
--tserver_master_addrs={{ $root.Values.masterAddresses }} \
|
||||
{{- else }}
|
||||
--tserver_master_addrs={{ template "yugabyte.master_addresses" $root }} \
|
||||
{{- end }}
|
||||
--metric_node_name=$(HOSTNAME) \
|
||||
--memory_limit_hard_bytes={{ template "yugabyte.memory_hard_limit" $root.Values.resource.tserver }} \
|
||||
--stderrthreshold=0 \
|
||||
--num_cpus={{ ceil $root.Values.resource.tserver.requests.cpu }} \
|
||||
--undefok=num_cpus,enable_ysql \
|
||||
--use_node_hostname_for_local_tserver=true \
|
||||
{{- if $root.Values.authCredentials.ysql.password }}
|
||||
--ysql_enable_auth=true \
|
||||
{{- end }}
|
||||
{{- if or $root.Values.authCredentials.ycql.user $root.Values.authCredentials.ycql.password }}
|
||||
--use_cassandra_authentication=true \
|
||||
{{- end }}
|
||||
{{- range $flag, $override := $root.Values.gflags.tserver }}
|
||||
--{{ $flag }}={{ quote $override }} \
|
||||
{{- end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
--certs_dir=/opt/certs/yugabyte \
|
||||
--use_node_to_node_encryption={{ $root.Values.tls.nodeToNode }} \
|
||||
--allow_insecure_connections={{ $root.Values.tls.insecure }} \
|
||||
--use_client_to_server_encryption={{ $root.Values.tls.clientToServer }} \
|
||||
--certs_for_client_dir=/opt/certs/yugabyte \
|
||||
{{- if $root.Values.tserver.serverBroadcastAddress }}
|
||||
--cert_node_filename={{ include "yugabyte.server_fqdn" $serviceValues }} \
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
--rpc_bind_addresses={{ $rpcAddr }} \
|
||||
--server_broadcast_addresses={{ $root.Values.tserver.serverBroadcastAddress | default $broadcastAddr }} \
|
||||
--webserver_interface={{ $webserverAddr }} \
|
||||
{{- if not $root.Values.disableYsql }}
|
||||
--enable_ysql=true \
|
||||
--pgsql_proxy_bind_address={{ $ysqlAddr }} \
|
||||
{{- else }}
|
||||
--enable_ysql=false \
|
||||
{{- end }}
|
||||
--cql_proxy_bind_address={{ $cqlAddr }}
|
||||
{{- end }}
|
||||
ports:
|
||||
{{- range $label, $port := .ports }}
|
||||
{{- if not (eq $label "grpc-ybc-port") }}
|
||||
- containerPort: {{ $port }}
|
||||
name: {{ $label | quote }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
{{- if (eq .name "yb-tservers") }}
|
||||
- name: tserver-tmp
|
||||
mountPath: /tmp
|
||||
{{- end }}
|
||||
- name: debug-hooks-volume
|
||||
mountPath: /opt/debug_hooks_config
|
||||
{{ if not $root.Values.storage.ephemeral }}
|
||||
{{- range $index := until (int ($storageInfo.count)) }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "datadir%d" $index) (printf "%s%d" (include "yugabyte.volume_name" $root) $index) }}
|
||||
mountPath: /mnt/disk{{ $index }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
mountPath: {{ $root.Values.tls.certManager.enabled | ternary "/home/yugabyte/cert-manager" "/opt/certs/yugabyte" }}
|
||||
readOnly: true
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
mountPath: /root/.yugabytedb/
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if and (eq .name "yb-masters") ($root.Values.master.extraVolumeMounts) -}}
|
||||
{{- include "yugabyte.isExtraVolumesMappingExists" $root.Values.master -}}
|
||||
{{- $root.Values.master.extraVolumeMounts | toYaml | nindent 10 -}}
|
||||
{{- else if and (eq .name "yb-tservers") ($root.Values.tserver.extraVolumeMounts) -}}
|
||||
{{- include "yugabyte.isExtraVolumesMappingExists" $root.Values.tserver -}}
|
||||
{{- $root.Values.tserver.extraVolumeMounts | toYaml | nindent 10 -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ if not $root.Values.storage.ephemeral }}
|
||||
- name: yb-cleanup
|
||||
image: "{{ $root.Values.Image.repository }}:{{ $root.Values.Image.tag }}"
|
||||
imagePullPolicy: {{ $root.Values.Image.pullPolicy }}
|
||||
env:
|
||||
- name: USER
|
||||
value: "yugabyte"
|
||||
command:
|
||||
- "/sbin/tini"
|
||||
- "--"
|
||||
args:
|
||||
- "/bin/bash"
|
||||
- "-c"
|
||||
- >
|
||||
while true; do
|
||||
sleep 3600;
|
||||
/home/yugabyte/scripts/log_cleanup.sh;
|
||||
done
|
||||
volumeMounts:
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary "datadir0" (printf "%s0" (include "yugabyte.volume_name" $root)) }}
|
||||
mountPath: /home/yugabyte/
|
||||
subPath: yb-data
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary "datadir0" (printf "%s0" (include "yugabyte.volume_name" $root)) }}
|
||||
mountPath: /var/yugabyte/cores
|
||||
subPath: cores
|
||||
{{- if $root.Values.ybCleanup.resources }}
|
||||
resources: {{ toYaml $root.Values.ybCleanup.resources | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if and (eq .name "yb-tservers") ($root.Values.ybc.enabled) }}
|
||||
- name: yb-controller
|
||||
image: "{{ $root.Values.Image.repository }}:{{ $root.Values.Image.tag }}"
|
||||
imagePullPolicy: {{ $root.Values.Image.pullPolicy }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- "bash"
|
||||
- "-c"
|
||||
- >
|
||||
mkdir -p /mnt/disk0/yw-data/controller/tmp;
|
||||
mkdir -p /mnt/disk0/yw-data/controller/conf;
|
||||
mkdir -p /mnt/disk0/ybc-data/controller/logs;
|
||||
mkdir -p /tmp/yugabyte/controller;
|
||||
ln -sf /mnt/disk0/ybc-data/controller/logs /tmp/yugabyte/controller;
|
||||
ln -sf /mnt/disk0/yw-data/controller/bin /tmp/yugabyte/controller;
|
||||
rm -f /tmp/yugabyte/controller/yb-controller.pid;
|
||||
{{- if and $root.Values.tls.enabled $root.Values.tls.certManager.enabled }}
|
||||
mkdir -p /opt/certs;
|
||||
ln -sf /mnt/disk0/certs /opt/certs/yugabyte;
|
||||
{{- end }}
|
||||
command:
|
||||
- "/sbin/tini"
|
||||
- "--"
|
||||
args:
|
||||
- "/bin/bash"
|
||||
- "-c"
|
||||
- >
|
||||
while true; do
|
||||
sleep 60;
|
||||
/home/yugabyte/tools/k8s_ybc_parent.py status || /home/yugabyte/tools/k8s_ybc_parent.py start;
|
||||
done
|
||||
{{- with index $service.ports "grpc-ybc-port" }}
|
||||
ports:
|
||||
- containerPort: {{ . }}
|
||||
name: "grpc-ybc-port"
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: tserver-tmp
|
||||
mountPath: /tmp
|
||||
{{- if not $root.Values.storage.ephemeral }}
|
||||
{{- range $index := until (int ($storageInfo.count)) }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "datadir%d" $index) (printf "%s%d" (include "yugabyte.volume_name" $root) $index) }}
|
||||
mountPath: /mnt/disk{{ $index }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
mountPath: {{ $root.Values.tls.certManager.enabled | ternary "/home/yugabyte/cert-manager" "/opt/certs/yugabyte" }}
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if ($root.Values.tserver.extraVolumeMounts) -}}
|
||||
{{- include "yugabyte.isExtraVolumesMappingExists" $root.Values.tserver -}}
|
||||
{{- $root.Values.tserver.extraVolumeMounts | toYaml | nindent 10 -}}
|
||||
{{- end -}}
|
||||
{{- if $root.Values.ybc.resources }}
|
||||
resources: {{ toYaml $root.Values.ybc.resources | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
|
||||
volumes:
|
||||
{{- if (eq .name "yb-masters") }}
|
||||
- name: debug-hooks-volume
|
||||
configMap:
|
||||
name: {{ include "yugabyte.fullname" $root }}-master-hooks
|
||||
defaultMode: 0755
|
||||
{{- else if (eq .name "yb-tservers") }}
|
||||
- name: debug-hooks-volume
|
||||
configMap:
|
||||
name: {{ include "yugabyte.fullname" $root }}-tserver-hooks
|
||||
defaultMode: 0755
|
||||
- name: tserver-tmp
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
{{ if not $root.Values.storage.ephemeral }}
|
||||
{{- range $index := until (int ($storageInfo.count)) }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "datadir%d" $index) (printf "%s%d" (include "yugabyte.volume_name" $root) $index) }}
|
||||
hostPath:
|
||||
path: /mnt/disks/ssd{{ $index }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if $root.Values.tls.enabled }}
|
||||
{{- if $root.Values.tls.certManager.enabled }}
|
||||
{{- /* certManager enabled */}}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
projected:
|
||||
sources:
|
||||
{{- if not $root.Values.tls.certManager.bootstrapSelfsigned }}
|
||||
- secret:
|
||||
name: {{ printf "%s-root-ca" (include "yugabyte.fullname" $root) }}
|
||||
{{- end }}
|
||||
- secret:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
{{- else }}
|
||||
{{/* certManager disabled */}}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
secret:
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary (printf "%s-yugabyte-tls-cert" .label) (printf "%s-%s-tls-cert" (include "yugabyte.fullname" $root) .label) }}
|
||||
defaultMode: 256
|
||||
{{- end }}
|
||||
- name: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
secret:
|
||||
secretName: {{ $root.Values.oldNamingStyle | ternary "yugabyte-tls-client-cert" (printf "%s-client-tls" (include "yugabyte.fullname" $root)) }}
|
||||
{{- if $root.Values.tls.certManager.enabled }}
|
||||
items:
|
||||
- key: ca.crt
|
||||
path: root.crt
|
||||
- key: tls.crt
|
||||
path: yugabytedb.crt
|
||||
- key: tls.key
|
||||
path: yugabytedb.key
|
||||
{{- end }}
|
||||
defaultMode: 256
|
||||
{{- end }}
|
||||
{{- if and (eq .name "yb-masters") ($root.Values.master.extraVolumes) -}}
|
||||
{{- include "yugabyte.isExtraVolumesMappingExists" $root.Values.master -}}
|
||||
{{- $root.Values.master.extraVolumes | toYaml | nindent 8 -}}
|
||||
{{- else if and (eq .name "yb-tservers") ($root.Values.tserver.extraVolumes) -}}
|
||||
{{- include "yugabyte.isExtraVolumesMappingExists" $root.Values.tserver -}}
|
||||
{{- $root.Values.tserver.extraVolumes | toYaml | nindent 8 -}}
|
||||
{{- end -}}
|
||||
{{- if eq $root.Values.isMultiAz false }}
|
||||
---
|
||||
{{/*
|
||||
TODO: switch to policy/v1 completely when we stop supporting
|
||||
Kubernetes versions < 1.21
|
||||
*/}}
|
||||
{{- if $root.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }}
|
||||
apiVersion: policy/v1
|
||||
{{- else }}
|
||||
apiVersion: policy/v1beta1
|
||||
{{- end }}
|
||||
kind: PodDisruptionBudget
|
||||
metadata:
|
||||
name: {{ $root.Values.oldNamingStyle | ternary (printf "%s-pdb" .label) (printf "%s-%s-pdb" (include "yugabyte.fullname" $root) .name) }}
|
||||
spec:
|
||||
maxUnavailable: {{ template "yugabyte.max_unavailable_for_quorum" $root }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "yugabyte.appselector" ($appLabelArgs) | indent 6 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,259 @@
|
|||
{{- if or .Values.authCredentials.ycql.user .Values.authCredentials.ycql.password .Values.authCredentials.ycql.keyspace .Values.authCredentials.ysql.password .Values.authCredentials.ysql.user .Values.authCredentials.ysql.database }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-setup-credentials-script
|
||||
namespace: "{{ .Release.Namespace }}"
|
||||
labels:
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: "{{ .Chart.Name }}"
|
||||
component: "{{ .Values.Component }}"
|
||||
data:
|
||||
setup-credentials.sh: |
|
||||
#!/bin/bash
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
# Setup script to setup credentials
|
||||
|
||||
# -----------------------------------------
|
||||
# Default Variables
|
||||
# -----------------------------------------
|
||||
|
||||
readonly DEFAULT_YSQL_USER="yugabyte"
|
||||
readonly DEFAULT_YSQL_PASSWORD="yugabyte"
|
||||
readonly DEFAULT_YSQL_DB="yugabyte"
|
||||
|
||||
readonly DEFAULT_YCQL_USER="cassandra"
|
||||
readonly DEFAULT_YCQL_PASSWORD="cassandra"
|
||||
|
||||
{{- range .Values.Services }}
|
||||
{{- $service := . -}}
|
||||
{{- if eq ($service.name) "yb-tservers" }}
|
||||
readonly YSQL_PORT={{ index $service.ports "tcp-ysql-port" }}
|
||||
# TODO: Update the tcp-yql-port to tcp-ycql-port in values.yaml
|
||||
readonly YCQL_PORT={{ index $service.ports "tcp-yql-port" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
prefix_ysql_cmd=(
|
||||
/home/yugabyte/bin/ysqlsh -h yb-tservers.{{ .Release.Namespace }}.svc.{{ .Values.domainName }}
|
||||
-p "$YSQL_PORT"
|
||||
)
|
||||
|
||||
prefix_ycql_cmd=(
|
||||
/home/yugabyte/bin/ycqlsh yb-tservers.{{ .Release.Namespace }}.svc.{{ .Values.domainName }}
|
||||
"$YCQL_PORT"
|
||||
)
|
||||
|
||||
{{- if .Values.tls.enabled }}
|
||||
prefix_ysql_cmd+=("sslmode=require")
|
||||
prefix_ycql_cmd+=(--ssl)
|
||||
{{- end }}
|
||||
|
||||
# -----------------------------------------
|
||||
# Variables
|
||||
# -----------------------------------------
|
||||
|
||||
ysql_user=
|
||||
ysql_password=
|
||||
ysql_db=
|
||||
ycql_user=
|
||||
ycql_password=
|
||||
ycql_keyspace=
|
||||
|
||||
# -----------------------------------------
|
||||
# Hepler functions
|
||||
# -----------------------------------------
|
||||
|
||||
cleanup() {
|
||||
local exit_code=$?
|
||||
echo "Exiting with code $exit_code"
|
||||
exit "$exit_code"
|
||||
}
|
||||
|
||||
function waitUntilHealthy() {
|
||||
declare -a ysql_cmd
|
||||
export PGPASSWORD="$2"
|
||||
ysql_cmd=(
|
||||
/home/yugabyte/bin/ysqlsh -h yb-tservers.{{ .Release.Namespace }}.svc.{{ .Values.domainName }}
|
||||
-p "$3"
|
||||
-U "$1"
|
||||
-c "\\conninfo"
|
||||
)
|
||||
|
||||
if [[ "$4" == "true" ]]; then
|
||||
ysql_cmd+=("sslmode=require")
|
||||
fi
|
||||
|
||||
echo "${ysql_cmd[@]}"
|
||||
while ! "${ysql_cmd[@]}"; do
|
||||
sleep 5s
|
||||
done
|
||||
}
|
||||
|
||||
export -f waitUntilHealthy
|
||||
|
||||
get_ysql_credentials() {
|
||||
[[ -n "$YSQL_USER" ]] && ysql_user="$YSQL_USER" || ysql_user="$DEFAULT_YSQL_USER"
|
||||
|
||||
[[ -n "$YSQL_PASSWORD" ]] && ysql_password="$YSQL_PASSWORD"
|
||||
|
||||
if [[ -z "$YSQL_PASSWORD" ]] && [[ "$ysql_user" != "$DEFAULT_YSQL_USER" ]]; then
|
||||
ysql_password="$YSQL_USER"
|
||||
fi
|
||||
|
||||
[[ -n "$YSQL_DB" ]] && ysql_db="$YSQL_DB"
|
||||
|
||||
[[ -z "$YSQL_DB" ]] && [[ -n "$YSQL_USER" ]] && ysql_db="$ysql_user"
|
||||
|
||||
api="ysql"
|
||||
}
|
||||
|
||||
get_ycql_credentials() {
|
||||
[[ -n "$YCQL_USER" ]] && ycql_user="$YCQL_USER" || ycql_user="$DEFAULT_YCQL_USER"
|
||||
|
||||
[[ -n "$YCQL_PASSWORD" ]] && ycql_password="$YCQL_PASSWORD"
|
||||
|
||||
if [[ -z "$YCQL_PASSWORD" ]] && [[ "$ycql_user" != "$DEFAULT_YCQL_USER" ]]; then
|
||||
ycql_password="$YCQL_USER"
|
||||
fi
|
||||
|
||||
[[ -n "$YCQL_KEYSPACE" ]] && ycql_keyspace="$YCQL_KEYSPACE"
|
||||
|
||||
[[ -z "$YCQL_KEYSPACE" ]] && [[ -n "$YCQL_USER" ]] && ycql_keyspace="$ycql_user"
|
||||
|
||||
api="ycql"
|
||||
}
|
||||
|
||||
create_user() {
|
||||
declare -a ysql_cmd
|
||||
declare -a ycql_cmd
|
||||
|
||||
case "$api" in
|
||||
"ysql")
|
||||
export PGPASSWORD="$DEFAULT_YSQL_PASSWORD"
|
||||
read -r -a ysql_cmd <<< "${prefix_ysql_cmd[@]}"
|
||||
ysql_cmd+=(
|
||||
-U "$DEFAULT_YSQL_USER"
|
||||
-c "CREATE ROLE ${ysql_user} with LOGIN SUPERUSER password '${ysql_password}' ;"
|
||||
-c "ALTER DATABASE ${ysql_db} OWNER TO ${ysql_user} ;"
|
||||
)
|
||||
"${ysql_cmd[@]}"
|
||||
;;
|
||||
"ycql")
|
||||
read -r -a ycql_cmd <<< "${prefix_ycql_cmd[@]}"
|
||||
ycql_cmd+=(
|
||||
-u "$DEFAULT_YCQL_USER"
|
||||
-p "$DEFAULT_YCQL_PASSWORD"
|
||||
-e "CREATE ROLE IF NOT EXISTS ${ycql_user} WITH PASSWORD = '${ycql_password}' AND LOGIN = true AND SUPERUSER = true ;"
|
||||
)
|
||||
"${ycql_cmd[@]}"
|
||||
;;
|
||||
*) exit 1
|
||||
esac
|
||||
}
|
||||
|
||||
update_password() {
|
||||
declare -a ysql_cmd
|
||||
declare -a ycql_cmd
|
||||
|
||||
case "$api" in
|
||||
"ysql")
|
||||
export PGPASSWORD="$DEFAULT_YSQL_PASSWORD"
|
||||
read -r -a ysql_cmd <<< "${prefix_ysql_cmd[@]}"
|
||||
ysql_cmd+=(
|
||||
-U "$DEFAULT_YSQL_USER"
|
||||
-c "ALTER ROLE ${ysql_user} WITH PASSWORD '${ysql_password}' ;"
|
||||
)
|
||||
"${ysql_cmd[@]}"
|
||||
;;
|
||||
"ycql")
|
||||
read -r -a ycql_cmd <<< "${prefix_ycql_cmd[@]}"
|
||||
ycql_cmd+=(
|
||||
-u "$DEFAULT_YCQL_USER"
|
||||
-p "$DEFAULT_YCQL_PASSWORD"
|
||||
-e "ALTER ROLE ${ycql_user} WITH PASSWORD = '${ycql_password}' ;"
|
||||
)
|
||||
"${ycql_cmd[@]}"
|
||||
;;
|
||||
*) exit 1
|
||||
esac
|
||||
}
|
||||
|
||||
create_container() {
|
||||
declare -a ysql_cmd
|
||||
declare -a ycql_cmd
|
||||
|
||||
case "$api" in
|
||||
"ysql")
|
||||
export PGPASSWORD="$DEFAULT_YSQL_PASSWORD"
|
||||
read -r -a ysql_cmd <<< "${prefix_ysql_cmd[@]}"
|
||||
ysql_cmd+=(
|
||||
-U "$DEFAULT_YSQL_USER"
|
||||
-c "CREATE DATABASE ${ysql_db} ;"
|
||||
)
|
||||
"${ysql_cmd[@]}"
|
||||
;;
|
||||
"ycql")
|
||||
read -r -a ycql_cmd <<< "${prefix_ycql_cmd[@]}"
|
||||
ycql_cmd+=(
|
||||
-u "$DEFAULT_YCQL_USER"
|
||||
-p "$DEFAULT_YCQL_PASSWORD"
|
||||
-e "CREATE KEYSPACE IF NOT EXISTS ${ycql_keyspace} ;"
|
||||
)
|
||||
"${ycql_cmd[@]}"
|
||||
;;
|
||||
*) exit 1
|
||||
esac
|
||||
}
|
||||
|
||||
# -----------------------------------------
|
||||
# Main
|
||||
# -----------------------------------------
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "Waiting for YugabyteDB to start."
|
||||
if ! timeout 3m bash -c "waitUntilHealthy ${DEFAULT_YSQL_USER} ${DEFAULT_YSQL_PASSWORD} ${YSQL_PORT} {{ .Values.tls.enabled }}"; then
|
||||
echo "Timeout while waiting for database"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# YSQL Credentials
|
||||
get_ysql_credentials
|
||||
|
||||
## Create YSQL DB
|
||||
if [[ -n $ysql_db ]] && [[ "$ysql_db" != "$DEFAULT_YSQL_DB" ]]; then
|
||||
create_container
|
||||
fi
|
||||
|
||||
## Update YSQL Password
|
||||
if [[ -n $ysql_password ]] && [[ "$ysql_password" != "$DEFAULT_YSQL_PASSWORD" ]] && [[ "$ysql_user" == "$DEFAULT_YSQL_USER" ]]; then
|
||||
update_password
|
||||
fi
|
||||
|
||||
## Create YSQL User
|
||||
if [[ -n $ysql_user ]] && [[ "$ysql_user" != "$DEFAULT_YSQL_USER" ]]; then
|
||||
create_user
|
||||
fi
|
||||
|
||||
# YCQL Credentials
|
||||
get_ycql_credentials
|
||||
|
||||
## Create YCQL Keyspace
|
||||
if [[ -n $ycql_keyspace ]] && [[ -n "$ycql_keyspace" ]]; then
|
||||
create_container
|
||||
fi
|
||||
|
||||
## Update YCQL Password
|
||||
if [[ -n $ycql_password ]] && [[ "$ycql_password" != "$DEFAULT_YCQL_PASSWORD" ]] && [[ "$ycql_user" == "$DEFAULT_YCQL_USER" ]]; then
|
||||
update_password
|
||||
fi
|
||||
|
||||
## Create YCQL User
|
||||
if [[ -n $ycql_user ]] && [[ "$ycql_user" != "$DEFAULT_YCQL_USER" ]]; then
|
||||
create_user
|
||||
fi
|
||||
|
||||
{{- end }}
|
|
@ -0,0 +1,115 @@
|
|||
{{- $sm := .Values.serviceMonitor }}
|
||||
{{ if and $sm.enabled (or $sm.tserver.enabled $sm.ycql.enabled $sm.ysql.enabled $sm.yedis.enabled) }}
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ include "yugabyte.fullname" . }}-yb-tserver
|
||||
labels:
|
||||
{{- if .Values.oldNamingStyle }}
|
||||
app: "yb-tserver"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "yb-tserver"
|
||||
{{- end }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
chart: "{{ .Chart.Name }}"
|
||||
component: "{{ .Values.Component }}"
|
||||
{{- with .Values.serviceMonitor.extraLabels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
jobLabel: "release"
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- if .Values.oldNamingStyle }}
|
||||
app: "yb-tserver"
|
||||
{{- else }}
|
||||
app.kubernetes.io/name: "yb-tserver"
|
||||
{{- end }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
service-type: "headless"
|
||||
endpoints:
|
||||
|
||||
{{- with .Values.serviceMonitor.tserver }}
|
||||
{{- if .enabled }}
|
||||
- port: {{ .port }}
|
||||
path: {{ .path }}
|
||||
{{- if .interval }}
|
||||
interval: {{ .interval }}
|
||||
{{- else }}
|
||||
interval: {{ $.Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
relabelings:
|
||||
- targetLabel: "group"
|
||||
replacement: "yb-tserver"
|
||||
- targetLabel: "export_type"
|
||||
replacement: "tserver_export"
|
||||
- targetLabel: "node_prefix"
|
||||
replacement: {{ $.Release.Name | quote }}
|
||||
metricRelabelings:
|
||||
{{- toYaml $.Values.serviceMonitor.commonMetricRelabelings | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.serviceMonitor.ycql }}
|
||||
{{- if .enabled }}
|
||||
- port: {{ .port }}
|
||||
path: {{ .path }}
|
||||
{{- if .interval }}
|
||||
interval: {{ .interval }}
|
||||
{{- else }}
|
||||
interval: {{ $.Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
relabelings:
|
||||
- targetLabel: "group"
|
||||
replacement: "ycql"
|
||||
- targetLabel: "export_type"
|
||||
replacement: "cql_export"
|
||||
- targetLabel: "node_prefix"
|
||||
replacement: {{ $.Release.Name | quote }}
|
||||
metricRelabelings:
|
||||
{{- toYaml $.Values.serviceMonitor.commonMetricRelabelings | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.serviceMonitor.ysql }}
|
||||
{{- if .enabled }}
|
||||
- port: {{ .port }}
|
||||
path: {{ .path }}
|
||||
{{- if .interval }}
|
||||
interval: {{ .interval }}
|
||||
{{- else }}
|
||||
interval: {{ $.Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
relabelings:
|
||||
- targetLabel: "group"
|
||||
replacement: "ysql"
|
||||
- targetLabel: "export_type"
|
||||
replacement: "ysql_export"
|
||||
- targetLabel: "node_prefix"
|
||||
replacement: {{ $.Release.Name | quote }}
|
||||
metricRelabelings:
|
||||
{{- toYaml $.Values.serviceMonitor.commonMetricRelabelings | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.serviceMonitor.yedis }}
|
||||
{{- if .enabled }}
|
||||
- port: {{ .port }}
|
||||
path: {{ .path }}
|
||||
{{- if .interval }}
|
||||
interval: {{ .interval }}
|
||||
{{- else }}
|
||||
interval: {{ $.Values.serviceMonitor.interval }}
|
||||
{{- end }}
|
||||
relabelings:
|
||||
- targetLabel: "group"
|
||||
replacement: "yedis"
|
||||
- targetLabel: "export_type"
|
||||
replacement: "redis_export"
|
||||
- targetLabel: "node_prefix"
|
||||
replacement: {{ $.Release.Name | quote }}
|
||||
metricRelabelings:
|
||||
{{- toYaml $.Values.serviceMonitor.commonMetricRelabelings | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,540 @@
|
|||
# Default values for yugabyte.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
Component: "yugabytedb"
|
||||
|
||||
fullnameOverride: ""
|
||||
nameOverride: ""
|
||||
|
||||
Image:
|
||||
repository: "yugabytedb/yugabyte"
|
||||
tag: 2.18.9.0-b17
|
||||
pullPolicy: IfNotPresent
|
||||
pullSecretName: ""
|
||||
|
||||
storage:
|
||||
ephemeral: false # will not allocate PVs when true
|
||||
master:
|
||||
count: 2
|
||||
size: 10Gi
|
||||
storageClass: ""
|
||||
tserver:
|
||||
count: 2
|
||||
size: 10Gi
|
||||
storageClass: ""
|
||||
|
||||
resource:
|
||||
master:
|
||||
requests:
|
||||
cpu: "2"
|
||||
memory: 2Gi
|
||||
limits:
|
||||
cpu: "2"
|
||||
memory: 2Gi
|
||||
tserver:
|
||||
requests:
|
||||
cpu: "2"
|
||||
memory: 4Gi
|
||||
limits:
|
||||
cpu: "2"
|
||||
memory: 4Gi
|
||||
|
||||
replicas:
|
||||
master: 3
|
||||
tserver: 3
|
||||
## Used to set replication factor when isMultiAz is set to true
|
||||
totalMasters: 3
|
||||
|
||||
partition:
|
||||
master: 0
|
||||
tserver: 0
|
||||
|
||||
# Used in Multi-AZ setup
|
||||
masterAddresses: ""
|
||||
|
||||
isMultiAz: false
|
||||
AZ: ""
|
||||
|
||||
# Disable the YSQL
|
||||
disableYsql: false
|
||||
|
||||
tls:
|
||||
# Set to true to enable the TLS.
|
||||
enabled: false
|
||||
nodeToNode: true
|
||||
clientToServer: true
|
||||
# Set to false to disallow any service with unencrypted communication from joining this cluster
|
||||
insecure: false
|
||||
# Set enabled to true to use cert-manager instead of providing your own rootCA
|
||||
certManager:
|
||||
enabled: false
|
||||
# Will create own ca certificate and issuer when set to true
|
||||
bootstrapSelfsigned: true
|
||||
# Use ClusterIssuer when set to true, otherwise use Issuer
|
||||
useClusterIssuer: false
|
||||
# Name of ClusterIssuer to use when useClusterIssuer is true
|
||||
clusterIssuer: cluster-ca
|
||||
# Name of Issuer to use when useClusterIssuer is false
|
||||
issuer: yugabyte-ca
|
||||
certificates:
|
||||
# The lifetime before cert-manager will issue a new certificate.
|
||||
# The re-issued certificates will not be automatically reloaded by the service.
|
||||
# It is necessary to provide some external means of restarting the pods.
|
||||
duration: 2160h # 90d
|
||||
renewBefore: 360h # 15d
|
||||
algorithm: RSA # ECDSA or RSA
|
||||
# Can be 2048, 4096 or 8192 for RSA
|
||||
# Or 256, 384 or 521 for ECDSA
|
||||
keySize: 2048
|
||||
|
||||
## When certManager.enabled=false, rootCA.cert and rootCA.key are used to generate TLS certs.
|
||||
## When certManager.enabled=true and boostrapSelfsigned=true, rootCA is ignored.
|
||||
## When certManager.enabled=true and bootstrapSelfsigned=false, only rootCA.cert is used
|
||||
## to verify TLS certs generated and signed by the external provider.
|
||||
rootCA:
|
||||
cert: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFXTVJRd0VnWURWUVFERXd0WmRXZGgKWW5sMFpTQkVRakFlRncweE9UQXlNRGd3TURRd01qSmFGdzB5T1RBeU1EVXdNRFF3TWpKYU1CWXhGREFTQmdOVgpCQU1UQzFsMVoyRmllWFJsSUVSQ01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCnVOMWF1aWc4b2pVMHM0OXF3QXhrT2FCaHkwcTlyaVg2akVyZWJyTHJOWDJOeHdWQmNVcWJkUlhVc3VZNS96RUQKUC9CZTNkcTFuMm9EQ2ZGVEwweGkyNFdNZExRcnJBMndCdzFtNHM1WmQzcEJ1U04yWHJkVVhkeUx6dUxlczJNbgovckJxcWRscXp6LzAyTk9TOE9SVFZCUVRTQTBSOFNMQ1RjSGxMQmRkMmdxZ1ZmemVXRlVObXhWQ2EwcHA5UENuCmpUamJJRzhJWkh5dnBkTyt3aURQM1Y1a1ZEaTkvbEtUaGUzcTFOeDg5VUNFcnRJa1pjSkYvWEs3aE90MU1sOXMKWDYzb2lVMTE1Q2svbGFGRjR6dWgrZk9VenpOVXRXeTc2RE92cm5pVGlaU0tQZDBBODNNa2l2N2VHaDVkV3owWgpsKzJ2a3dkZHJaRzVlaHhvbGhGS3pRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQXFRd0hRWURWUjBsCkJCWXdGQVlJS3dZQkJRVUhBd0VHQ0NzR0FRVUZCd01DTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFEQjVRbmlYd1ptdk52eG5VbS9sTTVFbms3VmhTUzRUZldIMHY4Q0srZWZMSVBTbwpVTkdLNXU5UzNEUWlvaU9SN1Vmc2YrRnk1QXljMmNUY1M2UXBxTCt0V1QrU1VITXNJNk9oQ05pQ1gvQjNKWERPCkd2R0RIQzBVOHo3aWJTcW5zQ2Rid05kajAyM0lwMHVqNE9DVHJ3azZjd0RBeXlwVWkwN2tkd28xYWJIWExqTnAKamVQMkwrY0hkc2dKM1N4WWpkK1kvei9IdmFrZG1RZDJTL1l2V0R3aU1SRDkrYmZXWkJVRHo3Y0QyQkxEVmU0aAp1bkFaK3NyelR2Sjd5dkVodzlHSDFyajd4Qm9VNjB5SUUrYSszK2xWSEs4WnBSV0NXMnh2eWNrYXJSKytPS2NKClFsL04wWExqNWJRUDVoUzdhOTdhQktTamNqY3E5VzNGcnhJa2tKST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
|
||||
key: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdU4xYXVpZzhvalUwczQ5cXdBeGtPYUJoeTBxOXJpWDZqRXJlYnJMck5YMk54d1ZCCmNVcWJkUlhVc3VZNS96RURQL0JlM2RxMW4yb0RDZkZUTDB4aTI0V01kTFFyckEyd0J3MW00czVaZDNwQnVTTjIKWHJkVVhkeUx6dUxlczJNbi9yQnFxZGxxenovMDJOT1M4T1JUVkJRVFNBMFI4U0xDVGNIbExCZGQyZ3FnVmZ6ZQpXRlVObXhWQ2EwcHA5UENualRqYklHOElaSHl2cGRPK3dpRFAzVjVrVkRpOS9sS1RoZTNxMU54ODlVQ0VydElrClpjSkYvWEs3aE90MU1sOXNYNjNvaVUxMTVDay9sYUZGNHp1aCtmT1V6ek5VdFd5NzZET3ZybmlUaVpTS1BkMEEKODNNa2l2N2VHaDVkV3owWmwrMnZrd2RkclpHNWVoeG9saEZLelFJREFRQUJBb0lCQUJsdW1tU3gxR1djWER1Mwpwei8wZEhWWkV4c2NsU3U0SGRmZkZPcTF3cFlCUjlmeGFTZGsxQzR2YXF1UjhMaWl6WWVtVWViRGgraitkSnlSCmpwZ2JNaDV4S1BtRkw5empwU3ZUTkN4UHB3OUF5bm5sM3dyNHZhcU1CTS9aZGpuSGttRC9kQzBadEEvL0JIZ3YKNHk4d3VpWCsvUWdVaER0Z1JNcmR1ZUZ1OVlKaFo5UE9jYXkzSkkzMFhEYjdJSS9vNFNhYnhTcFI3bTg5WjY0NwpUb3hsOEhTSzl0SUQxbkl1bHVpTmx1dHI1RzdDdE93WTBSc2N5dmZ2elg4a1d2akpLZVJVbmhMSCtXVFZOaExICjdZc0tMNmlLa1NkckMzeWVPWnV4R0pEbVdrZVgxTzNPRUVGYkc4TjVEaGNqL0lXbDh1dGt3LzYwTEthNHBCS2cKTXhtNEx3RUNnWUVBNnlPRkhNY2pncHYxLzlHZC8yb3c2YmZKcTFjM1dqQkV2cnM2ZXNyMzgrU3UvdVFneXJNcAo5V01oZElpb2dYZjVlNjV5ZlIzYVBXcjJJdWMxZ0RUNlYycDZFR2h0NysyQkF1YkIzczloZisycVNRY1lkS3pmCnJOTDdKalE4ZEVGZWdYd041cHhKOTRTTVFZNEI4Qm9hOHNJWTd3TzU4dHpVMjZoclVnanFXQ1VDZ1lFQXlVUUIKNzViWlh6MGJ5cEc5NjNwYVp0bGlJY0cvUk1XMnVPOE9rVFNYSGdDSjBob25uRm5IMGZOc1pGTHdFWEtnTTRORworU3ZNbWtUekE5eVVSMHpIMFJ4UW44L1YzVWZLT2k5RktFeWx6NzNiRkV6ZW1QSEppQm12NWQ4ZTlOenZmU0E0CkdpRTYrYnFyV3VVWWRoRWlYTnY1SFNPZ3I4bUx1TzJDbGlmNTg0a0NnWUFlZzlDTmlJWmlOODAzOHNNWFYzZWIKalI5ZDNnYXY3SjJ2UnVyeTdvNDVGNDlpUXNiQ3AzZWxnY1RnczY5eWhkaFpwYXp6OGNEVndhREpyTW16cHF4cQpWY1liaFFIblppSWM5MGRubS9BaVF2eWJWNUZqNnQ5b05VVWtreGpaV1haalJXOGtZMW55QmtDUmJWVnhER0k4CjZOV0ZoeTFGaUVVVGNJcms3WVZFQlFLQmdRREpHTVIrYWRFamtlRlUwNjVadkZUYmN0VFVPY3dzb1Foalc2akkKZVMyTThxakNYeE80NnhQMnVTeFNTWFJKV3FpckQ3NDRkUVRvRjRCaEdXS21veGI3M3pqSGxWaHcwcXhDMnJ4VQorZENxODE0VXVJR3BlOTBMdWU3QTFlRU9kRHB1WVdUczVzc1FmdTE3MG5CUWQrcEhzaHNFZkhhdmJjZkhyTGpQCjQzMmhVUUtCZ1FDZ3hMZG5Pd2JMaHZLVkhhdTdPVXQxbGpUT240SnB5bHpnb3hFRXpzaDhDK0ZKUUQ1bkFxZXEKZUpWSkNCd2VkallBSDR6MUV3cHJjWnJIN3IyUTBqT2ZFallwU1dkZGxXaWh4OTNYODZ0aG83UzJuUlYrN1hNcQpPVW9ZcVZ1WGlGMWdMM1NGeHZqMHhxV3l0d0NPTW5DZGFCb0M0Tkw3enJtL0lZOEUwSkw2MkE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo="
|
||||
## When tls.certManager.enabled=false
|
||||
## nodeCert and clientCert will be used only when rootCA.key is empty.
|
||||
## Will be ignored and genSignedCert will be used to generate
|
||||
## node and client certs if rootCA.key is provided.
|
||||
## cert and key are base64 encoded content of certificate and key.
|
||||
nodeCert:
|
||||
cert: ""
|
||||
key: ""
|
||||
clientCert:
|
||||
cert: ""
|
||||
key: ""
|
||||
|
||||
gflags:
|
||||
master:
|
||||
default_memory_limit_to_ram_ratio: 0.85
|
||||
tserver: {}
|
||||
# use_cassandra_authentication: false
|
||||
|
||||
PodManagementPolicy: Parallel
|
||||
|
||||
enableLoadBalancer: true
|
||||
|
||||
ybc:
|
||||
enabled: false
|
||||
## https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container
|
||||
## Use the above link to learn more about Kubernetes resources configuration.
|
||||
# resources:
|
||||
# requests:
|
||||
# cpu: "1"
|
||||
# memory: 1Gi
|
||||
# limits:
|
||||
# cpu: "1"
|
||||
# memory: 1Gi
|
||||
|
||||
ybCleanup: {}
|
||||
## https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container
|
||||
## Use the above link to learn more about Kubernetes resources configuration.
|
||||
# resources:
|
||||
# requests:
|
||||
# cpu: "1"
|
||||
# memory: 1Gi
|
||||
# limits:
|
||||
# cpu: "1"
|
||||
# memory: 1Gi
|
||||
|
||||
domainName: "cluster.local"
|
||||
|
||||
serviceEndpoints:
|
||||
- name: "yb-master-ui"
|
||||
type: LoadBalancer
|
||||
annotations: {}
|
||||
clusterIP: ""
|
||||
## Sets the Service's externalTrafficPolicy
|
||||
externalTrafficPolicy: ""
|
||||
app: "yb-master"
|
||||
loadBalancerIP: ""
|
||||
ports:
|
||||
http-ui: "7000"
|
||||
|
||||
- name: "yb-tserver-service"
|
||||
type: LoadBalancer
|
||||
annotations: {}
|
||||
clusterIP: ""
|
||||
## Sets the Service's externalTrafficPolicy
|
||||
externalTrafficPolicy: ""
|
||||
app: "yb-tserver"
|
||||
loadBalancerIP: ""
|
||||
ports:
|
||||
tcp-yql-port: "9042"
|
||||
tcp-yedis-port: "6379"
|
||||
tcp-ysql-port: "5433"
|
||||
|
||||
Services:
|
||||
- name: "yb-masters"
|
||||
label: "yb-master"
|
||||
skipHealthChecks: false
|
||||
memory_limit_to_ram_ratio: 0.85
|
||||
ports:
|
||||
http-ui: "7000"
|
||||
tcp-rpc-port: "7100"
|
||||
|
||||
- name: "yb-tservers"
|
||||
label: "yb-tserver"
|
||||
skipHealthChecks: false
|
||||
ports:
|
||||
http-ui: "9000"
|
||||
tcp-rpc-port: "9100"
|
||||
tcp-yql-port: "9042"
|
||||
tcp-yedis-port: "6379"
|
||||
tcp-ysql-port: "5433"
|
||||
http-ycql-met: "12000"
|
||||
http-yedis-met: "11000"
|
||||
http-ysql-met: "13000"
|
||||
grpc-ybc-port: "18018"
|
||||
|
||||
|
||||
## Should be set to true only if Istio is being used. This also adds
|
||||
## the Istio sidecar injection labels to the pods.
|
||||
## TODO: remove this once
|
||||
## https://github.com/yugabyte/yugabyte-db/issues/5641 is fixed.
|
||||
##
|
||||
istioCompatibility:
|
||||
enabled: false
|
||||
|
||||
## Settings required when using multicluster environment.
|
||||
multicluster:
|
||||
## Creates a ClusterIP service for each yb-master and yb-tserver
|
||||
## pod.
|
||||
createServicePerPod: false
|
||||
## creates a ClusterIP service whos name does not have release name
|
||||
## in it. A common service across different clusters for automatic
|
||||
## failover. Useful when using new naming style.
|
||||
createCommonTserverService: false
|
||||
|
||||
## Enable it to deploy YugabyteDB in a multi-cluster services enabled
|
||||
## Kubernetes cluster (KEP-1645). This will create ServiceExport.
|
||||
## GKE Ref - https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-services#registering_a_service_for_export
|
||||
## You can use this gist for the reference to deploy the YugabyteDB in a multi-cluster scenario.
|
||||
## Gist - https://gist.github.com/baba230896/78cc9bb6f4ba0b3d0e611cd49ed201bf
|
||||
createServiceExports: false
|
||||
|
||||
## Mandatory variable when createServiceExports is set to true.
|
||||
## Use: In case of GKE, you need to pass GKE Hub Membership Name.
|
||||
## GKE Ref - https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-services#enabling
|
||||
kubernetesClusterId: ""
|
||||
|
||||
## mcsApiVersion is used for the MCS resources created by the
|
||||
## chart. Set to net.gke.io/v1 when using GKE MCS.
|
||||
mcsApiVersion: "multicluster.x-k8s.io/v1alpha1"
|
||||
|
||||
serviceMonitor:
|
||||
## If true, two ServiceMonitor CRs are created. One for yb-master
|
||||
## and one for yb-tserver
|
||||
## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#servicemonitor
|
||||
##
|
||||
enabled: false
|
||||
## interval is the default scrape_interval for all the endpoints
|
||||
interval: 30s
|
||||
## extraLabels can be used to add labels to the ServiceMonitors
|
||||
## being created
|
||||
extraLabels: {}
|
||||
# release: prom
|
||||
|
||||
## Configurations of ServiceMonitor for yb-master
|
||||
master:
|
||||
enabled: true
|
||||
port: "http-ui"
|
||||
interval: ""
|
||||
path: "/prometheus-metrics"
|
||||
|
||||
## Configurations of ServiceMonitor for yb-tserver
|
||||
tserver:
|
||||
enabled: true
|
||||
port: "http-ui"
|
||||
interval: ""
|
||||
path: "/prometheus-metrics"
|
||||
ycql:
|
||||
enabled: true
|
||||
port: "http-ycql-met"
|
||||
interval: ""
|
||||
path: "/prometheus-metrics"
|
||||
ysql:
|
||||
enabled: true
|
||||
port: "http-ysql-met"
|
||||
interval: ""
|
||||
path: "/prometheus-metrics"
|
||||
yedis:
|
||||
enabled: true
|
||||
port: "http-yedis-met"
|
||||
interval: ""
|
||||
path: "/prometheus-metrics"
|
||||
|
||||
commonMetricRelabelings:
|
||||
# https://git.io/JJW5p
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- sourceLabels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
targetLabel: "saved_name"
|
||||
replacement: "$1"
|
||||
# The following basically retrofit the handler_latency_* metrics to label format.
|
||||
- sourceLabels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(.*)"
|
||||
targetLabel: "server_type"
|
||||
replacement: "$1"
|
||||
- sourceLabels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(.*)"
|
||||
targetLabel: "service_type"
|
||||
replacement: "$2"
|
||||
- sourceLabels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(_sum|_count)?"
|
||||
targetLabel: "service_method"
|
||||
replacement: "$3"
|
||||
- sourceLabels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(_sum|_count)?"
|
||||
targetLabel: "__name__"
|
||||
replacement: "rpc_latency$4"
|
||||
|
||||
resources: {}
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
affinity: {}
|
||||
|
||||
statefulSetAnnotations: {}
|
||||
|
||||
networkAnnotation: {}
|
||||
|
||||
commonLabels: {}
|
||||
|
||||
## @param dnsPolicy DNS Policy for pod
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
|
||||
## E.g.
|
||||
## dnsPolicy: ClusterFirst
|
||||
dnsPolicy: ""
|
||||
## @param dnsConfig DNS Configuration pod
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
|
||||
## E.g.
|
||||
## dnsConfig:
|
||||
## options:
|
||||
## - name: ndots
|
||||
## value: "4"
|
||||
dnsConfig: {}
|
||||
|
||||
|
||||
master:
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#affinity-v1-core
|
||||
## This might override the default affinity from service.yaml
|
||||
# To successfully merge, we need to follow rules for merging nodeSelectorTerms that kubernentes
|
||||
# has. Each new node selector term is ORed together, and each match expression or match field in
|
||||
# a single selector is ANDed together.
|
||||
# This means, if a pod needs to be scheduled on a label 'custom_label_1' with a value
|
||||
# 'custom_value_1', we need to add this 'subterm' to each of our pre-defined node affinity
|
||||
# terms.
|
||||
#
|
||||
# Pod anti affinity is a simpler merge. Each term is applied separately, and the weight is tracked.
|
||||
# The pod that achieves the highest weight is selected.
|
||||
## Example.
|
||||
# affinity:
|
||||
# podAntiAffinity:
|
||||
# requiredDuringSchedulingIgnoredDuringExecution:
|
||||
# - labelSelector:
|
||||
# matchExpressions:
|
||||
# - key: app
|
||||
# operator: In
|
||||
# values:
|
||||
# - "yb-master"
|
||||
# topologyKey: kubernetes.io/hostname
|
||||
#
|
||||
# For further examples, see examples/yugabyte/affinity_overrides.yaml
|
||||
affinity: {}
|
||||
|
||||
## Extra environment variables passed to the Master pods.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#envvar-v1-core
|
||||
## Example:
|
||||
# extraEnv:
|
||||
# - name: NODE_IP
|
||||
# valueFrom:
|
||||
# fieldRef:
|
||||
# fieldPath: status.hostIP
|
||||
extraEnv: []
|
||||
|
||||
# secretEnv variables are used to expose secrets data as env variables in the master pod.
|
||||
# TODO Add namespace also to support copying secrets from other namespace.
|
||||
# secretEnv:
|
||||
# - name: MYSQL_LDAP_PASSWORD
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: secretName
|
||||
# key: password
|
||||
secretEnv: []
|
||||
|
||||
## Annotations to be added to the Master pods.
|
||||
podAnnotations: {}
|
||||
|
||||
## Labels to be added to the Master pods.
|
||||
podLabels: {}
|
||||
|
||||
## Tolerations to be added to the Master pods.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#toleration-v1-core
|
||||
## Example:
|
||||
# tolerations:
|
||||
# - key: dedicated
|
||||
# operator: Equal
|
||||
# value: experimental
|
||||
# effect: NoSchedule
|
||||
tolerations: []
|
||||
|
||||
## Extra volumes
|
||||
## extraVolumesMounts are mandatory for each extraVolumes.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volume-v1-core
|
||||
## Example:
|
||||
# extraVolumes:
|
||||
# - name: custom-nfs-vol
|
||||
# persistentVolumeClaim:
|
||||
# claimName: some-nfs-claim
|
||||
extraVolumes: []
|
||||
|
||||
## Extra volume mounts
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volumemount-v1-core
|
||||
## Example:
|
||||
# extraVolumeMounts:
|
||||
# - name: custom-nfs-vol
|
||||
# mountPath: /home/yugabyte/nfs-backup
|
||||
extraVolumeMounts: []
|
||||
|
||||
## Set service account for master DB pods. The service account
|
||||
## should exist in the namespace where the master DB pods are brought up.
|
||||
serviceAccount: ""
|
||||
|
||||
|
||||
tserver:
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#affinity-v1-core
|
||||
## This might override the default affinity from service.yaml
|
||||
# To successfully merge, we need to follow rules for merging nodeSelectorTerms that kubernentes
|
||||
# has. Each new node selector term is ORed together, and each match expression or match field in
|
||||
# a single selector is ANDed together.
|
||||
# This means, if a pod needs to be scheduled on a label 'custom_label_1' with a value
|
||||
# 'custom_value_1', we need to add this 'subterm' to each of our pre-defined node affinity
|
||||
# terms.
|
||||
#
|
||||
# Pod anti affinity is a simpler merge. Each term is applied separately, and the weight is tracked.
|
||||
# The pod that achieves the highest weight is selected.
|
||||
## Example.
|
||||
# affinity:
|
||||
# podAntiAffinity:
|
||||
# requiredDuringSchedulingIgnoredDuringExecution:
|
||||
# - labelSelector:
|
||||
# matchExpressions:
|
||||
# - key: app
|
||||
# operator: In
|
||||
# values:
|
||||
# - "yb-tserver"
|
||||
# topologyKey: kubernetes.io/hostname
|
||||
# For further examples, see examples/yugabyte/affinity_overrides.yaml
|
||||
affinity: {}
|
||||
|
||||
## Extra environment variables passed to the TServer pods.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#envvar-v1-core
|
||||
## Example:
|
||||
# extraEnv:
|
||||
# - name: NODE_IP
|
||||
# valueFrom:
|
||||
# fieldRef:
|
||||
# fieldPath: status.hostIP
|
||||
extraEnv: []
|
||||
|
||||
## secretEnv variables are used to expose secrets data as env variables in the tserver pods.
|
||||
## If namespace field is not specified we assume that user already
|
||||
## created the secret in the same namespace as DB pods.
|
||||
## Example
|
||||
# secretEnv:
|
||||
# - name: MYSQL_LDAP_PASSWORD
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: secretName
|
||||
# namespace: my-other-namespace-with-ldap-secret
|
||||
# key: password
|
||||
secretEnv: []
|
||||
|
||||
## Annotations to be added to the TServer pods.
|
||||
podAnnotations: {}
|
||||
|
||||
## Labels to be added to the TServer pods.
|
||||
podLabels: {}
|
||||
|
||||
## Tolerations to be added to the TServer pods.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#toleration-v1-core
|
||||
## Example:
|
||||
# tolerations:
|
||||
# - key: dedicated
|
||||
# operator: Equal
|
||||
# value: experimental
|
||||
# effect: NoSchedule
|
||||
tolerations: []
|
||||
|
||||
## Sets the --server_broadcast_addresses flag on the TServer, no
|
||||
## preflight checks are done for this address. You might need to add
|
||||
## `use_private_ip: cloud` to the gflags.master and gflags.tserver.
|
||||
serverBroadcastAddress: ""
|
||||
|
||||
## Extra volumes
|
||||
## extraVolumesMounts are mandatory for each extraVolumes.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volume-v1-core
|
||||
## Example:
|
||||
# extraVolumes:
|
||||
# - name: custom-nfs-vol
|
||||
# persistentVolumeClaim:
|
||||
# claimName: some-nfs-claim
|
||||
extraVolumes: []
|
||||
|
||||
## Extra volume mounts
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volumemount-v1-core
|
||||
## Example:
|
||||
# extraVolumeMounts:
|
||||
# - name: custom-nfs-vol
|
||||
# path: /home/yugabyte/nfs-backup
|
||||
extraVolumeMounts: []
|
||||
|
||||
## Set service account for tserver DB pods. The service account
|
||||
## should exist in the namespace where the tserver DB pods are brought up.
|
||||
serviceAccount: ""
|
||||
|
||||
helm2Legacy: false
|
||||
|
||||
ip_version_support: "v4_only" # v4_only, v6_only are the only supported values at the moment
|
||||
|
||||
# For more https://docs.yugabyte.com/latest/reference/configuration/yugabyted/#environment-variables
|
||||
authCredentials:
|
||||
ysql:
|
||||
user: ""
|
||||
password: ""
|
||||
database: ""
|
||||
ycql:
|
||||
user: ""
|
||||
password: ""
|
||||
keyspace: ""
|
||||
|
||||
oldNamingStyle: true
|
||||
|
||||
preflight:
|
||||
# Set to true to skip disk IO check, DNS address resolution, and
|
||||
# port bind checks
|
||||
skipAll: false
|
||||
# Set to true to skip port bind checks
|
||||
skipBind: false
|
||||
|
||||
## Set to true to skip ulimit verification
|
||||
## SkipAll has higher priority
|
||||
skipUlimit: false
|
||||
|
||||
## Pod securityContext
|
||||
## Ref: https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context
|
||||
## The following configuration runs YB-Master and YB-TServer as a non-root user
|
||||
podSecurityContext:
|
||||
enabled: false
|
||||
## Mark it false, if you want to stop the non root user validation
|
||||
runAsNonRoot: true
|
||||
fsGroup: 10001
|
||||
runAsUser: 10001
|
||||
runAsGroup: 10001
|
||||
|
||||
## Added to handle old universe which has volume annotations
|
||||
## K8s universe <= 2.5 to >= 2.6
|
||||
legacyVolumeClaimAnnotations: false
|
|
@ -0,0 +1,19 @@
|
|||
# Create YugaByte specific service account
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: yugabyte-helm
|
||||
namespace: kube-system
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: yugabyte-helm
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-admin
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: yugabyte-helm
|
||||
namespace: kube-system
|
|
@ -0,0 +1,21 @@
|
|||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
|
@ -0,0 +1,22 @@
|
|||
annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB Anywhere
|
||||
catalog.cattle.io/kube-version: '>=1.18-0'
|
||||
catalog.cattle.io/release-name: yugaware
|
||||
charts.openshift.io/name: yugaware
|
||||
apiVersion: v2
|
||||
appVersion: 2.18.9.0-b17
|
||||
description: YugabyteDB Anywhere provides deployment, orchestration, and monitoring
|
||||
for managing YugabyteDB clusters. YugabyteDB Anywhere can create a YugabyteDB cluster
|
||||
with multiple pods provided by Kubernetes or OpenShift and logically grouped together
|
||||
to form one logical distributed database.
|
||||
home: https://www.yugabyte.com
|
||||
icon: file://assets/icons/yugaware.jpg
|
||||
kubeVersion: '>=1.18-0'
|
||||
maintainers:
|
||||
- email: sanketh@yugabyte.com
|
||||
name: Sanketh Indarapu
|
||||
- email: gjalla@yugabyte.com
|
||||
name: Govardhan Reddy Jalla
|
||||
name: yugaware
|
||||
version: 2.18.9
|
|
@ -0,0 +1,7 @@
|
|||
YugabyteDB Anywhere gives you the simplicity and support to deliver a private database-as-a-service (DBaaS) at scale. Use YugabyteDB Anywhere to deploy YugabyteDB across any cloud anywhere in the world with a few clicks, simplify day 2 operations through automation, and get the services needed to realize business outcomes with the database.
|
||||
|
||||
YugabyteDB Anywhere can be deployed using this Helm chart. Detailed documentation is available at:
|
||||
- [Install YugabyteDB Anywhere software - Kubernetes](https://docs.yugabyte.com/preview/yugabyte-platform/install-yugabyte-platform/install-software/kubernetes/)
|
||||
- [Install YugabyteDB Anywhere software - OpenShift (Helm based)](https://docs.yugabyte.com/preview/yugabyte-platform/install-yugabyte-platform/install-software/openshift/#helm-based-installation)
|
||||
|
||||
[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/yugabyte)](https://artifacthub.io/packages/search?repo=yugabyte)
|
|
@ -0,0 +1,5 @@
|
|||
YugabyteDB Anywhere gives you the simplicity and support to deliver a private database-as-a-service (DBaaS) at scale. Use YugabyteDB Anywhere to deploy YugabyteDB across any cloud anywhere in the world with a few clicks, simplify day 2 operations through automation, and get the services needed to realize business outcomes with the database.
|
||||
|
||||
YugabyteDB Anywhere can be deployed using this helm chart. Detailed documentation is available at <https://docs.yugabyte.com/preview/yugabyte-platform/install-yugabyte-platform/install-software/kubernetes/>
|
||||
|
||||
[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/yugabyte)](https://artifacthub.io/packages/search?repo=yugabyte)
|
|
@ -0,0 +1,24 @@
|
|||
# OCP compatible values for yugaware
|
||||
|
||||
image:
|
||||
|
||||
repository: quay.io/yugabyte/yugaware-ubi
|
||||
|
||||
postgres:
|
||||
registry: registry.redhat.io
|
||||
tag: 1-88.1661531722
|
||||
name: rhscl/postgresql-13-rhel7
|
||||
|
||||
prometheus:
|
||||
registry: registry.redhat.io
|
||||
tag: v4.11.0
|
||||
name: openshift4/ose-prometheus
|
||||
|
||||
rbac:
|
||||
create: false
|
||||
|
||||
ocpCompatibility:
|
||||
enabled: true
|
||||
|
||||
securityContext:
|
||||
enabled: false
|
|
@ -0,0 +1,267 @@
|
|||
---
|
||||
questions:
|
||||
## Default images for yugaware pod
|
||||
- variable: questions.defaultYBPlatform
|
||||
default: true
|
||||
label: Default Yugabyte Platform configurations
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Yugabyte Platform"
|
||||
subquestions:
|
||||
- variable: image.repository
|
||||
default: "quay.io/yugabyte/yugaware"
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform image repository
|
||||
description: "Yugabyte Platform image repository"
|
||||
- variable: image.tag
|
||||
default: "2.5.1.0-b153"
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform image tag
|
||||
description: "Yugabyte Platform image tag"
|
||||
- variable: image.pullPolicy
|
||||
default: "IfNotPresent"
|
||||
required: false
|
||||
label: Yugabyte Platform image pull policy
|
||||
description: "Yugabyte Platform image pull policy"
|
||||
type: enum
|
||||
options:
|
||||
- "Always"
|
||||
- "IfNotPresent"
|
||||
- variable: image.pullSecret
|
||||
default: "yugabyte-k8s-pull-secret"
|
||||
required: false
|
||||
type: secret
|
||||
label: Yugabyte Platform image pull secret
|
||||
description: "Yugabyte Platform image pull secret"
|
||||
- variable: yugaware.storage
|
||||
default: "100Gi"
|
||||
required: false
|
||||
type: string
|
||||
label: Storage
|
||||
description: "Storage"
|
||||
- variable: yugaware.storageClass
|
||||
default: ""
|
||||
required: false
|
||||
type: storageclass
|
||||
label: Storage Class
|
||||
description: "Storage Class"
|
||||
- variable: yugaware.resources.requests.cpu
|
||||
default: "2"
|
||||
required: false
|
||||
type: string
|
||||
label: CPU request for Yugabyte Platform
|
||||
description: "CPU request for Yugabyte Platform"
|
||||
- variable: yugaware.resources.requests.memory
|
||||
default: "4Gi"
|
||||
required: false
|
||||
type: string
|
||||
label: Memory request for Yugabyte Platform
|
||||
description: "Memory request for Yugabyte Platform"
|
||||
- variable: yugaware.service.enabled
|
||||
default: true
|
||||
description: "Service used to access the Yugabyte Platform"
|
||||
label: Create service for Yugabyte Platform
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Platform Service"
|
||||
subquestions:
|
||||
- variable: yugaware.service.ip
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform Service IP
|
||||
description: "Yugabyte Platform Service IP"
|
||||
- variable: yugaware.service.type
|
||||
default: "LoadBalancer"
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform Service type
|
||||
description: "Yugabyte Platform Service type"
|
||||
- variable: tls.enabled
|
||||
default: false
|
||||
required: false
|
||||
type: boolean
|
||||
label: Enable TLS on Yugabyte Platform
|
||||
description: "Enable TLS on Yugabyte Platform"
|
||||
- variable: tls.hostname
|
||||
default: "localhost"
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform TLS hostname
|
||||
description: "Yugabyte Platform TLS hostname"
|
||||
- variable: tls.certificate
|
||||
default: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZDVENDQXZHZ0F3SUJBZ0lVTlhvN2N6T2dyUWQrU09wOWdNdE00b1Vva3hFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0ZERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNQjRYRFRJeE1EUXdOakExTXpnMU4xb1hEVE14TURRdwpOREExTXpnMU4xb3dGREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMUxsSTFBLzRPOVIzSkNlN1N2MUxYVXhDSmxoTWpIWUoxV1FNVmcvai82RHkKazRTTmY0MkFLQjI0dFJFK2lEWTBNaTJrRWhJcVZ4TFdPN0hkWHVSN0tYNGxSZWFVVkRFTUtYUWNQUC9QWDZkbwpwZVZTUFpSVjVHNHNxTElXUFFkTVdIam9IQWx1aml5dGJsSVJUUWdLU3QrMmpuREFDN0dxRURMREdhNXRUWEM2CktRWkNtOERlaklOUTMzaGU2TDN0Q2hBRnhJM1pwY21sR0twbzdKVXJSUG14Mk9zTHFRcTB5dEVVK0lGZGppWHEKaHJLeFR0NUhHM3M3ZUNWaTRXdlZPelVGUitJbWRlQzBRZTBXeG5iZlZUMnJkVitQL1FaVXhWSEVtWnBPc0k2LwpmczhlK1dsMlduWXY1TTg5MWkxZER3Zi9lMDdiN20xQVRKdDRtTGRldzBtd1V4UGFGT2pDMDh6cU94NmF0cGhLClU1eHNWQmhGNVhyME9DeTQyMzN0MU5URXdWUEFDOFcwQmhHdldTRXBQTXNTKzM1b2lueEFrcFQzL01ibFpjNisKcXhSYUh6MHJhSksvVGIzelVKVWxWZFkxbGl5MVYyVjNxWEU2NWlsOUFHZ2pIaHhBNFBwSktCbzZ0WVRUT3pnTworL25mc0toMk95aE8zUWxBZ0JFUHlYUm5wL0xGSTVuQ2gzdjNiOXlabFNrSk05NkVoWEJ1bHhWUWN3L2p3N2NxCkRLSlBEeHFUQy9rWUs1V0FVZGhkWG1KQkRNMFBLcngzUGVOYjRsYnQzSTFIZW1QRDBoZktiWFd6alhiVTJQdWQKdjZmT0dXTDRLSFpaem9KZ1ljMFovRXRUMEpCR09GM09mMW42N2c5dDRlUnAzbEVSL09NM0FPY1dRbWFvOHlVQwpBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGTU00SjA4WG8wUGY1cTlOSWZiMGYyRzZqc1FoTUI4R0ExVWRJd1FZCk1CYUFGTU00SjA4WG8wUGY1cTlOSWZiMGYyRzZqc1FoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFBRmxrWVJkdzA0Zm9vT29BelUyaU5ORGV1aiszemhIeFQ5eU9iSkdwREZIRitoZQpuY1ZRWGZpMitHNjBWY0xuZERsWFhmbDZLOSs4ME55aEg4QjR1UEJNTWhoWG01MjJmYnJac1dFcnR3WE1rM2prClZ5UVA3MGk2NHE1ZGVrZzhoYzI0SXhFUlVsam9XM2lDTTdrb0VxaG15VkpGeDNxMVdobFEwdzNkWVpMQVNRclYKU0RpL2JGWjlqOXVtWVdoc0Y4QjFPSThPVjNlL0YyakU1UCtoTlJJazAzbW9zWE1Rdy9iZ3ZzV0hvSkZ5blB4UApHNGUzUjBob2NnbzI0Q2xOQ21YMWFBUms5c1pyN2h0NlVsM1F1d0dMdzZkK2I5emxrUW56TzFXQzc5ekVNU1R0ClRRRzFNT2ZlL2dTVkR3dThTSnpBOHV1Z0pYTktWWkxCZlpaNW41Tk9sOHdpOVVLa1BVUW4wOHo3VWNYVDR5ZnQKZHdrbnZnWDRvMFloUnNQNHpPWDF6eWxObzhqRDhRNlV1SkdQSksrN1JnUm8zVERPV3k4MEZpUzBxRmxrSFdMKwptT0pUWGxzaEpwdHE5b1c1eGx6N1lxTnFwZFVnRmNyTjJLQWNmaGVlNnV3SUFnOFJteTQvRlhRZjhKdXluSG5oClFhVlFnTEpEeHByZTZVNk5EdWg1Y1VsMUZTcWNCUGFPY0x0Q0ViVWg5ckQxajBIdkRnTUUvTTU2TGp1UGdGZlEKMS9xeXlDUkFjc2NCSnVMYjRxcXRUb25tZVZ3T1BBbzBsNXBjcC9JcjRTcTdwM0NML0kwT0o1SEhjcmY3d3JWSgpQVWgzdU1LbWVHVDRyeDdrWlQzQzBXenhUU0loc0lZOU12MVRtelF4MEprQm93c2NYaUYrcXkvUkl5UVgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform TLS Certificate
|
||||
description: "Yugabyte Platform TLS Certificate (base64 encoded)"
|
||||
- variable: tls.key
|
||||
default: "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFV1VWpVRC9nNzFIY2sKSjd0Sy9VdGRURUltV0V5TWRnblZaQXhXRCtQL29QS1RoSTEvallBb0hiaTFFVDZJTmpReUxhUVNFaXBYRXRZNwpzZDFlNUhzcGZpVkY1cFJVTVF3cGRCdzgvODlmcDJpbDVWSTlsRlhrYml5b3NoWTlCMHhZZU9nY0NXNk9MSzF1ClVoRk5DQXBLMzdhT2NNQUxzYW9RTXNNWnJtMU5jTG9wQmtLYndONk1nMURmZUY3b3ZlMEtFQVhFamRtbHlhVVkKcW1qc2xTdEUrYkhZNnd1cENyVEswUlQ0Z1YyT0plcUdzckZPM2tjYmV6dDRKV0xoYTlVN05RVkg0aVoxNExSQgo3UmJHZHQ5VlBhdDFYNC85QmxURlVjU1ptazZ3anI5K3p4NzVhWFphZGkva3p6M1dMVjBQQi85N1R0dnViVUJNCm0zaVl0MTdEU2JCVEU5b1U2TUxUek9vN0hwcTJtRXBUbkd4VUdFWGxldlE0TExqYmZlM1UxTVRCVThBTHhiUUcKRWE5WklTazh5eEw3Zm1pS2ZFQ1NsUGY4eHVWbHpyNnJGRm9mUFN0b2tyOU52Zk5RbFNWVjFqV1dMTFZYWlhlcApjVHJtS1gwQWFDTWVIRURnK2trb0dqcTFoTk03T0E3NytkK3dxSFk3S0U3ZENVQ0FFUS9KZEdlbjhzVWptY0tICmUvZHYzSm1WS1FrejNvU0ZjRzZYRlZCekQrUER0eW9Nb2s4UEdwTUwrUmdybFlCUjJGMWVZa0VNelE4cXZIYzkKNDF2aVZ1M2NqVWQ2WThQU0Y4cHRkYk9OZHRUWSs1Mi9wODRaWXZnb2Rsbk9nbUJoelJuOFMxUFFrRVk0WGM1LwpXZnJ1RDIzaDVHbmVVUkg4NHpjQTV4WkNacWp6SlFJREFRQUJBb0lDQUFmY2lScDlOSmxSY3MyOVFpaTFUN0cwCi9jVFpBb3MyV1lxdlZkMWdYUGEzaGY5NXFKa01LNjVQMnVHbUwzOXRNV1NoVnl6cnl2REkyMjM5VnNjSS9wdzcKOHppd0dzODV1TTlYWVN2SDhHd0NqZFdEc2hSZ2hRUWFKa0JkeElDZzRtdHFuSGxjeDk4dE80T1dPTmwxOEp0dgp4UmxpaFZacFRIV295cGtLWHpPN2RNWExXMjdTSStkaGV2Mm5QeXF1eWpIVEFjT1AwbmxVQ0d2dThFMjkvWWxoCkNQZVJTQzhKSEVGYWxNSFNWaGpJd2ZBVWJvVVJwZU1ZSE15RjVTK2JncGZiajhSbVVUR09DbHRkWGJnYjhJai8KN0hROEFlQkIrYVFKTDVEVnFRN1JWN1ppQlMwR2ZyODlHdXdEMUs4em9mcktPdURkdXpjR2hwZk9MeGpGdmhTOApSQ2Y1Z3BFMzg0aWlHc2tWZC9mZDJLK3NhSmk0L09HbHo0aHhhc1hDcTN1TXB5OTZPNFRrMXZzM3BXdWZNVmJXCnR2d1Mrcjhvbk9uOXZqa3lqOU11eUpId1BpSlNGMUt0ZzhPUU5WMlVST0xXcHlYMWk4Z2xoMXdSelRTQ2diQnMKZ3ZxWkFvaU1pWFh3SlVXN3Zpb0RLZjI0TnZvcjViaVNzeUh0MHVKUVZJaW1iK1prTFJwTWdwRlkyTlcrTnd6LwoxOW9DS2ZUVVpWNkJia09IK0NoOUowLy9hTTRGNnUvMTI4V0UxalJQU05mdWQ0b0dpdGVPNXRsRDNWSXRsb1hlCjNyWVMrcTNuYXU1RStWc2FRZGFVNzhrSnpXYmUrWURmQ1JwWGd6TkloSkMyQ1k5d0RSK3hIaVFwbzdLSHV6dngKUkpuRjhIcGwzdWhIdWxEam44dEpBb0lCQVFEeGxhVVIwN1l6TGF2OVZtamZCenpZMjcwOU9tWnhpa3NtRnlhWApKTkJMQVB3SGdXOEVCUHdKOEprSDhXR1NTekp1OXZGd1JDVEVqZ1J5dWUvS05DWnNmUWF2UDg3dzhablJHaEhjCklHUUV1MFN3bmJzZXFJK1VWa0M5amZjaFE4dlowM0dQTGZ6bWpsSW9PNkNLTVM3TlV2Ynk5MksvOHRVVWRtWWgKMmJJa2N4V0J1RDJoenh3K1ZId3ArWktMQ0FPZi9sOG8vQ20xQ1dZSFNGdVYzTkl3T016Z2FKaExJODJNR08zQwpuODZTMXcweGc2MHB5dUV6L0hXZS9JMFZkRGNsWlgyNC9jalVBb01kQlkvSGY4Tkh2ZUNhZExQeXI3eGpRY2NLClAzN0RhdFRyK2RTZ2RoVkxzUDRRRzVVZEZxNUlMSHoxTXBkb2xXZ2pDSlZqcTZMekFvSUJBUURoYXNYdVRzMDIKNEkvYkRlSGRZSmw2Q1NzVUh2NmJXL3dpYlRhd2dpbDh5RUNWS2x6eFY4eENwWnoxWVhRQlY1YnVvQlArbjZCWApnVHgzTTJHc2R5UU1xdGRCWG9qdGp1czB6ekFNQVQzOWNmdWlHMGR0YXF3eWJMVlEwYThDZnFmMDVyUmZ0ekVmCmtTUDk2d01kVUEyTGdCbnU4akwzOU41UkxtK2RpZUdxeDAwYmJTa3l5UE9HNHIvcDl6KzN6TmVmeUhmbm94bTkKUnQza1RpeGhVNkd4UGhOSnZpWEUrWUpwT0dKVXMvK2dUWWpjUE1zRW9ONHIyR215cUs3S21NZExFa3Y1SHliWgprbmNsV2FMVFlhNEpjMjJUaWZJd01NTWMwaCtBMkJVckdjZFZ6MTA0UXluUFZQZDdXcEszenhqcjRPUHh1YnQ2CjZvTWk2REdRSVNlSEFvSUJBUURTK1YyVHFQRDMxczNaU3VvQXc2Qld2ZWVRbmZ5eThSUFpxdVFQb0oycXNxeG0KblpsbXlEZVhNcDloK1dHOVVhQTBtY0dWeWx6VnJqU2lRRkR4cEFOZVFQMWlkSFh6b3ZveVN2TUg2dDJONkVELwpnRy9XUVZ4S0xkMFI3UFhCL2lQN0VaV2RkWXJqaWF5ajZCYTJPR2RuOWlrbFcvZklLM2Y4QzczN2w5TGoxQUVYCkxOL2QvREh0R1BqcDYwTVgyYUxZeVZzdlBxL3BvdENRVVpkeDA4dFhRM05nRXRmVTN1cDFpNXV2bU1IZEtLTWoKOTV0MDRQRTA1aWVOOVgzOEcyYkJhTldYaFVJcUxCdDJiOUgxWmxVU3hQWnR6TGNObkgwSHJYejJMU2MxMzRrYwpueXdhQ2FWbFdhYzJSL0E3Mi8vTmxkUjJpWDBDWDEvM0lGcmVGUmtUQW9JQkFBbGt0S2pRbWRhZWx3QU8zUW1uCm05MnRBaUdOaFJpZVJheDlscGpXWTdveWNoYUZOR2hPTzFIUHF2SEN4TjNGYzZHd0JBVkpTNW81NVhZbUt2elAKM2kyMDlORmhpaDAwSm5NRjZ6K2swWnQ5STNwRzNyd2RoTjE1RURrMDg3RUw3QjNWZTFDOXhvdEZOaFcvdEZxRgpXbnNrdEcvem9kSVpYeVpNNUJQUmloamV3MFRRVUxZd0Q0M2daeFR0MjdiaUQxNDJNV0R5dUFEZU1pTHdhd01IClJDYXBxbzRaSVdQSzdmZEtoVFo0WmIrZFc0V3A5dC9UZ0U2ZGJ4SWwyMXJQOFFZYzFoT2tpNjduWHBXczNZOG4KYytRcTdqY0d1WlB1aEVMd01xWGcyMGozZ3duOVlTb1dDbWo4Wm0rNmY0Q3ZYWjkrdUtEN0YyZncyOVFaanU4dApvb01DZ2dFQkFPbVVHZ1VoT0tUVys1eEpkZlFKRUVXUncyVFF6Z2l6dSt3aVkzaDYrYXNTejRNY0srVGx6bWxVCmFHT013dFhTUzc0RXIxVmlCVXMrZnJKekFPR21IV0ExZWdtaGVlY1BvaE9ybTh5WkVueVJOSkRhWC9UUXBSUnEKaVdoWENBbjJTWFQxcFlsYVBzMjdkbXpFWnQ3UlVUSkJZZ1hHZXQ4dXFjUXZaVDJZK3N6cHFNV3UzaEpWdmIxdgpZNGRJWE12RG1aV1BPVjFwbHJEaTVoc214VW05TDVtWk1IblllNzFOYkhsaEIxK0VUNXZmWFZjOERzU1RRZWRRCitDRHJKNGQ0em85dFNCa2pwYTM5M2RDRjhCSURESUQyWkVJNCtBVW52NWhTNm82NitOLzBONlp3cXkwc2pKY0cKQ21LeS9tNUpqVzFJWDMxSmZ1UU5Ldm9YNkRFN0Zkaz0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo="
|
||||
required: false
|
||||
type: string
|
||||
label: Yugabyte Platform TLS key
|
||||
description: "Yugabyte Platform TLS key (based64 encoded)"
|
||||
## Postgres configurations
|
||||
- variable: questions.defaultPostgres
|
||||
default: true
|
||||
description: "Use default postgres configurations"
|
||||
label: Use default postgres configurations
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Postgres"
|
||||
subquestions:
|
||||
- variable: image.postgres.registry
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: Postgres image registry
|
||||
description: "Postgres image registry"
|
||||
- variable: image.postgres.tag
|
||||
default: "11.5"
|
||||
required: false
|
||||
type: string
|
||||
label: Postgres image tag
|
||||
description: "Postgres image tag"
|
||||
- variable: image.postgres.name
|
||||
default: "postgres"
|
||||
required: false
|
||||
type: string
|
||||
label: Postgres image name
|
||||
description: "Postgres image name"
|
||||
- variable: postgres.service.enabled
|
||||
default: false
|
||||
required: false
|
||||
type: boolean
|
||||
label: Expose internal Postgres as a Service
|
||||
description: "Expose internal Postgres as a Service"
|
||||
- variable: postgres.resources.requests.cpu
|
||||
default: "0.5"
|
||||
required: false
|
||||
type: string
|
||||
label: CPU request for Postgres
|
||||
description: "CPU request for Postgres"
|
||||
- variable: postgres.resources.requests.memory
|
||||
default: "1Gi"
|
||||
required: false
|
||||
type: string
|
||||
label: Memory request for Postgres
|
||||
description: "Memory request for Postgres"
|
||||
- variable: postgres.external.host
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: External host for Postgres
|
||||
description: "External host for Postgres"
|
||||
- variable: postgres.external.port
|
||||
default: 5432
|
||||
required: false
|
||||
type: int
|
||||
label: External host port for Postgres
|
||||
description: "External host port for Postgres"
|
||||
- variable: postgres.external.pass
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: External host password for Postgres
|
||||
description: "External host password for Postgres"
|
||||
- variable: postgres.external.dbname
|
||||
default: "postgres"
|
||||
required: false
|
||||
type: string
|
||||
label: External host Db name for Postgres
|
||||
description: "External host Db name for Postgres"
|
||||
- variable: postgres.external.user
|
||||
default: "postgres"
|
||||
required: false
|
||||
type: string
|
||||
label: External host Db user for Postgres
|
||||
description: "External host Db user for Postgres"
|
||||
- variable: postgres.external.jdbcParams
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: JDBC connection parameters
|
||||
description: "JDBC connection parameters including the leading `?"
|
||||
- variable: questions.defaultPrometheus
|
||||
default: true
|
||||
description: "Default Prometheus configurations"
|
||||
label: Default Prometheus configurations
|
||||
type: boolean
|
||||
show_subquestion_if: false
|
||||
group: "Prometheus"
|
||||
subquestions:
|
||||
- variable: image.prometheus.registry
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
label: Prometheus image registry
|
||||
description: "Prometheus image registry"
|
||||
- variable: image.prometheus.tag
|
||||
default: "v2.27.1"
|
||||
required: false
|
||||
type: string
|
||||
label: Prometheus image tag
|
||||
description: "Prometheus image tag"
|
||||
- variable: image.prometheus.name
|
||||
default: "prom/prometheus"
|
||||
required: false
|
||||
type: string
|
||||
label: Prometheus image name
|
||||
description: "Prometheus image name"
|
||||
- variable: prometheus.resources.requests.cpu
|
||||
default: "2"
|
||||
required: false
|
||||
type: string
|
||||
label: CPU request for Prometheus
|
||||
description: "CPU request for Prometheus"
|
||||
- variable: prometheus.resources.requests.memory
|
||||
default: "4Gi"
|
||||
required: false
|
||||
type: string
|
||||
label: Memory request for Prometheus
|
||||
- variable: prometheus.retentionTime
|
||||
default: 15d
|
||||
required: false
|
||||
type: string
|
||||
label: Retention Time
|
||||
description: "Retention Time"
|
||||
- variable: securityContext.enabled
|
||||
default: false
|
||||
description: "Enable Security Context"
|
||||
label: Enable Security Context
|
||||
type: boolean
|
||||
show_subquestion_if: true
|
||||
group: "Security Context"
|
||||
subquestions:
|
||||
- variable: securityContext.fsGroup
|
||||
default: 10001
|
||||
required: false
|
||||
type: int
|
||||
label: fsGroup
|
||||
description: "fsGroup"
|
||||
- variable: securityContext.fsGroupChangePolicy
|
||||
default: "OnRootMismatch"
|
||||
required: false
|
||||
type: string
|
||||
label: fsGroupChangePolicy
|
||||
description: "fsGroupChangePolicy"
|
||||
- variable: securityContext.runAsUser
|
||||
default: 10001
|
||||
required: false
|
||||
type: int
|
||||
label: runAsUser
|
||||
description: "runAsUser"
|
||||
- variable: securityContext.runAsGroup
|
||||
default: 10001
|
||||
required: false
|
||||
type: int
|
||||
label: runAsGroup
|
||||
description: "runAsGroup"
|
||||
- variable: securityContext.runAsNonRoot
|
||||
default: true
|
||||
required: false
|
||||
type: boolean
|
||||
label: runAsNonRoot
|
||||
description: "runAsNonRoot"
|
|
@ -0,0 +1,14 @@
|
|||
{{/*
|
||||
The usage of helm upgrade [RELEASE] [CHART] --reuse-values --set [variable]:[value] throws an
|
||||
error in the event that new entries are inserted to the values chart.
|
||||
|
||||
This is because reuse-values flag uses the values from the last release. If --set (/--set-file/
|
||||
--set-string/--values/-f) is applied with the reuse-values flag, the values from the last
|
||||
release are overridden for those variables alone, and newer changes to the chart are
|
||||
unacknowledged.
|
||||
|
||||
https://medium.com/@kcatstack/understand-helm-upgrade-flags-reset-values-reuse-values-6e58ac8f127e
|
||||
|
||||
To prevent errors while applying upgrade with --reuse-values and --set flags after introducing
|
||||
new variables, default values can be specified in this file.
|
||||
*/}}
|
|
@ -0,0 +1,237 @@
|
|||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "yugaware.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "yugaware.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 "yugaware.chart" -}}
|
||||
{{- printf "%s" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Implements customization for the registry for component images.
|
||||
|
||||
The preference is to use the image.commonRegistry field first if it is set.
|
||||
Otherwise the local registry override for each image is used if set, for ex: image.postgres.registry
|
||||
|
||||
In both cases, the image name and tag can be customized by using the overrides for each image, for ex: image.postgres.name
|
||||
*/}}
|
||||
{{- define "full_image" -}}
|
||||
{{- $specific_registry := (get (get .root.Values.image .containerName) "registry") -}}
|
||||
{{- if not (empty .root.Values.image.commonRegistry) -}}
|
||||
{{- $specific_registry = .root.Values.image.commonRegistry -}}
|
||||
{{- end -}}
|
||||
{{- if not (empty $specific_registry) -}}
|
||||
{{- $specific_registry = printf "%s/" $specific_registry -}}
|
||||
{{- end -}}
|
||||
{{- $specific_name := (toString (get (get .root.Values.image .containerName) "name")) -}}
|
||||
{{- $specific_tag := (toString (get (get .root.Values.image .containerName) "tag")) -}}
|
||||
{{- printf "%s%s:%s" $specific_registry $specific_name $specific_tag -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Implements customization for the registry for the yugaware docker image.
|
||||
|
||||
The preference is to use the image.commonRegistry field first if it is set.
|
||||
Otherwise the image.repository field is used.
|
||||
|
||||
In both cases, image.tag can be used to customize the tag of the yugaware image.
|
||||
*/}}
|
||||
{{- define "full_yugaware_image" -}}
|
||||
{{- $specific_registry := .Values.image.repository -}}
|
||||
{{- if not (empty .Values.image.commonRegistry) -}}
|
||||
{{- $specific_registry = printf "%s/%s" .Values.image.commonRegistry "yugabyte/yugaware" -}}
|
||||
{{- end -}}
|
||||
{{- $specific_tag := (toString .Values.image.tag) -}}
|
||||
{{- printf "%s:%s" $specific_registry $specific_tag -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Get or generate PG password
|
||||
Source - https://github.com/helm/charts/issues/5167#issuecomment-843962731
|
||||
*/}}
|
||||
{{- define "getOrGeneratePassword" }}
|
||||
{{- $len := (default 8 .Length) | int -}}
|
||||
{{- $obj := (lookup "v1" .Kind .Namespace .Name).data -}}
|
||||
{{- if $obj }}
|
||||
{{- index $obj .Key -}}
|
||||
{{- else if (eq (lower .Kind) "secret") -}}
|
||||
{{- randAlphaNum $len | b64enc -}}
|
||||
{{- else -}}
|
||||
{{- randAlphaNum $len -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Similar to getOrGeneratePassword but written for migration from
|
||||
ConfigMap to Secret. Secret is given precedence, and then the upgrade
|
||||
case of ConfigMap to Secret is handled.
|
||||
TODO: remove this after few releases i.e. once all old platform
|
||||
installations are upgraded, and use getOrGeneratePassword.
|
||||
*/}}
|
||||
{{- define "getOrGeneratePasswordConfigMapToSecret" }}
|
||||
{{- $len := (default 8 .Length) | int -}}
|
||||
{{- $obj := (lookup "v1" "Secret" .Namespace .Name).data -}}
|
||||
{{- if $obj }}
|
||||
{{- index $obj .Key -}}
|
||||
{{- else -}}
|
||||
{{- $obj := (lookup "v1" "ConfigMap" .Namespace .Name).data -}}
|
||||
{{- if $obj }}
|
||||
{{- index $obj .Key | b64enc -}}
|
||||
{{- else -}}
|
||||
{{- randAlphaNum $len | b64enc -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Make list of allowed CORS origins
|
||||
*/}}
|
||||
{{- define "allowedCorsOrigins" -}}
|
||||
[
|
||||
{{- range .Values.yugaware.additionAllowedCorsOrigins -}}
|
||||
{{- . | quote }},
|
||||
{{- end -}}
|
||||
{{- if .Values.tls.enabled -}}
|
||||
"https://{{ .Values.tls.hostname }}"
|
||||
{{- else -}}
|
||||
"http://{{ .Values.tls.hostname }}"
|
||||
{{- end -}}
|
||||
]
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Get or generate server cert and key
|
||||
*/}}
|
||||
{{- define "getOrCreateServerCert" -}}
|
||||
{{- $root := .Root -}}
|
||||
{{- if and $root.Values.tls.certificate $root.Values.tls.key -}}
|
||||
server.key: {{ $root.Values.tls.key }}
|
||||
server.crt: {{ $root.Values.tls.certificate }}
|
||||
{{- else -}}
|
||||
{{- $result := (lookup "v1" "Secret" .Namespace .Name).data -}}
|
||||
{{- if $result -}}
|
||||
server.key: {{ index $result "server.key" }}
|
||||
server.crt: {{ index $result "server.crt" }}
|
||||
{{- else -}}
|
||||
{{- $cert := genSelfSignedCert $root.Values.tls.hostname nil nil 3560 -}}
|
||||
server.key: {{ $cert.Key | b64enc }}
|
||||
server.crt: {{ $cert.Cert | b64enc }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Get or generate server key cert in pem format
|
||||
*/}}
|
||||
{{- define "getOrCreateServerPem" -}}
|
||||
{{- $root := .Root -}}
|
||||
{{- if and $root.Values.tls.certificate $root.Values.tls.key -}}
|
||||
{{- $decodedKey := $root.Values.tls.key | b64dec -}}
|
||||
{{- $decodedCert := $root.Values.tls.certificate | b64dec -}}
|
||||
{{- $serverPemContentTemp := ( printf "%s\n%s" $decodedKey $decodedCert ) -}}
|
||||
{{- $serverPemContent := $serverPemContentTemp | b64enc -}}
|
||||
server.pem: {{ $serverPemContent }}
|
||||
{{- else -}}
|
||||
{{- $result := (lookup "v1" "Secret" .Namespace .Name).data -}}
|
||||
{{- if $result -}}
|
||||
{{- $serverPemContent := ( index $result "server.pem" ) -}}
|
||||
server.pem: {{ $serverPemContent }}
|
||||
{{- else -}}
|
||||
{{- $cert := genSelfSignedCert $root.Values.tls.hostname nil nil 3560 -}}
|
||||
{{- $serverPemContentTemp := ( printf "%s\n%s" $cert.Key $cert.Cert ) -}}
|
||||
{{- $serverPemContent := $serverPemContentTemp | b64enc -}}
|
||||
server.pem: {{ $serverPemContent }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Check export of nss_wrapper environment variables required
|
||||
*/}}
|
||||
{{- define "checkNssWrapperExportRequired" -}}
|
||||
{{- if .Values.securityContext.enabled -}}
|
||||
{{- if and (ne (int .Values.securityContext.runAsUser) 0) (ne (int .Values.securityContext.runAsUser) 10001) -}}
|
||||
{{- printf "true" -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- printf "false" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
{{/*
|
||||
Verify the extraVolumes and extraVolumeMounts mappings.
|
||||
Every extraVolumes should have extraVolumeMounts
|
||||
*/}}
|
||||
{{- define "yugaware.isExtraVolumesMappingExists" -}}
|
||||
{{- $lenExtraVolumes := len .extraVolumes -}}
|
||||
{{- $lenExtraVolumeMounts := len .extraVolumeMounts -}}
|
||||
|
||||
{{- if and (eq $lenExtraVolumeMounts 0) (gt $lenExtraVolumes 0) -}}
|
||||
{{- fail "You have not provided the extraVolumeMounts for extraVolumes." -}}
|
||||
{{- else if and (eq $lenExtraVolumes 0) (gt $lenExtraVolumeMounts 0) -}}
|
||||
{{- fail "You have not provided the extraVolumes for extraVolumeMounts." -}}
|
||||
{{- else if and (gt $lenExtraVolumes 0) (gt $lenExtraVolumeMounts 0) -}}
|
||||
{{- $volumeMountsList := list -}}
|
||||
{{- range .extraVolumeMounts -}}
|
||||
{{- $volumeMountsList = append $volumeMountsList .name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $volumesList := list -}}
|
||||
{{- range .extraVolumes -}}
|
||||
{{- $volumesList = append $volumesList .name -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- range $volumesList -}}
|
||||
{{- if not (has . $volumeMountsList) -}}
|
||||
{{- fail (printf "You have not provided the extraVolumeMounts for extraVolume %s" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- range $volumeMountsList -}}
|
||||
{{- if not (has . $volumesList) -}}
|
||||
{{- fail (printf "You have not provided the extraVolumes for extraVolumeMounts %s" .) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Make list of custom http headers
|
||||
*/}}
|
||||
{{- define "customHeaders" -}}
|
||||
[
|
||||
{{- $headers := .Values.yugaware.custom_headers -}}
|
||||
{{- range $index, $element := $headers -}}
|
||||
{{- if ne $index (sub (len $headers) 1) -}}
|
||||
{{- . | quote }},
|
||||
{{- else -}}
|
||||
{{- . | quote }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
]
|
||||
{{- end -}}
|
|
@ -0,0 +1,99 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
{{- $root := . }}
|
||||
{{- $tls := $root.Values.tls }}
|
||||
{{- if and $tls.enabled $tls.certManager.enabled }}
|
||||
{{- if $tls.certManager.genSelfsigned }}
|
||||
{{- if $tls.certManager.useClusterIssuer }}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: ClusterIssuer
|
||||
metadata:
|
||||
name: {{ $root.Release.Name }}-yugaware-cluster-issuer
|
||||
spec:
|
||||
selfSigned: {}
|
||||
{{- else }} # useClusterIssuer=false
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: {{ $root.Release.Name }}-yugaware-issuer
|
||||
namespace: {{ $root.Release.Namespace }}
|
||||
spec:
|
||||
selfSigned: {}
|
||||
---
|
||||
{{- end }} # useClusterIssuer
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ $root.Release.Name }}-yugaware-ui-root-ca
|
||||
namespace: {{ $root.Release.Namespace }}
|
||||
spec:
|
||||
isCA: true
|
||||
commonName: Yugaware self signed CA
|
||||
secretName: {{ .Release.Name }}-yugaware-root-ca
|
||||
secretTemplate:
|
||||
labels:
|
||||
app: "{{ template "yugaware.name" . }}"
|
||||
chart: "{{ template "yugaware.chart" . }}"
|
||||
release: {{ .Release.Name | quote }}
|
||||
heritage: {{ .Release.Service | quote }}
|
||||
duration: {{ $tls.certManager.configuration.duration | quote }}
|
||||
renewBefore: {{ $tls.certManager.configuration.renewBefore | quote }}
|
||||
privateKey:
|
||||
algorithm: {{ $tls.certManager.configuration.algorithm | quote }}
|
||||
encoding: PKCS8
|
||||
size: {{ $tls.certManager.configuration.keySize }}
|
||||
rotationPolicy: Always
|
||||
issuerRef:
|
||||
{{- if $tls.certManager.useClusterIssuer }}
|
||||
name: {{ $root.Release.Name }}-yugaware-cluster-issuer
|
||||
kind: ClusterIssuer
|
||||
{{- else }}
|
||||
name: {{ $root.Release.Name }}-yugaware-issuer
|
||||
kind: Issuer
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: {{ $root.Release.Name }}-yugaware-ca-issuer
|
||||
namespace: {{ $root.Release.Namespace }}
|
||||
spec:
|
||||
ca:
|
||||
secretName: {{ .Release.Name }}-yugaware-root-ca
|
||||
---
|
||||
{{- end }} # genSelfsigned
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ $root.Release.Name }}-yugaware-ui-tls
|
||||
namespace: {{ $root.Release.Namespace }}
|
||||
spec:
|
||||
isCA: false
|
||||
commonName: {{ $tls.hostname }}
|
||||
secretName: {{ .Release.Name }}-yugaware-tls-cert
|
||||
secretTemplate:
|
||||
labels:
|
||||
app: "{{ template "yugaware.name" . }}"
|
||||
chart: "{{ template "yugaware.chart" . }}"
|
||||
release: {{ .Release.Name | quote }}
|
||||
heritage: {{ .Release.Service | quote }}
|
||||
duration: {{ $tls.certManager.configuration.duration | quote }}
|
||||
renewBefore: {{ $tls.certManager.configuration.renewBefore | quote }}
|
||||
privateKey:
|
||||
algorithm: {{ $tls.certManager.configuration.algorithm | quote }}
|
||||
encoding: PKCS8
|
||||
size: {{ $tls.certManager.configuration.keySize }}
|
||||
rotationPolicy: Always
|
||||
issuerRef:
|
||||
name: {{ $tls.certManager.genSelfsigned | ternary (printf "%s%s" $root.Release.Name "-yugaware-ca-issuer") ($tls.certManager.useClusterIssuer | ternary $tls.certManager.clusterIssuer $tls.certManager.issuer) }}
|
||||
{{- if $tls.certManager.useClusterIssuer }}
|
||||
kind: ClusterIssuer
|
||||
{{- else }}
|
||||
kind: Issuer
|
||||
{{- end }}
|
||||
---
|
||||
{{- end }}
|
|
@ -0,0 +1,578 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
{{- if .Values.image.pullSecretFile }}
|
||||
---
|
||||
apiVersion: v1
|
||||
data:
|
||||
.dockerconfigjson: {{ $.Files.Get .Values.image.pullSecretFile | b64enc }}
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ .Values.image.pullSecret }}
|
||||
type: kubernetes.io/dockerconfigjson
|
||||
{{- end }}
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-app-config
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
application.docker.conf: |
|
||||
include classpath("application.common.conf")
|
||||
play.crypto.secret=${APP_SECRET}
|
||||
play.i18n.langs = [ "en" ]
|
||||
pidfile.path = "/dev/null"
|
||||
play.logger.includeConfigProperties=true
|
||||
log.override.path = "/opt/yugabyte/yugaware/data/logs"
|
||||
|
||||
db {
|
||||
default.dbname=${POSTGRES_DB}
|
||||
{{ if .Values.postgres.external.host }}
|
||||
default.host="{{ .Values.postgres.external.host }}"
|
||||
default.port={{ .Values.postgres.external.port }}
|
||||
{{ else if eq .Values.ip_version_support "v6_only" }}
|
||||
default.host="[::1]"
|
||||
{{ else }}
|
||||
default.host="127.0.0.1"
|
||||
{{ end }}
|
||||
default.url="jdbc:postgresql://"${db.default.host}":"${db.default.port}"/"${db.default.dbname}${db.default.params}
|
||||
default.params="{{ .Values.jdbcParams }}"
|
||||
default.username=${POSTGRES_USER}
|
||||
default.password=${POSTGRES_PASSWORD}
|
||||
{{ if .Values.yugaware.cloud.enabled }}
|
||||
perf_advisor.driver="org.hsqldb.jdbc.JDBCDriver"
|
||||
perf_advisor.url="jdbc:hsqldb:mem:perf-advisor"
|
||||
perf_advisor.createDatabaseIfMissing=false
|
||||
perf_advisor.username="sa"
|
||||
perf_advisor.password="sa"
|
||||
perf_advisor.migration.auto=false
|
||||
perf_advisor.migration.disabled=true
|
||||
{{ else }}
|
||||
perf_advisor.url="jdbc:postgresql://"${db.default.host}":"${db.default.port}"/"${db.perf_advisor.dbname}${db.default.params}
|
||||
perf_advisor.createDatabaseUrl="jdbc:postgresql://"${db.default.host}":"${db.default.port}"/"${db.default.dbname}${db.default.params}
|
||||
{{ end }}
|
||||
}
|
||||
|
||||
{{- if .Values.tls.enabled }}
|
||||
https.port = 9443
|
||||
play.server.https.keyStore {
|
||||
path = /opt/certs/server.pem
|
||||
type = PEM
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
yb {
|
||||
{{- if .Values.yugaware.universe_boot_script }}
|
||||
universe_boot_script = "/data/universe-boot-script.sh"
|
||||
{{- end }}
|
||||
cloud.enabled = {{ .Values.yugaware.cloud.enabled }}
|
||||
cloud.requestIdHeader = "{{ .Values.yugaware.cloud.requestIdHeader }}"
|
||||
devops.home = /opt/yugabyte/devops
|
||||
metrics.host = "{{ eq .Values.ip_version_support "v6_only" | ternary "[::1]" "127.0.0.1" }}"
|
||||
metrics.url = "http://"${yb.metrics.host}":9090/api/v1"
|
||||
metrics.management.url = "http://"${yb.metrics.host}":9090/-"
|
||||
storage.path = /opt/yugabyte/yugaware/data
|
||||
docker.network = bridge
|
||||
seedData = false
|
||||
swamper.targetPath = /opt/yugabyte/prometheus/targets
|
||||
swamper.rulesPath = /opt/yugabyte/prometheus/rules
|
||||
security.enable_auth_for_proxy_metrics = {{ .Values.yugaware.enableProxyMetricsAuth }}
|
||||
proxy_endpoint_timeout = {{ .Values.yugaware.proxyEndpointTimeoutMs }}
|
||||
multiTenant = {{ .Values.yugaware.multiTenant }}
|
||||
releases.path = "/opt/yugabyte/releases"
|
||||
docker.release = "/opt/yugabyte/release"
|
||||
# TODO(bogdan): need this extra level for installing from local...
|
||||
thirdparty.packagePath = /opt/third-party
|
||||
helm.packagePath = "{{ .Values.helm.packagePath }}"
|
||||
helm.timeout_secs = {{ .Values.helm.timeout }}
|
||||
health.check_interval_ms = 300000
|
||||
health.status_interval_ms = 43200000
|
||||
health.default_email = "{{ .Values.yugaware.health.email }}"
|
||||
health.ses_email_username = "{{ .Values.yugaware.health.username }}"
|
||||
health.ses_email_password = "{{ .Values.yugaware.health.password }}"
|
||||
kubernetes.storageClass = "{{ .Values.yugaware.storageClass }}"
|
||||
kubernetes.pullSecretName = "{{ .Values.image.pullSecret }}"
|
||||
url = "https://{{ .Values.tls.hostname }}"
|
||||
# GKE MCS takes 7 to 10 minutes to setup DNS
|
||||
wait_for_server_timeout = 15 minutes
|
||||
{{- if .Values.tls.enabled }}
|
||||
security.headers.hsts_enabled = true
|
||||
{{- end }}
|
||||
security.headers.custom_headers = {{ include "customHeaders" . }}
|
||||
}
|
||||
|
||||
play.filters {
|
||||
# CSRF config
|
||||
csrf {
|
||||
cookie {
|
||||
# If non null, the CSRF token will be placed in a cookie with this name
|
||||
name = "csrfCookie"
|
||||
# Whether the cookie should be set to secure
|
||||
secure = false
|
||||
# Whether the cookie should have the HTTP only flag set
|
||||
httpOnly = false
|
||||
}
|
||||
# Whether to bypass CSRF check if CORS check is satisfied
|
||||
bypassCorsTrustedOrigins = false
|
||||
header {
|
||||
# The name of the header to accept CSRF tokens from.
|
||||
name = "Csrf-Token"
|
||||
}
|
||||
}
|
||||
# CORS config
|
||||
cors {
|
||||
pathPrefixes = ["/"]
|
||||
allowedOrigins = {{ include "allowedCorsOrigins" . }}
|
||||
# Server allows cookies/credentials to be sent with cross-origin requests
|
||||
supportsCredentials=true
|
||||
allowedHttpMethods = ["GET", "POST", "PUT", "OPTIONS", "DELETE"]
|
||||
allowedHttpHeaders = ["Accept", "Origin", "Content-Type", "X-Auth-Token", "X-AUTH-YW-API-TOKEN", "{{ .Values.yugaware.cloud.requestIdHeader }}", ${play.filters.csrf.header.name}]
|
||||
}
|
||||
}
|
||||
|
||||
# string config entries from helm values additionalAppConf
|
||||
{{- range $key, $value := .Values.additionalAppConf.stringConf }}
|
||||
{{ $key }} = "{{ $value }}"
|
||||
{{- end }}
|
||||
|
||||
# boolean/int config entries from helm values additionalAppConf
|
||||
{{- range $key, $value := .Values.additionalAppConf.nonStringConf }}
|
||||
{{ $key }} = {{ $value }}
|
||||
{{- end }}
|
||||
{{- if and .Values.tls.enabled (not .Values.tls.certManager.enabled) }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-tls-pem
|
||||
labels:
|
||||
app: "{{ template "yugaware.name" . }}"
|
||||
chart: "{{ template "yugaware.chart" . }}"
|
||||
release: {{ .Release.Name | quote }}
|
||||
heritage: {{ .Release.Service | quote }}
|
||||
type: Opaque
|
||||
data:
|
||||
{{- include "getOrCreateServerPem" (dict "Namespace" .Release.Namespace "Root" . "Name" (printf "%s%s" .Release.Name "-yugaware-tls-pem")) | nindent 2 }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if not (and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io")) }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-pg-upgrade
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
pg-upgrade-11-to-14.sh: |
|
||||
#!/bin/bash
|
||||
set -x -o errexit
|
||||
|
||||
cd /pg_upgrade_logs/
|
||||
if [ ! "$(ls -A ${PGDATANEW})" ] && [ "$(ls -A ${PGDATAOLD})" ];
|
||||
then
|
||||
echo "Upgrading PG data from ${PGDATAOLD} to ${PGDATANEW}"
|
||||
# if fsGroup is set, we need to remove the sticky bit, and group
|
||||
# write permission from the directories
|
||||
chmod -R g-w-s "${PGDATAOLD}"
|
||||
chmod g-w-s "${PGDATAOLD}"
|
||||
docker-upgrade pg_upgrade | tee -a /pg_upgrade_logs/pg_upgrade_11_to_14.log;
|
||||
echo "host all all all scram-sha-256" >> "${PGDATANEW}/pg_hba.conf";
|
||||
fi
|
||||
{{- end }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
---
|
||||
apiVersion: "v1"
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-pg-prerun
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
pg-prerun.sh: |
|
||||
#!/bin/bash
|
||||
set -x -o errexit
|
||||
|
||||
mkdir -p $PGDATA && chown -R $PG_UID:$PG_GID $PGDATA;
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.prometheus.remoteWrite.tls.enabled }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-prometheus-remote-write-tls
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name | quote }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
type: Opaque
|
||||
data:
|
||||
# For user-provided remote write ca cert, cert and key. Expect to be base-64 encoded.
|
||||
{{- if .Values.prometheus.remoteWrite.tls.caCert }}
|
||||
ca.crt: {{ .Values.prometheus.remoteWrite.tls.caCert }}
|
||||
{{- end }}
|
||||
{{- if .Values.prometheus.remoteWrite.tls.clientCert }}
|
||||
client.crt: {{ .Values.prometheus.remoteWrite.tls.clientCert }}
|
||||
{{- end }}
|
||||
{{- if .Values.prometheus.remoteWrite.tls.clientKey }}
|
||||
client.key: {{ .Values.prometheus.remoteWrite.tls.clientKey }}
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-prometheus-config
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
prometheus.yml: |
|
||||
global:
|
||||
scrape_interval: 10s
|
||||
evaluation_interval: 10s
|
||||
rule_files:
|
||||
- '/opt/yugabyte/prometheus/rules/yugaware.ad.*.yml'
|
||||
- '/opt/yugabyte/prometheus/rules/yugaware.recording-rules.yml'
|
||||
{{- if .Values.prometheus.remoteWrite.config }}
|
||||
remote_write:
|
||||
{{ toYaml .Values.prometheus.remoteWrite.config | indent 6}}
|
||||
{{- end }}
|
||||
scrape_configs:
|
||||
{{- if .Values.ocpCompatibility.enabled }}
|
||||
- job_name: "ocp-prometheus-federated"
|
||||
scheme: https
|
||||
|
||||
tls_config:
|
||||
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
||||
insecure_skip_verify: true
|
||||
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
|
||||
|
||||
honor_labels: true
|
||||
metrics_path: "/federate"
|
||||
|
||||
params:
|
||||
'match[]':
|
||||
# kubelet metrics
|
||||
- 'kubelet_volume_stats_used_bytes{persistentvolumeclaim=~"(.*)-yb-(.*)"}'
|
||||
- 'kubelet_volume_stats_capacity_bytes{persistentvolumeclaim=~"(.*)-yb-(.*)"}'
|
||||
# kubelet cadvisor metrics
|
||||
- 'container_cpu_usage_seconds_total{pod=~"(.*)yb-(.*)"}'
|
||||
- 'container_memory_working_set_bytes{pod=~"(.*)yb-(.*)"}'
|
||||
# kube-state-metrics
|
||||
# Supports >= OCP v4.4
|
||||
# OCP v4.4 has upgraded the KSM from 1.8.0 to 1.9.5.
|
||||
# https://docs.openshift.com/container-platform/4.4/release_notes/ocp-4-4-release-notes.html#ocp-4-4-cluster-monitoring-version-updates
|
||||
# - 'kube_pod_container_resource_requests_cpu_cores{pod=~"(.*)yb-(.*)"}'
|
||||
- 'kube_pod_container_resource_requests{pod=~"(.*)yb-(.*)", unit="core"}'
|
||||
|
||||
static_configs:
|
||||
- targets:
|
||||
- "prometheus-k8s.openshift-monitoring.svc:9091"
|
||||
|
||||
metric_relabel_configs:
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["pod"]
|
||||
regex: "(.*)"
|
||||
target_label: "pod_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["container"]
|
||||
regex: "(.*)"
|
||||
target_label: "container_name"
|
||||
replacement: "$1"
|
||||
# rename new name of the CPU metric to the old name and label
|
||||
# ref: https://github.com/kubernetes/kube-state-metrics/blob/master/CHANGELOG.md#v200-alpha--2020-09-16
|
||||
- source_labels: ["__name__", "unit"]
|
||||
regex: "kube_pod_container_resource_requests;core"
|
||||
target_label: "__name__"
|
||||
replacement: "kube_pod_container_resource_requests_cpu_cores"
|
||||
|
||||
{{- else }}
|
||||
{{- if .Values.prometheus.scrapeKubernetesNodes }}
|
||||
|
||||
- job_name: 'kubernetes-nodes'
|
||||
|
||||
scheme: https
|
||||
|
||||
tls_config:
|
||||
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
||||
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
|
||||
|
||||
kubernetes_sd_configs:
|
||||
- role: node
|
||||
|
||||
relabel_configs:
|
||||
- action: labelmap
|
||||
regex: __meta_kubernetes_node_label_(.+)
|
||||
- target_label: __address__
|
||||
replacement: kubernetes.default.svc:443
|
||||
- source_labels: [__meta_kubernetes_node_name]
|
||||
regex: (.+)
|
||||
target_label: __metrics_path__
|
||||
replacement: /api/v1/nodes/${1}/proxy/metrics
|
||||
metric_relabel_configs:
|
||||
# Only keep the metrics which we care about
|
||||
- source_labels: ["__name__"]
|
||||
regex: "kubelet_volume_stats_used_bytes|kubelet_volume_stats_capacity_bytes"
|
||||
action: keep
|
||||
- source_labels: ["persistentvolumeclaim"]
|
||||
regex: "(.*)-yb-(.*)"
|
||||
action: keep
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["pod"]
|
||||
regex: "(.*)"
|
||||
target_label: "pod_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["container"]
|
||||
regex: "(.*)"
|
||||
target_label: "container_name"
|
||||
replacement: "$1"
|
||||
|
||||
- job_name: 'kube-state-metrics'
|
||||
static_configs:
|
||||
- targets: ['kube-state-metrics.kube-system.svc.{{.Values.domainName}}:8080']
|
||||
metric_relabel_configs:
|
||||
# Only keep the metrics which we care about
|
||||
- source_labels: ["__name__", "unit"]
|
||||
regex: "kube_pod_container_resource_requests;core"
|
||||
action: keep
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["pod"]
|
||||
regex: "(.*)"
|
||||
target_label: "pod_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["container"]
|
||||
regex: "(.*)"
|
||||
target_label: "container_name"
|
||||
replacement: "$1"
|
||||
# Keep metrics from YugabyteDB pods, discard everything else
|
||||
- source_labels: ["pod_name"]
|
||||
regex: "(.*)yb-(.*)"
|
||||
action: keep
|
||||
# rename new name of the CPU metric to the old name and label
|
||||
# ref: https://github.com/kubernetes/kube-state-metrics/blob/master/CHANGELOG.md#v200-alpha--2020-09-16
|
||||
- source_labels: ["__name__", "unit"]
|
||||
regex: "kube_pod_container_resource_requests;core"
|
||||
target_label: "__name__"
|
||||
replacement: "kube_pod_container_resource_requests_cpu_cores"
|
||||
# Keep metrics for CPU, discard duplicate metrics
|
||||
- source_labels: ["__name__"]
|
||||
regex: "kube_pod_container_resource_requests_cpu_cores"
|
||||
action: keep
|
||||
|
||||
- job_name: 'kubernetes-cadvisor'
|
||||
|
||||
scheme: https
|
||||
|
||||
tls_config:
|
||||
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
||||
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
|
||||
|
||||
kubernetes_sd_configs:
|
||||
- role: node
|
||||
|
||||
relabel_configs:
|
||||
- action: labelmap
|
||||
regex: __meta_kubernetes_node_label_(.+)
|
||||
- target_label: __address__
|
||||
replacement: kubernetes.default.svc:443
|
||||
- source_labels: [__meta_kubernetes_node_name]
|
||||
regex: (.+)
|
||||
target_label: __metrics_path__
|
||||
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
|
||||
metric_relabel_configs:
|
||||
# Only keep the metrics which we care about
|
||||
- source_labels: ["__name__"]
|
||||
regex: "container_cpu_usage_seconds_total|container_memory_working_set_bytes"
|
||||
action: keep
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["pod"]
|
||||
regex: "(.*)"
|
||||
target_label: "pod_name"
|
||||
replacement: "$1"
|
||||
- source_labels: ["container"]
|
||||
regex: "(.*)"
|
||||
target_label: "container_name"
|
||||
replacement: "$1"
|
||||
# Keep metrics from YugabyteDB pods, discard everything else
|
||||
- source_labels: ["pod_name"]
|
||||
regex: "(.*)yb-(.*)"
|
||||
action: keep
|
||||
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.tls.enabled }}
|
||||
|
||||
- job_name: 'platform'
|
||||
metrics_path: "/api/v1/prometheus_metrics"
|
||||
scheme: https
|
||||
tls_config:
|
||||
insecure_skip_verify: true
|
||||
static_configs:
|
||||
- targets: [
|
||||
'{{ eq .Values.ip_version_support "v6_only" | ternary "[::1]" "127.0.0.1" }}:9443'
|
||||
]
|
||||
|
||||
{{- else }}
|
||||
|
||||
- job_name: 'platform'
|
||||
metrics_path: "/api/v1/prometheus_metrics"
|
||||
static_configs:
|
||||
- targets: [
|
||||
'{{ eq .Values.ip_version_support "v6_only" | ternary "[::1]" "127.0.0.1" }}:9000'
|
||||
]
|
||||
|
||||
{{- end }}
|
||||
|
||||
- job_name: 'node-agent'
|
||||
metrics_path: "/metrics"
|
||||
file_sd_configs:
|
||||
- files:
|
||||
- '/opt/yugabyte/prometheus/targets/node-agent.*.json'
|
||||
|
||||
- job_name: "node"
|
||||
file_sd_configs:
|
||||
- files:
|
||||
- '/opt/yugabyte/prometheus/targets/node.*.json'
|
||||
metric_relabel_configs:
|
||||
# Below relabels are required for smooth migration from node_exporter 0.13.0 to the latest
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_cpu"
|
||||
target_label: "__name__"
|
||||
replacement: "node_cpu_seconds_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_filesystem_free"
|
||||
target_label: "__name__"
|
||||
replacement: "node_filesystem_free_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_filesystem_size"
|
||||
target_label: "__name__"
|
||||
replacement: "node_filesystem_size_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_disk_reads_completed"
|
||||
target_label: "__name__"
|
||||
replacement: "node_disk_reads_completed_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_disk_writes_completed"
|
||||
target_label: "__name__"
|
||||
replacement: "node_disk_writes_completed_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_memory_MemTotal"
|
||||
target_label: "__name__"
|
||||
replacement: "node_memory_MemTotal_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_memory_Slab"
|
||||
target_label: "__name__"
|
||||
replacement: "node_memory_Slab_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_memory_Cached"
|
||||
target_label: "__name__"
|
||||
replacement: "node_memory_Cached_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_memory_Buffers"
|
||||
target_label: "__name__"
|
||||
replacement: "node_memory_Buffers_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_memory_MemFree"
|
||||
target_label: "__name__"
|
||||
replacement: "node_memory_MemFree_bytes"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_receive_bytes"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_receive_bytes_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_transmit_bytes"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_transmit_bytes_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_receive_packets"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_receive_packets_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_transmit_packets"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_transmit_packets_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_receive_errs"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_receive_errs_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_network_transmit_errs"
|
||||
target_label: "__name__"
|
||||
replacement: "node_network_transmit_errs_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_disk_bytes_read"
|
||||
target_label: "__name__"
|
||||
replacement: "node_disk_read_bytes_total"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "node_disk_bytes_written"
|
||||
target_label: "__name__"
|
||||
replacement: "node_disk_written_bytes_total"
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
|
||||
- job_name: "yugabyte"
|
||||
tls_config:
|
||||
insecure_skip_verify: true
|
||||
metrics_path: "/prometheus-metrics"
|
||||
file_sd_configs:
|
||||
- files:
|
||||
- '/opt/yugabyte/prometheus/targets/yugabyte.*.json'
|
||||
metric_relabel_configs:
|
||||
# Save the name of the metric so we can group_by since we cannot by __name__ directly...
|
||||
- source_labels: ["__name__"]
|
||||
regex: "(.*)"
|
||||
target_label: "saved_name"
|
||||
replacement: "$1"
|
||||
# The following basically retrofit the handler_latency_* metrics to label format.
|
||||
- source_labels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(.*)"
|
||||
target_label: "server_type"
|
||||
replacement: "$1"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(.*)"
|
||||
target_label: "service_type"
|
||||
replacement: "$2"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(_sum|_count)?"
|
||||
target_label: "service_method"
|
||||
replacement: "$3"
|
||||
- source_labels: ["__name__"]
|
||||
regex: "handler_latency_(yb_[^_]*)_([^_]*)_([^_]*)(_sum|_count)?"
|
||||
target_label: "__name__"
|
||||
replacement: "rpc_latency$4"
|
|
@ -0,0 +1,23 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
{{- if .Values.postgres.external.host }}
|
||||
postgres_db: {{ .Values.postgres.external.dbname | b64enc | quote }}
|
||||
postgres_user: {{ .Values.postgres.external.user | b64enc | quote }}
|
||||
postgres_password: {{ .Values.postgres.external.pass | b64enc | quote }}
|
||||
{{- else }}
|
||||
postgres_db: {{ .Values.postgres.dbname | b64enc | quote }}
|
||||
postgres_user: {{ .Values.postgres.user | b64enc | quote }}
|
||||
postgres_password: {{ include "getOrGeneratePasswordConfigMapToSecret" (dict "Namespace" .Release.Namespace "Name" (printf "%s%s" .Release.Name "-yugaware-global-config") "Key" "postgres_password") | quote }}
|
||||
{{- end }}
|
||||
app_secret: {{ randAlphaNum 64 | b64enc | b64enc | quote }}
|
|
@ -0,0 +1,49 @@
|
|||
{{- if .Values.securityContext.enabled }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-init
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
init-permissions.sh: |
|
||||
#!/bin/bash
|
||||
|
||||
set -xe -o pipefail
|
||||
|
||||
data_directory="/opt/yugabyte/yugaware/data"
|
||||
if [[ -d "${data_directory}/keys/" ]]; then
|
||||
pemfiles=$(find "${data_directory}/keys/" -name "*.pem" -exec stat -c "%a" {} + | uniq | tr '\n' ',')
|
||||
IFS="," read -r -a pemfile_perms <<< "${pemfiles}"
|
||||
|
||||
trigger=false
|
||||
echo "Finding pem files with permissions different than 400, and setting their permissions to 400."
|
||||
|
||||
for pemfile in "${pemfile_perms[@]}"; do
|
||||
if [[ "${pemfile}" != *400* ]]; then
|
||||
echo "Found a pem file with permissions ${pemfile}"
|
||||
trigger=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if ${trigger}; then
|
||||
echo "Creating copy of data/keys directory"
|
||||
cp -r "${data_directory}/keys" "${data_directory}/new_keys"
|
||||
|
||||
echo "Setting permission of all pem files to 400"
|
||||
find "${data_directory}/new_keys/" -name "*.pem" -exec chmod 400 {} +
|
||||
|
||||
echo "Renaming existing keys directory"
|
||||
mv "${data_directory}/keys" "${data_directory}/keys-$(date +%s)"
|
||||
|
||||
echo "Renaming new keys directory"
|
||||
mv "${data_directory}/new_keys" "${data_directory}/keys"
|
||||
else
|
||||
echo "All pem files already have permission set to 400"
|
||||
fi
|
||||
fi
|
||||
{{- end }}
|
|
@ -0,0 +1,19 @@
|
|||
{{/*
|
||||
TODO: switch to policy/v1 completely when we stop supporting
|
||||
Kubernetes versions < 1.21
|
||||
*/}}
|
||||
{{- if .Values.pdbPolicyVersionOverride }}
|
||||
apiVersion: policy/{{ .Values.pdbPolicyVersionOverride }}
|
||||
{{- else if .Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }}
|
||||
apiVersion: policy/v1
|
||||
{{- else }}
|
||||
apiVersion: policy/v1beta1
|
||||
{{- end }}
|
||||
kind: PodDisruptionBudget
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-pdb
|
||||
spec:
|
||||
maxUnavailable: {{ .Values.yugaware.podDisruptionBudget.maxUnavailable | toJson }}
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ .Release.Name }}-yugaware
|
|
@ -0,0 +1,218 @@
|
|||
{{ if not .Values.yugaware.serviceAccount }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ .Release.Name }}
|
||||
labels:
|
||||
k8s-app: yugaware
|
||||
kubernetes.io/cluster-service: "true"
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
{{- if .Values.yugaware.serviceAccountAnnotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.yugaware.serviceAccountAnnotations | indent 4 }}
|
||||
{{- end }}
|
||||
{{ end }}
|
||||
{{- if .Values.rbac.create }}
|
||||
{{- if .Values.ocpCompatibility.enabled }}
|
||||
---
|
||||
kind: ClusterRoleBinding
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-cluster-monitoring-view
|
||||
labels:
|
||||
app: yugaware
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ .Values.yugaware.serviceAccount | default .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
roleRef:
|
||||
kind: ClusterRole
|
||||
name: cluster-monitoring-view
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
{{- else }}
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ .Release.Name }}
|
||||
rules:
|
||||
# Set of permissions required for operator
|
||||
- apiGroups:
|
||||
- operator.yugabyte.io
|
||||
resources:
|
||||
- "*"
|
||||
verbs:
|
||||
- "get"
|
||||
- "create"
|
||||
- "delete"
|
||||
- "patch"
|
||||
- "list"
|
||||
- "watch"
|
||||
- "update"
|
||||
# Set of permissions required to install, upgrade, delete the yugabyte chart
|
||||
- apiGroups:
|
||||
- "policy"
|
||||
resources:
|
||||
- "poddisruptionbudgets"
|
||||
verbs:
|
||||
- "get"
|
||||
- "create"
|
||||
- "delete"
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "services"
|
||||
verbs:
|
||||
- "get"
|
||||
- "delete"
|
||||
- "create"
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- "apps"
|
||||
resources:
|
||||
- "statefulsets"
|
||||
verbs:
|
||||
- "get"
|
||||
- "list"
|
||||
- "delete"
|
||||
- "create"
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "secrets"
|
||||
verbs:
|
||||
- "create"
|
||||
- "list"
|
||||
- "get"
|
||||
- "delete"
|
||||
- "update"
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- "cert-manager.io"
|
||||
resources:
|
||||
- "certificates"
|
||||
verbs:
|
||||
- "create"
|
||||
- "delete"
|
||||
- "get"
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "configmaps"
|
||||
verbs:
|
||||
- "get"
|
||||
- "create"
|
||||
- "patch"
|
||||
- "delete"
|
||||
# Set of permissions required by YBA to manage YB DB universes
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "namespaces"
|
||||
verbs:
|
||||
- "delete"
|
||||
- "create"
|
||||
- "patch"
|
||||
- "get"
|
||||
- "list"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "pods"
|
||||
verbs:
|
||||
- "get"
|
||||
- "list"
|
||||
- "delete"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "services"
|
||||
verbs:
|
||||
- "get"
|
||||
- "list"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "persistentvolumeclaims"
|
||||
verbs:
|
||||
- "get"
|
||||
- "patch"
|
||||
- "list"
|
||||
- "delete"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "pods/exec"
|
||||
verbs:
|
||||
- "create"
|
||||
- apiGroups:
|
||||
- "apps"
|
||||
resources:
|
||||
- "statefulsets/scale"
|
||||
verbs:
|
||||
- "patch"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "events"
|
||||
verbs:
|
||||
- "list"
|
||||
# required to scrape resource metrics like CPU, memory, etc.
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "nodes"
|
||||
verbs:
|
||||
- "list"
|
||||
- "get"
|
||||
- "watch"
|
||||
# required to scrape resource metrics like CPU, memory, etc.
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "nodes/proxy"
|
||||
verbs:
|
||||
- "get"
|
||||
# Ref: https://github.com/yugabyte/charts/commit/4a5319972385666487a7bc2cd0c35052f2cfa4c5
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "events"
|
||||
verbs:
|
||||
- "get"
|
||||
- "list"
|
||||
- "watch"
|
||||
- "create"
|
||||
- "update"
|
||||
- "patch"
|
||||
- "delete"
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- "configmaps"
|
||||
verbs:
|
||||
- "list"
|
||||
- "watch"
|
||||
- "update"
|
||||
---
|
||||
kind: ClusterRoleBinding
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
metadata:
|
||||
name: {{ .Release.Name }}
|
||||
labels:
|
||||
k8s-app: yugaware
|
||||
kubernetes.io/cluster-service: "true"
|
||||
addonmanager.kubernetes.io/mode: Reconcile
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ .Values.yugaware.serviceAccount | default .Release.Name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
roleRef:
|
||||
kind: ClusterRole
|
||||
name: {{ .Release.Name }}
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,97 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
{{- if .Values.yugaware.service.enabled }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-ui
|
||||
{{- if .Values.yugaware.service.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.yugaware.service.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
spec:
|
||||
{{- if eq .Release.Service "Tiller" }}
|
||||
clusterIP:
|
||||
{{- else }}
|
||||
{{- if .Values.yugaware.service.clusterIP }}
|
||||
clusterIP: .Values.yugaware.service.clusterIP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
ports:
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: ui-tls
|
||||
port: 443
|
||||
targetPort: 9443
|
||||
{{- end }}
|
||||
- name: ui
|
||||
port: 80
|
||||
targetPort: 9000
|
||||
- name: metrics
|
||||
port: 9090
|
||||
selector:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
type: "{{ .Values.yugaware.service.type }}"
|
||||
{{- if and (eq .Values.yugaware.service.type "LoadBalancer") (.Values.yugaware.service.ip) }}
|
||||
loadBalancerIP: "{{ .Values.yugaware.service.ip }}"
|
||||
{{- end }}
|
||||
{{- if .Values.yugaware.service.loadBalancerSourceRanges }}
|
||||
loadBalancerSourceRanges:
|
||||
{{- toYaml .Values.yugaware.service.loadBalancerSourceRanges | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.yugaware.serviceMonitor.enabled }}
|
||||
---
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware
|
||||
{{- if .Values.yugaware.serviceMonitor.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.yugaware.serviceMonitor.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
spec:
|
||||
endpoints:
|
||||
- port: ui # Scrape the Platform itself instead of bundled Prometheus
|
||||
path: api/v1/prometheus_metrics
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
{{- end }}
|
||||
{{- if .Values.postgres.service.enabled }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-postgres
|
||||
{{- if .Values.postgres.service.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.postgres.service.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
spec:
|
||||
ports:
|
||||
- name: postgres
|
||||
port: 5432
|
||||
targetPort: 5432
|
||||
selector:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
type: {{ .Values.postgres.service.type }}
|
||||
{{- if and (eq .Values.postgres.service.type "LoadBalancer") (.Values.postgres.service.ip) }}
|
||||
loadBalancerIP: "{{ .Values.postgres.service.ip }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
|
@ -0,0 +1,456 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
spec:
|
||||
serviceName: {{ .Release.Name }}-yugaware
|
||||
replicas: {{ .Values.yugaware.replicas }}
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configs.yaml") . | sha256sum }}
|
||||
{{- if .Values.yugaware.pod.annotations }}
|
||||
{{ toYaml .Values.yugaware.pod.annotations | indent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware
|
||||
{{- if .Values.yugaware.pod.labels }}
|
||||
{{ toYaml .Values.yugaware.pod.labels | indent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
serviceAccountName: {{ .Values.yugaware.serviceAccount | default .Release.Name }}
|
||||
imagePullSecrets:
|
||||
- name: {{ .Values.image.pullSecret }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext:
|
||||
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||
{{- if (semverCompare ">=1.20-x" .Capabilities.KubeVersion.Version) }}
|
||||
fsGroupChangePolicy: {{ .Values.securityContext.fsGroupChangePolicy }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{ toYaml .Values.nodeSelector | indent 8}}
|
||||
{{- end }}
|
||||
{{- if .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- with .Values.tolerations }}{{ toYaml . | nindent 8 }}{{ end }}
|
||||
{{- end }}
|
||||
{{- if .Values.zoneAffinity }}
|
||||
affinity:
|
||||
nodeAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
nodeSelectorTerms:
|
||||
- matchExpressions:
|
||||
- key: failure-domain.beta.kubernetes.io/zone
|
||||
operator: In
|
||||
values:
|
||||
{{ toYaml .Values.zoneAffinity | indent 18 }}
|
||||
- matchExpressions:
|
||||
- key: topology.kubernetes.io/zone
|
||||
operator: In
|
||||
values:
|
||||
{{ toYaml .Values.zoneAffinity | indent 18 }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: yugaware-storage
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Release.Name }}-yugaware-storage
|
||||
- name: yugaware-ui
|
||||
emptyDir: {}
|
||||
- name: yugaware-config
|
||||
projected:
|
||||
sources:
|
||||
- configMap:
|
||||
name: {{ .Release.Name }}-yugaware-app-config
|
||||
items:
|
||||
- key: application.docker.conf
|
||||
path: application.docker.conf
|
||||
{{- if .Values.yugaware.universe_boot_script }}
|
||||
- configMap:
|
||||
name: {{ .Release.Name }}-universe-boot-script
|
||||
items:
|
||||
- key: universe_boot_script
|
||||
path: universe-boot-script.sh
|
||||
{{- end }}
|
||||
- name: prometheus-config
|
||||
configMap:
|
||||
name: {{ .Release.Name }}-yugaware-prometheus-config
|
||||
items:
|
||||
- key: prometheus.yml
|
||||
path: prometheus.yml
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
- name: init-container-script
|
||||
configMap:
|
||||
name: {{ .Release.Name }}-yugaware-init
|
||||
items:
|
||||
- key: init-permissions.sh
|
||||
path: init-permissions.sh
|
||||
{{- end }}
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: {{ .Release.Name }}-yugaware-tls-pem
|
||||
secret:
|
||||
secretName: {{ .Release.Name }}-yugaware-tls-pem
|
||||
items:
|
||||
- key: server.pem
|
||||
path: server.pem
|
||||
{{- end }}
|
||||
{{- if .Values.prometheus.remoteWrite.tls.enabled }}
|
||||
- name: {{ .Release.Name }}-yugaware-prometheus-remote-write-tls
|
||||
secret:
|
||||
secretName: {{ .Release.Name }}-yugaware-prometheus-remote-write-tls
|
||||
{{- end }}
|
||||
{{- if not (and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io")) }}
|
||||
- name: pg-upgrade-11-to-14
|
||||
configMap:
|
||||
name: {{ .Release.Name }}-yugaware-pg-upgrade
|
||||
items:
|
||||
- key: pg-upgrade-11-to-14.sh
|
||||
path: pg-upgrade-11-to-14.sh
|
||||
{{- end }}
|
||||
- name: pg-init
|
||||
configMap:
|
||||
name: {{ .Release.Name }}-yugaware-pg-prerun
|
||||
items:
|
||||
- key: pg-prerun.sh
|
||||
path: pg-prerun.sh
|
||||
{{- if .Values.postgres.extraVolumes -}}
|
||||
{{- include "yugaware.isExtraVolumesMappingExists" .Values.postgres -}}
|
||||
{{- .Values.postgres.extraVolumes | toYaml | nindent 8 -}}
|
||||
{{ end }}
|
||||
{{- with .Values.dnsConfig }}
|
||||
dnsConfig: {{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.dnsPolicy }}
|
||||
dnsPolicy: {{ . | quote }}
|
||||
{{- end }}
|
||||
initContainers:
|
||||
- image: {{ include "full_yugaware_image" . }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- if .Values.initContainers.prometheusConfiguration.resources }}
|
||||
resources: {{- toYaml .Values.initContainers.prometheusConfiguration.resources | nindent 12 }}
|
||||
{{ end -}}
|
||||
name: prometheus-configuration
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
command:
|
||||
- 'bash'
|
||||
- '-c'
|
||||
- |
|
||||
cp /default_prometheus_config/prometheus.yml /prometheus_configs/prometheus.yml && /bin/bash /init-container/init-permissions.sh;
|
||||
securityContext:
|
||||
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||
runAsGroup: {{ .Values.securityContext.runAsGroup }}
|
||||
runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }}
|
||||
{{- else }}
|
||||
command: ["cp", "/default_prometheus_config/prometheus.yml", "/prometheus_configs/prometheus.yml"]
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: prometheus-config
|
||||
mountPath: /default_prometheus_config
|
||||
- name: yugaware-storage
|
||||
mountPath: /prometheus_configs
|
||||
subPath: prometheus.yml
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/yugaware/data/
|
||||
subPath: data
|
||||
- name: init-container-script
|
||||
mountPath: /init-container
|
||||
{{- end }}
|
||||
{{- if not (and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io")) }}
|
||||
- image: {{ include "full_image" (dict "containerName" "postgres-upgrade" "root" .) }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
name: postgres-upgrade
|
||||
{{- if .Values.initContainers.postgresUpgrade.resources }}
|
||||
resources: {{- toYaml .Values.initContainers.postgresUpgrade.resources | nindent 12 }}
|
||||
{{ end -}}
|
||||
command:
|
||||
- 'bash'
|
||||
- '-c'
|
||||
- /bin/bash /pg_upgrade_11_to_14/pg-upgrade-11-to-14.sh;
|
||||
env:
|
||||
- name: PGDATANEW
|
||||
value: /var/lib/postgresql/14/pgdata
|
||||
- name: PGDATAOLD
|
||||
value: /var/lib/postgresql/11/pgdata
|
||||
# https://github.com/tianon/docker-postgres-upgrade/issues/10#issuecomment-523020113
|
||||
- name: PGUSER
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_user
|
||||
- name: POSTGRES_INITDB_ARGS
|
||||
value: "-U $PGUSER"
|
||||
volumeMounts:
|
||||
- name: yugaware-storage
|
||||
mountPath: /var/lib/postgresql/11/
|
||||
subPath: postgres_data
|
||||
- name: yugaware-storage
|
||||
mountPath: /var/lib/postgresql/14/
|
||||
subPath: postgres_data_14
|
||||
- name: pg-upgrade-11-to-14
|
||||
mountPath: /pg_upgrade_11_to_14
|
||||
- name: yugaware-storage
|
||||
mountPath: /pg_upgrade_logs
|
||||
subPath: postgres_data_14
|
||||
{{- end }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
- image: {{ include "full_image" (dict "containerName" "postgres" "root" .) }}
|
||||
name: postgres-init
|
||||
{{- if .Values.initContainers.postgresInit.resources }}
|
||||
resources: {{- toYaml .Values.initContainers.postgresInit.resources | nindent 12 }}
|
||||
{{ end -}}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
command: ["/bin/bash", "/pg_prerun/pg-prerun.sh"]
|
||||
env:
|
||||
- name: PGDATA
|
||||
value: /var/lib/postgresql/data/pgdata
|
||||
- name: PG_UID
|
||||
value: {{ .Values.securityContext.runAsUser | quote }}
|
||||
- name: PG_GID
|
||||
value: {{ .Values.securityContext.runAsGroup | quote }}
|
||||
volumeMounts:
|
||||
- name: yugaware-storage
|
||||
mountPath: /var/lib/postgresql/data
|
||||
subPath: postgres_data_14
|
||||
- name: pg-init
|
||||
mountPath: /pg_prerun
|
||||
{{- end }}
|
||||
containers:
|
||||
{{ if not .Values.postgres.external.host }}
|
||||
- name: postgres
|
||||
image: {{ include "full_image" (dict "containerName" "postgres" "root" .) }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
args:
|
||||
{{- if and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io") }}
|
||||
- "run-postgresql"
|
||||
{{- end }}
|
||||
- "-c"
|
||||
- "huge_pages=off"
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext:
|
||||
runAsUser: {{ required "runAsUser cannot be empty" .Values.securityContext.runAsUser }}
|
||||
runAsGroup: {{ .Values.securityContext.runAsGroup | default 0 }}
|
||||
runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }}
|
||||
{{- end }}
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_user
|
||||
- name: POSTGRES_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_password
|
||||
- name: POSTGRES_DB
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_db
|
||||
{{- if and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io") }}
|
||||
# Hardcoded the POSTGRESQL_USER because it's mandatory env var in RH PG image
|
||||
# It doesn't have access to create the DB, so YBA fails to create the perf_advisor DB.
|
||||
# Need to use admin user of RH PG image (postgres)
|
||||
# Changing the user name won't be possible moving forward for OpenShift certified chart
|
||||
- name: POSTGRESQL_USER
|
||||
value: pg-yba
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: {{ .Release.Name }}-yugaware-global-config
|
||||
# key: postgres_user
|
||||
- name: POSTGRESQL_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_password
|
||||
- name: POSTGRESQL_ADMIN_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_password
|
||||
- name: POSTGRESQL_DATABASE
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_db
|
||||
{{- else }}
|
||||
# The RH Postgres image doesn't allow this directory to be changed.
|
||||
- name: PGDATA
|
||||
value: /var/lib/postgresql/data/pgdata
|
||||
{{- end }}
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
name: postgres
|
||||
|
||||
{{- if .Values.postgres.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.postgres.resources | indent 12 }}
|
||||
{{ end }}
|
||||
|
||||
volumeMounts:
|
||||
- name: yugaware-storage
|
||||
{{- if and (.Values.ocpCompatibility.enabled) (eq .Values.image.postgres.registry "registry.redhat.io") }}
|
||||
mountPath: /var/lib/pgsql/data
|
||||
subPath: postgres_data_13
|
||||
{{- else }}
|
||||
mountPath: /var/lib/postgresql/data
|
||||
subPath: postgres_data_14
|
||||
{{- end }}
|
||||
{{- if .Values.postgres.extraVolumeMounts -}}
|
||||
{{- include "yugaware.isExtraVolumesMappingExists" .Values.postgres -}}
|
||||
{{- .Values.postgres.extraVolumeMounts | toYaml | nindent 12 -}}
|
||||
{{- end -}}
|
||||
{{ end }}
|
||||
- name: prometheus
|
||||
image: {{ include "full_image" (dict "containerName" "prometheus" "root" .) }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext:
|
||||
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||
runAsGroup: {{ .Values.securityContext.runAsGroup }}
|
||||
runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }}
|
||||
{{- else if (not .Values.ocpCompatibility.enabled) }}
|
||||
securityContext:
|
||||
runAsUser: 0
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.prometheus.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.prometheus.resources | indent 12 }}
|
||||
{{ end }}
|
||||
|
||||
volumeMounts:
|
||||
- name: yugaware-storage
|
||||
mountPath: /prometheus_configs
|
||||
subPath: prometheus.yml
|
||||
- name: yugaware-storage
|
||||
mountPath: /prometheus/
|
||||
- mountPath: /opt/yugabyte/yugaware/data/keys/
|
||||
name: yugaware-storage
|
||||
subPath: data/keys
|
||||
{{- if .Values.prometheus.scrapeNodes }}
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/prometheus/targets
|
||||
subPath: swamper_targets
|
||||
{{- end }}
|
||||
{{- if .Values.prometheus.evaluateAlertRules }}
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/prometheus/rules
|
||||
subPath: swamper_rules
|
||||
{{- end }}
|
||||
{{- if .Values.prometheus.remoteWrite.tls.enabled }}
|
||||
- name: {{ .Release.Name }}-yugaware-prometheus-remote-write-tls
|
||||
mountPath: /opt/remote_write/certs/
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
args:
|
||||
- --config.file=/prometheus_configs/prometheus.yml
|
||||
- --storage.tsdb.path=/prometheus/
|
||||
- --web.enable-admin-api
|
||||
- --web.enable-lifecycle
|
||||
- --storage.tsdb.retention.time={{ .Values.prometheus.retentionTime }}
|
||||
- --query.max-concurrency={{ .Values.prometheus.queryConcurrency }}
|
||||
- --query.max-samples={{ .Values.prometheus.queryMaxSamples }}
|
||||
- --query.timeout={{ .Values.prometheus.queryTimeout }}
|
||||
ports:
|
||||
- containerPort: 9090
|
||||
- name: yugaware
|
||||
image: {{ include "full_yugaware_image" . }}
|
||||
{{- if .Values.securityContext.enabled }}
|
||||
securityContext:
|
||||
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||
runAsGroup: {{ .Values.securityContext.runAsGroup }}
|
||||
runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }}
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
|
||||
{{- if .Values.yugaware.resources }}
|
||||
resources:
|
||||
{{ toYaml .Values.yugaware.resources | indent 12 }}
|
||||
{{- end }}
|
||||
args: ["bin/yugaware","-Dconfig.file=/data/application.docker.conf"]
|
||||
env:
|
||||
# Conditionally set these env variables, if runAsUser is not 0(root)
|
||||
# or 10001(yugabyte).
|
||||
{{- if eq (include "checkNssWrapperExportRequired" .) "true" }}
|
||||
- name: NSS_WRAPPER_GROUP
|
||||
value: "/tmp/group.template"
|
||||
- name: NSS_WRAPPER_PASSWD
|
||||
value: "/tmp/passwd.template"
|
||||
- name: LD_PRELOAD
|
||||
value: "/usr/lib64/libnss_wrapper.so"
|
||||
{{- end }}
|
||||
- name: POSTGRES_USER
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_user
|
||||
- name: POSTGRES_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_password
|
||||
- name: POSTGRES_DB
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: postgres_db
|
||||
- name: APP_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Release.Name }}-yugaware-global-config
|
||||
key: app_secret
|
||||
{{- with .Values.yugaware.extraEnv }}{{ toYaml . | nindent 12 }}{{ end }}
|
||||
ports:
|
||||
- containerPort: 9000
|
||||
name: yugaware
|
||||
volumeMounts:
|
||||
- name: yugaware-config
|
||||
mountPath: /data
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/yugaware/data/
|
||||
subPath: data
|
||||
# old path for backward compatibility
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugaware_data/
|
||||
subPath: data
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/releases/
|
||||
subPath: releases
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/ybc/releases/
|
||||
subPath: ybc_releases
|
||||
# old path for backward compatibility
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/releases/
|
||||
subPath: releases
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/prometheus/targets
|
||||
subPath: swamper_targets
|
||||
- name: yugaware-storage
|
||||
mountPath: /opt/yugabyte/prometheus/rules
|
||||
subPath: swamper_rules
|
||||
- name: yugaware-storage
|
||||
mountPath: /prometheus_configs
|
||||
subPath: prometheus.yml
|
||||
{{- if .Values.tls.enabled }}
|
||||
- name: {{ .Release.Name }}-yugaware-tls-pem
|
||||
mountPath: /opt/certs/
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{ if .Values.sidecars }}
|
||||
{{ toYaml .Values.sidecars | indent 8 }}
|
||||
{{ end }}
|
|
@ -0,0 +1,37 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-test
|
||||
labels:
|
||||
app: {{ .Release.Name }}-yugaware-test
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: {{ .Values.image.pullSecret }}
|
||||
containers:
|
||||
- name: yugaware-test
|
||||
image: {{ include "full_yugaware_image" . }}
|
||||
command:
|
||||
- '/bin/bash'
|
||||
- '-ec'
|
||||
- >
|
||||
sleep 60s;
|
||||
{{- if .Values.tls.enabled }}
|
||||
- >
|
||||
curl --head -k https://{{ .Release.Name }}-yugaware-ui
|
||||
{{- else }}
|
||||
- >
|
||||
curl --head http://{{ .Release.Name }}-yugaware-ui
|
||||
{{- end }}
|
||||
# Hard coded resources to the test pod.
|
||||
resources:
|
||||
limits:
|
||||
cpu: "1"
|
||||
memory: "512Mi"
|
||||
requests:
|
||||
cpu: "0.5"
|
||||
memory: "256Mi"
|
||||
restartPolicy: Never
|
|
@ -0,0 +1,21 @@
|
|||
# Copyright (c) YugaByte, Inc.
|
||||
{{- if .Values.yugaware.universe_boot_script }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-universe-boot-script
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
data:
|
||||
universe_boot_script: |
|
||||
{{- if hasPrefix "#!" .Values.yugaware.universe_boot_script }}
|
||||
{{ tpl .Values.yugaware.universe_boot_script . | indent 4 }}
|
||||
{{- else }}
|
||||
{{ tpl (.Files.Get .Values.yugaware.universe_boot_script) . | indent 4 }}
|
||||
{{- end }}
|
||||
|
||||
{{- end }}
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-yugaware-storage
|
||||
{{- if .Values.yugaware.storageAnnotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.yugaware.storageAnnotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
app: {{ template "yugaware.name" . }}
|
||||
chart: {{ template "yugaware.chart" . }}
|
||||
release: {{ .Release.Name }}
|
||||
heritage: {{ .Values.helm2Legacy | ternary "Tiller" (.Release.Service | quote) }}
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
{{- if .Values.yugaware.storageClass }}
|
||||
storageClassName: {{ .Values.yugaware.storageClass }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.yugaware.storage }}
|
|
@ -0,0 +1,40 @@
|
|||
suite: Resources verification
|
||||
templates:
|
||||
- statefulset.yaml
|
||||
- configs.yaml
|
||||
tests:
|
||||
- it: YBA container
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.containers[?(@.name == "yugaware")].resources.requests
|
||||
|
||||
- it: Postgres container
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.containers[?(@.name == "postgres")].resources.requests
|
||||
|
||||
- it: Prometheus container
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.containers[?(@.name == "prometheus")].resources.requests
|
||||
|
||||
- it: Postgres-init initContainer
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.initContainers[?(@.name == "postgres-init")].resources.requests
|
||||
|
||||
- it: Prometheus-configuration initContainer
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.initContainers[?(@.name == "prometheus-configuration")].resources.requests
|
||||
|
||||
- it: Postgres-upgrade initContainer
|
||||
template: statefulset.yaml
|
||||
asserts:
|
||||
- isNotEmpty:
|
||||
path: spec.template.spec.initContainers[?(@.name == "postgres-upgrade")].resources.requests
|
|
@ -0,0 +1,328 @@
|
|||
# Default values for yugaware.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
fullnameOverride: ""
|
||||
nameOverride: ""
|
||||
|
||||
image:
|
||||
commonRegistry: ""
|
||||
# Setting commonRegistry to say, quay.io overrides the registry settings for all images
|
||||
# including the yugaware image
|
||||
|
||||
repository: quay.io/yugabyte/yugaware
|
||||
tag: 2.18.9.0-b17
|
||||
pullPolicy: IfNotPresent
|
||||
pullSecret: yugabyte-k8s-pull-secret
|
||||
## Docker config JSON File name
|
||||
## If set, this file content will be used to automatically create secret named as above
|
||||
pullSecretFile: ""
|
||||
|
||||
postgres:
|
||||
registry: ""
|
||||
tag: '14.9'
|
||||
name: postgres
|
||||
|
||||
postgres-upgrade:
|
||||
registry: ""
|
||||
tag: "11-to-14"
|
||||
name: tianon/postgres-upgrade
|
||||
|
||||
prometheus:
|
||||
registry: ""
|
||||
tag: v2.47.1
|
||||
name: prom/prometheus
|
||||
|
||||
|
||||
yugaware:
|
||||
replicas: 1
|
||||
storage: 100Gi
|
||||
storageClass: ""
|
||||
storageAnnotations: {}
|
||||
multiTenant: false
|
||||
## Name of existing ServiceAccount. When provided, the chart won't create a ServiceAccount.
|
||||
## It will attach the required RBAC roles to it.
|
||||
## Helpful in Yugabyte Platform GKE App.
|
||||
serviceAccount: ''
|
||||
serviceMonitor:
|
||||
enabled: false
|
||||
annotations: {}
|
||||
serviceAccountAnnotations: {}
|
||||
service:
|
||||
annotations: {}
|
||||
clusterIP: ""
|
||||
enabled: true
|
||||
ip: ""
|
||||
type: "LoadBalancer"
|
||||
## whitelist source CIDRs
|
||||
#loadBalancerSourceRanges:
|
||||
#- 0.0.0.0/0
|
||||
#- 192.168.100.0/24
|
||||
pod:
|
||||
annotations: {}
|
||||
labels: {}
|
||||
health:
|
||||
username: ""
|
||||
password: ""
|
||||
email: ""
|
||||
resources:
|
||||
requests:
|
||||
cpu: "2"
|
||||
memory: 4Gi
|
||||
enableProxyMetricsAuth: true
|
||||
## List of additional alowed CORS origins in case of complex rev-proxy
|
||||
additionAllowedCorsOrigins: []
|
||||
proxyEndpointTimeoutMs: 3 minute
|
||||
## Enables features specific for cloud deployments
|
||||
cloud:
|
||||
enabled: false
|
||||
requestIdHeader: "X-REQUEST-ID"
|
||||
|
||||
podDisruptionBudget:
|
||||
# See https://kubernetes.io/docs/tasks/run-application/configure-pdb/
|
||||
# Note that the default of 0 doesn't really make sense since a StatefulSet isn't allowed to schedule extra replicas. However it is maintained as the default while we do additional testing. This value will likely change in the future.
|
||||
maxUnavailable: 0
|
||||
|
||||
universe_boot_script: ""
|
||||
|
||||
extraEnv: []
|
||||
|
||||
# In case client wants to enable the additional headers to the YBA's http response
|
||||
# Previously, it was possible via nginx, but given that we no longer have it, we can
|
||||
# expose the same as application config/runtime config.
|
||||
# Example: ["X-Content-Type-Options: nosniff", "Keep-Alive: timeout=5, max=1000"]
|
||||
custom_headers: []
|
||||
|
||||
## Configure PostgreSQL part of the application
|
||||
postgres:
|
||||
# DO NOT CHANGE if using OCP Certified helm chart
|
||||
user: postgres
|
||||
dbname: yugaware
|
||||
|
||||
service:
|
||||
## Expose internal Postgres as a Service
|
||||
enabled: false
|
||||
## Additional Service annotations
|
||||
annotations: {}
|
||||
## Service type
|
||||
type: "ClusterIP"
|
||||
## IP address for the LoadBalancer, works only if supported by the cloud provider
|
||||
ip: ""
|
||||
|
||||
resources:
|
||||
requests:
|
||||
cpu: "0.5"
|
||||
memory: 1Gi
|
||||
|
||||
# If external.host is set then we will connect to an external postgres database server instead of starting our own.
|
||||
external:
|
||||
host: ""
|
||||
port: 5432
|
||||
pass: ""
|
||||
dbname: postgres
|
||||
user: postgres
|
||||
|
||||
## JDBC connection parameters including the leading `?`.
|
||||
jdbcParams: ""
|
||||
|
||||
|
||||
## Extra volumes
|
||||
## extraVolumesMounts are mandatory for each extraVolumes.
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volume-v1-core
|
||||
## Example:
|
||||
# extraVolumes:
|
||||
# - name: custom-nfs-vol
|
||||
# persistentVolumeClaim:
|
||||
# claimName: some-nfs-claim
|
||||
extraVolumes: []
|
||||
|
||||
## Extra volume mounts
|
||||
## Ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#volumemount-v1-core
|
||||
## Example:
|
||||
# extraVolumeMounts:
|
||||
# - name: custom-nfs-vol
|
||||
# mountPath: /home/yugabyte/nfs-backup
|
||||
extraVolumeMounts: []
|
||||
|
||||
tls:
|
||||
enabled: false
|
||||
hostname: "localhost"
|
||||
## Expects base 64 encoded values for certificate and key.
|
||||
certificate: ""
|
||||
key: ""
|
||||
sslProtocols: "" # if set, override default Nginx SSL protocols setting
|
||||
## cert-manager values
|
||||
## If cert-manager is enabled:
|
||||
## If genSelfsigned: true:
|
||||
## Create a self-signed issuer/clusterIssuer
|
||||
## Generate a rootCA using the above issuer.
|
||||
## Generate a tls certificate with secret name as: {{ .Release.Name }}-yugaware-tls-cert
|
||||
## Else if genSelfsigned: false:
|
||||
## Expect a clusterIssuer/issuer to be provided by user
|
||||
## Generate a tls cert based on above issuer with secret name as: {{ .Release.Name }}-yugaware-tls-cert
|
||||
certManager:
|
||||
enabled: false
|
||||
genSelfsigned: true
|
||||
useClusterIssuer: false
|
||||
clusterIssuer: cluster-ca
|
||||
issuer: yugaware-ca
|
||||
## Configuration for the TLS certificate requested from Issuer/ClusterIssuer
|
||||
configuration:
|
||||
duration: 8760h # 90d
|
||||
renewBefore: 240h # 15d
|
||||
algorithm: RSA # ECDSA or RSA
|
||||
# Can be 2048, 4096 or 8192 for RSA
|
||||
# Or 256, 384 or 521 for ECDSA
|
||||
keySize: 2048
|
||||
|
||||
## yugaware pod Security Context
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||
securityContext:
|
||||
enabled: true
|
||||
## fsGroup related values are set at the pod level.
|
||||
fsGroup: 10001
|
||||
fsGroupChangePolicy: "OnRootMismatch"
|
||||
## Expected to have runAsUser values != 0 when
|
||||
## runAsNonRoot is set to true, otherwise container creation fails.
|
||||
runAsUser: 10001
|
||||
runAsGroup: 10001
|
||||
runAsNonRoot: true
|
||||
|
||||
helm:
|
||||
timeout: 900
|
||||
packagePath: "/opt/yugabyte/helm"
|
||||
|
||||
domainName: "cluster.local"
|
||||
|
||||
helm2Legacy: false
|
||||
|
||||
ip_version_support: "v4_only" # v4_only, v6_only are the only supported values at the moment
|
||||
|
||||
rbac:
|
||||
## Set this to false if you don't have enough permissions to create
|
||||
## ClusterRole and Binding, for example an OpenShift cluster. When
|
||||
## set to false, some of the graphs from Container section of the
|
||||
## Metrics UI don't work.
|
||||
create: true
|
||||
|
||||
## In order to deploy on OpenShift Container Platform, set this to
|
||||
## true.
|
||||
ocpCompatibility:
|
||||
enabled: false
|
||||
|
||||
# Extra containers to add to the pod.
|
||||
sidecars: []
|
||||
|
||||
## Following two controls for placement of pod - nodeSelector and AZ affinity.
|
||||
## Note: Remember to also provide a yugaware.StorageClass that has a olumeBindingMode of
|
||||
## WaitForFirstConsumer so that the PVC is created in the right topology visible to this pod.
|
||||
## See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
|
||||
## eg.
|
||||
## nodeSelector:
|
||||
## topology.kubernetes.io/region: us-west1
|
||||
nodeSelector: {}
|
||||
|
||||
## Affinity to a particular zone for the pod.
|
||||
## See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
|
||||
## eg.
|
||||
## nodeAffinity:
|
||||
## requiredDuringSchedulingIgnoredDuringExecution:
|
||||
## nodeSelectorTerms:
|
||||
## - matchExpressions:
|
||||
## - key: failure-domain.beta.kubernetes.io/zone
|
||||
## operator: In
|
||||
## values:
|
||||
## - us-west1-a
|
||||
## - us-west1-b
|
||||
zoneAffinity: {}
|
||||
|
||||
## The tolerations that the pod should have.
|
||||
## See https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
|
||||
tolerations: []
|
||||
|
||||
## @param dnsPolicy DNS Policy for pod
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
|
||||
## E.g.
|
||||
## dnsPolicy: ClusterFirst
|
||||
dnsPolicy: ""
|
||||
## @param dnsConfig DNS Configuration pod
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
|
||||
## E.g.
|
||||
## dnsConfig:
|
||||
## options:
|
||||
## - name: ndots
|
||||
## value: "4"
|
||||
dnsConfig: {}
|
||||
|
||||
## Don't want prometheus to scrape nodes and evaluate alert rules in some cases (for example - cloud).
|
||||
prometheus:
|
||||
## Setting this to false will disable scraping of TServer and Master
|
||||
## nodes (could be pods or VMs)
|
||||
scrapeNodes: true
|
||||
evaluateAlertRules: true
|
||||
retentionTime: 15d
|
||||
queryConcurrency: 20
|
||||
queryMaxSamples: 5000000
|
||||
queryTimeout: 30s
|
||||
## Set this to false to disable scraping of Kubernetes worker
|
||||
## nodes. Setting this to false will results in blank graphs of
|
||||
## resource utilization for Kubernetes universes. Useful for
|
||||
## scenarios where only VM based universes are being created.
|
||||
scrapeKubernetesNodes: true
|
||||
|
||||
resources:
|
||||
requests:
|
||||
cpu: "2"
|
||||
memory: 4Gi
|
||||
|
||||
## Prometheus remote write config, as described here:
|
||||
## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
|
||||
## If tls configuration is needed, set prometheus.remoteWrite.tls.enabled = true and provide
|
||||
## necessary certificates/keys in base64 format as prometheus.remoteWrite.tls.[caCert|cert|key].
|
||||
## Remote write config should expect certs/keys in
|
||||
## /opt/remote_write/certs/[ca.crt|client.crt|client.key] respectively.
|
||||
remoteWrite:
|
||||
config: []
|
||||
tls:
|
||||
enabled: false
|
||||
## base64 encoded certificates and key expected
|
||||
caCert: ""
|
||||
clientCert: ""
|
||||
clientKey: ""
|
||||
|
||||
|
||||
# Arbitrary key=value config entries for application.docker.conf
|
||||
additionalAppConf:
|
||||
stringConf: {}
|
||||
nonStringConf: {}
|
||||
|
||||
jdbcParams: ""
|
||||
|
||||
## Override the APIVersion used by policy group for
|
||||
## PodDisruptionBudget resources. The chart selects the correct
|
||||
## APIVersion based on the target Kubernetes cluster. You don't need
|
||||
## to modify this unless you are using helm template command i.e. GKE
|
||||
## app's deployer image against a Kubernetes cluster >= 1.21.
|
||||
# pdbPolicyVersionOverride: "v1beta1"
|
||||
pdbPolicyVersionOverride: ""
|
||||
|
||||
initContainers:
|
||||
prometheusConfiguration:
|
||||
resources:
|
||||
## https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container
|
||||
## Use the above link to learn more about Kubernetes resources configuration.
|
||||
requests:
|
||||
cpu: "0.25"
|
||||
memory: 500Mi
|
||||
|
||||
postgresUpgrade:
|
||||
resources:
|
||||
requests:
|
||||
cpu: "0.5"
|
||||
memory: 500Mi
|
||||
|
||||
postgresInit:
|
||||
resources:
|
||||
requests:
|
||||
cpu: "0.25"
|
||||
memory: 500Mi
|
54
index.yaml
54
index.yaml
|
@ -38459,6 +38459,32 @@ entries:
|
|||
- assets/hashicorp/vault-0.25.0.tgz
|
||||
version: 0.25.0
|
||||
yugabyte:
|
||||
- annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB
|
||||
catalog.cattle.io/kube-version: '>=1.18-0'
|
||||
catalog.cattle.io/release-name: yugabyte
|
||||
charts.openshift.io/name: yugabyte
|
||||
apiVersion: v2
|
||||
appVersion: 2.18.9.0-b17
|
||||
created: "2024-08-16T00:47:51.025357908Z"
|
||||
description: YugabyteDB is the high-performance distributed SQL database for building
|
||||
global, internet-scale apps.
|
||||
digest: 6349349280d86367608073a89c936ff08c1107b898d7b4b41323af8b02517084
|
||||
home: https://www.yugabyte.com
|
||||
icon: file://assets/icons/yugabyte.jpg
|
||||
kubeVersion: '>=1.18-0'
|
||||
maintainers:
|
||||
- email: sanketh@yugabyte.com
|
||||
name: Sanketh Indarapu
|
||||
- email: gjalla@yugabyte.com
|
||||
name: Govardhan Reddy Jalla
|
||||
name: yugabyte
|
||||
sources:
|
||||
- https://github.com/yugabyte/yugabyte-db
|
||||
urls:
|
||||
- assets/yugabyte/yugabyte-2.18.9.tgz
|
||||
version: 2.18.9
|
||||
- annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB
|
||||
|
@ -39018,6 +39044,32 @@ entries:
|
|||
- assets/yugabyte/yugabyte-2.14.11.tgz
|
||||
version: 2.14.11
|
||||
yugaware:
|
||||
- annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB Anywhere
|
||||
catalog.cattle.io/kube-version: '>=1.18-0'
|
||||
catalog.cattle.io/release-name: yugaware
|
||||
charts.openshift.io/name: yugaware
|
||||
apiVersion: v2
|
||||
appVersion: 2.18.9.0-b17
|
||||
created: "2024-08-16T00:47:51.053149883Z"
|
||||
description: YugabyteDB Anywhere provides deployment, orchestration, and monitoring
|
||||
for managing YugabyteDB clusters. YugabyteDB Anywhere can create a YugabyteDB
|
||||
cluster with multiple pods provided by Kubernetes or OpenShift and logically
|
||||
grouped together to form one logical distributed database.
|
||||
digest: 553bf3c394fdb67a4b9169f89d59d9ec367f8ce4020d72a5bc43be69e5084bb3
|
||||
home: https://www.yugabyte.com
|
||||
icon: file://assets/icons/yugaware.jpg
|
||||
kubeVersion: '>=1.18-0'
|
||||
maintainers:
|
||||
- email: sanketh@yugabyte.com
|
||||
name: Sanketh Indarapu
|
||||
- email: gjalla@yugabyte.com
|
||||
name: Govardhan Reddy Jalla
|
||||
name: yugaware
|
||||
urls:
|
||||
- assets/yugabyte/yugaware-2.18.9.tgz
|
||||
version: 2.18.9
|
||||
- annotations:
|
||||
catalog.cattle.io/certified: partner
|
||||
catalog.cattle.io/display-name: YugabyteDB Anywhere
|
||||
|
@ -39588,4 +39640,4 @@ entries:
|
|||
urls:
|
||||
- assets/netfoundry/ziti-host-1.5.1.tgz
|
||||
version: 1.5.1
|
||||
generated: "2024-08-15T00:45:45.600342711Z"
|
||||
generated: "2024-08-16T00:47:46.508643026Z"
|
||||
|
|
Loading…
Reference in New Issue