Add ClickHouse
This commit is contained in:
parent
63e152f59c
commit
d0e3918950
2
build.sh
2
build.sh
@ -15,3 +15,5 @@ helm template superset https://github.com/apache/superset/releases/download/supe
|
||||
|
||||
|
||||
docker buildx build --push -t registry.dev.k8s.transcity/reports/superset:5.0.0 superset-image
|
||||
|
||||
helm template ch-operator https://github.com/Altinity/helm-charts/releases/download/release-0.25.6/altinity-clickhouse-operator-0.25.6.tgz --namespace reports-clickhouse --values clickhouse-operator-values.yaml > clickhouse/base/clickhouse-operator.yaml
|
||||
|
||||
931
clickhouse-operator-values-ref.yaml
Normal file
931
clickhouse-operator-values-ref.yaml
Normal file
@ -0,0 +1,931 @@
|
||||
namespaceOverride: ""
|
||||
# commonLabels -- set of labels that will be applied to all the resources for the operator
|
||||
commonLabels: {}
|
||||
# commonAnnotations -- set of annotations that will be applied to all the resources for the operator
|
||||
commonAnnotations: {}
|
||||
deployment:
|
||||
# look details in `kubectl explain deployment.spec.strategy`
|
||||
strategy:
|
||||
type: Recreate
|
||||
crdHook:
|
||||
# crdHook.enabled -- enable automatic CRD installation/update via pre-install/pre-upgrade hooks
|
||||
# when disabled, CRDs must be installed manually using kubectl apply
|
||||
enabled: true
|
||||
image:
|
||||
# crdHook.image.repository -- image repository for CRD installation job
|
||||
repository: bitnami/kubectl
|
||||
# crdHook.image.tag -- image tag for CRD installation job
|
||||
tag: "latest"
|
||||
# crdHook.image.pullPolicy -- image pull policy for CRD installation job
|
||||
pullPolicy: IfNotPresent
|
||||
# crdHook.resources -- resource limits and requests for CRD installation job
|
||||
resources: {}
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# crdHook.nodeSelector -- node selector for CRD installation job
|
||||
nodeSelector: {}
|
||||
# crdHook.tolerations -- tolerations for CRD installation job
|
||||
tolerations: []
|
||||
# crdHook.affinity -- affinity for CRD installation job
|
||||
affinity: {}
|
||||
operator:
|
||||
image:
|
||||
# operator.image.repository -- image repository
|
||||
repository: altinity/clickhouse-operator
|
||||
# operator.image.tag -- image tag (chart's appVersion value will be used if not set)
|
||||
tag: ""
|
||||
# operator.image.pullPolicy -- image pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
containerSecurityContext: {}
|
||||
# operator.resources -- custom resource configuration, check `kubectl explain pod.spec.containers.resources` for details
|
||||
resources: {}
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
# operator.priorityClassName -- priority class name for the clickhouse-operator deployment, check `kubectl explain pod.spec.priorityClassName` for details
|
||||
# @default -- ""
|
||||
priorityClassName: ""
|
||||
# operator.env -- additional environment variables for the clickhouse-operator container in deployment
|
||||
# possible format value `[{"name": "SAMPLE", "value": "text"}]`
|
||||
env: []
|
||||
metrics:
|
||||
enabled: true
|
||||
image:
|
||||
# metrics.image.repository -- image repository
|
||||
repository: altinity/metrics-exporter
|
||||
# metrics.image.tag -- image tag (chart's appVersion value will be used if not set)
|
||||
tag: ""
|
||||
# metrics.image.pullPolicy -- image pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
containerSecurityContext: {}
|
||||
# metrics.resources -- custom resource configuration
|
||||
resources: {}
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
# metrics.env -- additional environment variables for the deployment of metrics-exporter containers
|
||||
# possible format value `[{"name": "SAMPLE", "value": "text"}]`
|
||||
env: []
|
||||
# imagePullSecrets -- image pull secret for private images in clickhouse-operator pod
|
||||
# possible value format `[{"name":"your-secret-name"}]`,
|
||||
# check `kubectl explain pod.spec.imagePullSecrets` for details
|
||||
imagePullSecrets: []
|
||||
# podLabels -- labels to add to the clickhouse-operator pod
|
||||
podLabels: {}
|
||||
# podAnnotations -- annotations to add to the clickhouse-operator pod, check `kubectl explain pod.spec.annotations` for details
|
||||
# @default -- check the `values.yaml` file
|
||||
podAnnotations:
|
||||
prometheus.io/port: '8888'
|
||||
prometheus.io/scrape: 'true'
|
||||
clickhouse-operator-metrics/port: '9999'
|
||||
clickhouse-operator-metrics/scrape: 'true'
|
||||
# nameOverride -- override name of the chart
|
||||
nameOverride: ""
|
||||
# fullnameOverride -- full name of the chart.
|
||||
fullnameOverride: ""
|
||||
serviceAccount:
|
||||
# serviceAccount.create -- specifies whether a service account should be created
|
||||
create: true
|
||||
# serviceAccount.annotations -- annotations to add to the service account
|
||||
annotations: {}
|
||||
# serviceAccount.name -- the name of the service account to use; if not set and create is true, a name is generated using the fullname template
|
||||
name:
|
||||
rbac:
|
||||
# rbac.create -- specifies whether rbac resources should be created
|
||||
create: true
|
||||
# rbac.namespaceScoped -- specifies whether to create roles and rolebindings at the cluster level or namespace level
|
||||
namespaceScoped: false
|
||||
secret:
|
||||
# secret.create -- create a secret with operator credentials
|
||||
create: true
|
||||
# secret.username -- operator credentials username
|
||||
username: clickhouse_operator
|
||||
# secret.password -- operator credentials password
|
||||
password: clickhouse_operator_password
|
||||
# nodeSelector -- node for scheduler pod assignment, check `kubectl explain pod.spec.nodeSelector` for details
|
||||
nodeSelector: {}
|
||||
# tolerations -- tolerations for scheduler pod assignment, check `kubectl explain pod.spec.tolerations` for details
|
||||
tolerations: []
|
||||
# affinity -- affinity for scheduler pod assignment, check `kubectl explain pod.spec.affinity` for details
|
||||
affinity: {}
|
||||
# podSecurityContext - operator deployment SecurityContext, check `kubectl explain pod.spec.securityContext` for details
|
||||
podSecurityContext: {}
|
||||
# topologySpreadConstraints - topologySpreadConstraints affinity for scheduler pod assignment, check `kubectl explain pod.spec.topologySpreadConstraints` for details
|
||||
topologySpreadConstraints: []
|
||||
serviceMonitor:
|
||||
# serviceMonitor.enabled -- ServiceMonitor Custom resource is created for a [prometheus-operator](https://github.com/prometheus-operator/prometheus-operator)
|
||||
# In serviceMonitor will be created two endpoints ch-metrics on port 8888 and op-metrics # 9999. Ypu can specify interval, scrapeTimeout, relabelings, metricRelabelings for each endpoint below
|
||||
enabled: false
|
||||
# serviceMonitor.additionalLabels -- additional labels for service monitor
|
||||
additionalLabels: {}
|
||||
clickhouseMetrics:
|
||||
# serviceMonitor.interval for ch-metrics endpoint --
|
||||
interval: 30s
|
||||
# serviceMonitor.scrapeTimeout for ch-metrics endpoint -- Prometheus ServiceMonitor scrapeTimeout. If empty, Prometheus uses the global scrape timeout unless it is less than the target's scrape interval value in which the latter is used.
|
||||
scrapeTimeout: ""
|
||||
# serviceMonitor.relabelings for ch-metrics endpoint -- Prometheus [RelabelConfigs] to apply to samples before scraping
|
||||
relabelings: []
|
||||
# serviceMonitor.metricRelabelings for ch-metrics endpoint -- Prometheus [MetricRelabelConfigs] to apply to samples before ingestio
|
||||
metricRelabelings: []
|
||||
operatorMetrics:
|
||||
# serviceMonitor.interval for op-metrics endpoint --
|
||||
interval: 30s
|
||||
# serviceMonitor.scrapeTimeout for op-metrics endpoint -- Prometheus ServiceMonitor scrapeTimeout. If empty, Prometheus uses the global scrape timeout unless it is less than the target's scrape interval value in which the latter is used.
|
||||
scrapeTimeout: ""
|
||||
# serviceMonitor.relabelings for op-metrics endpoint -- Prometheus [RelabelConfigs] to apply to samples before scraping
|
||||
relabelings: []
|
||||
# serviceMonitor.metricRelabelings for op-metrics endpoint -- Prometheus [MetricRelabelConfigs] to apply to samples before ingestio
|
||||
metricRelabelings: []
|
||||
# configs -- clickhouse operator configs
|
||||
# @default -- check the `values.yaml` file for the config content (auto-generated from latest operator release)
|
||||
configs:
|
||||
confdFiles: null
|
||||
configdFiles:
|
||||
01-clickhouse-01-listen.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<!-- Listen wildcard address to allow accepting connections from other containers and host network. -->
|
||||
<listen_host>::</listen_host>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<listen_try>1</listen_try>
|
||||
</yandex>
|
||||
01-clickhouse-02-logger.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<logger>
|
||||
<!-- Possible levels: https://github.com/pocoproject/poco/blob/devel/Foundation/include/Poco/Logger.h#L439 -->
|
||||
<level>debug</level>
|
||||
<log>/var/log/clickhouse-server/clickhouse-server.log</log>
|
||||
<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
|
||||
<size>1000M</size>
|
||||
<count>10</count>
|
||||
<!-- Default behavior is autodetection (log to console if not daemon mode and is tty) -->
|
||||
<console>1</console>
|
||||
</logger>
|
||||
</yandex>
|
||||
01-clickhouse-03-query_log.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<query_log replace="1">
|
||||
<database>system</database>
|
||||
<table>query_log</table>
|
||||
<engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day</engine>
|
||||
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
|
||||
</query_log>
|
||||
<query_thread_log remove="1"/>
|
||||
</yandex>
|
||||
01-clickhouse-04-part_log.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<part_log replace="1">
|
||||
<database>system</database>
|
||||
<table>part_log</table>
|
||||
<engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day</engine>
|
||||
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
|
||||
</part_log>
|
||||
</yandex>
|
||||
01-clickhouse-05-trace_log.xml: |-
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<trace_log replace="1">
|
||||
<database>system</database>
|
||||
<table>trace_log</table>
|
||||
<engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day</engine>
|
||||
<flush_interval_milliseconds>7500</flush_interval_milliseconds>
|
||||
</trace_log>
|
||||
</yandex>
|
||||
files:
|
||||
config.yaml:
|
||||
# IMPORTANT
|
||||
# This file is auto-generated
|
||||
# Do not edit this file - all changes would be lost
|
||||
# Edit appropriate template in the following folder:
|
||||
# deploy/builder/templates-config
|
||||
# IMPORTANT
|
||||
#
|
||||
# Template parameters available:
|
||||
# WATCH_NAMESPACES=
|
||||
# CH_USERNAME_PLAIN=
|
||||
# CH_PASSWORD_PLAIN=
|
||||
# CH_CREDENTIALS_SECRET_NAMESPACE=
|
||||
# CH_CREDENTIALS_SECRET_NAME=clickhouse-operator
|
||||
# VERBOSITY=1
|
||||
|
||||
################################################
|
||||
##
|
||||
## Watch section
|
||||
##
|
||||
################################################
|
||||
watch:
|
||||
# List of namespaces where clickhouse-operator watches for events.
|
||||
# Concurrently running operators should watch on different namespaces.
|
||||
# IMPORTANT
|
||||
# Regexp is applicable.
|
||||
namespaces: []
|
||||
clickhouse:
|
||||
configuration:
|
||||
################################################
|
||||
##
|
||||
## Configuration files section
|
||||
##
|
||||
################################################
|
||||
file:
|
||||
# Each 'path' can be either absolute or relative.
|
||||
# In case path is absolute - it is used as is
|
||||
# In case path is relative - it is relative to the folder where configuration file you are reading right now is located.
|
||||
path:
|
||||
# Path to the folder where ClickHouse configuration files common for all instances within a CHI are located.
|
||||
common: chi/config.d
|
||||
# Path to the folder where ClickHouse configuration files unique for each instance (host) within a CHI are located.
|
||||
host: chi/conf.d
|
||||
# Path to the folder where ClickHouse configuration files with users' settings are located.
|
||||
# Files are common for all instances within a CHI.
|
||||
user: chi/users.d
|
||||
################################################
|
||||
##
|
||||
## Configuration users section
|
||||
##
|
||||
################################################
|
||||
user:
|
||||
# Default settings for user accounts, created by the operator.
|
||||
# IMPORTANT. These are not access credentials or settings for 'default' user account,
|
||||
# it is a template for filling out missing fields for all user accounts to be created by the operator,
|
||||
# with the following EXCEPTIONS:
|
||||
# 1. 'default' user account DOES NOT use provided password, but uses all the rest of the fields.
|
||||
# Password for 'default' user account has to be provided explicitly, if to be used.
|
||||
# 2. CHOP user account DOES NOT use:
|
||||
# - profile setting. It uses predefined profile called 'clickhouse_operator'
|
||||
# - quota setting. It uses empty quota name.
|
||||
# - networks IP setting. Operator specifies 'networks/ip' user setting to match operators' pod IP only.
|
||||
# - password setting. Password for CHOP account is used from 'clickhouse.access.*' section
|
||||
default:
|
||||
# Default values for ClickHouse user account(s) created by the operator
|
||||
# 1. user/profile - string
|
||||
# 2. user/quota - string
|
||||
# 3. user/networks/ip - multiple strings
|
||||
# 4. user/password - string
|
||||
# These values can be overwritten on per-user basis.
|
||||
profile: "default"
|
||||
quota: "default"
|
||||
networksIP:
|
||||
- "::1"
|
||||
- "127.0.0.1"
|
||||
password: "default"
|
||||
################################################
|
||||
##
|
||||
## Configuration network section
|
||||
##
|
||||
################################################
|
||||
network:
|
||||
# Default host_regexp to limit network connectivity from outside
|
||||
hostRegexpTemplate: "(chi-{chi}-[^.]+\\d+-\\d+|clickhouse\\-{chi})\\.{namespace}\\.svc\\.cluster\\.local$"
|
||||
################################################
|
||||
##
|
||||
## Configuration restart policy section
|
||||
## Configuration restart policy describes what configuration changes require ClickHouse restart
|
||||
##
|
||||
################################################
|
||||
configurationRestartPolicy:
|
||||
rules:
|
||||
# IMPORTANT!
|
||||
# Special version of "*" - default version - has to satisfy all ClickHouse versions.
|
||||
# Default version will also be used in case ClickHouse version is unknown.
|
||||
# ClickHouse version may be unknown due to host being down - for example, because of incorrect "settings" section.
|
||||
# ClickHouse is not willing to start in case incorrect/unknown settings are provided in config file.
|
||||
- version: "*"
|
||||
rules:
|
||||
# see https://kb.altinity.com/altinity-kb-setup-and-maintenance/altinity-kb-server-config-files/#server-config-configxml-sections-which-dont-require-restart
|
||||
# to be replaced with "select * from system.server_settings where changeable_without_restart = 'No'"
|
||||
- settings/*: "yes"
|
||||
# single values
|
||||
- settings/access_control_path: "no"
|
||||
- settings/dictionaries_config: "no"
|
||||
- settings/max_server_memory_*: "no"
|
||||
- settings/max_*_to_drop: "no"
|
||||
- settings/max_concurrent_queries: "no"
|
||||
- settings/models_config: "no"
|
||||
- settings/user_defined_executable_functions_config: "no"
|
||||
# structured XML
|
||||
- settings/logger/*: "no"
|
||||
- settings/macros/*: "no"
|
||||
- settings/remote_servers/*: "no"
|
||||
- settings/user_directories/*: "no"
|
||||
# these settings should not lead to pod restarts
|
||||
- settings/display_secrets_in_show_and_select: "no"
|
||||
- zookeeper/*: "no"
|
||||
- files/*.xml: "yes"
|
||||
- files/config.d/*.xml: "yes"
|
||||
- files/config.d/*dict*.xml: "no"
|
||||
- files/config.d/*no_restart*: "no"
|
||||
# exceptions in default profile
|
||||
- profiles/default/background_*_pool_size: "yes"
|
||||
- profiles/default/max_*_for_server: "yes"
|
||||
- version: "21.*"
|
||||
rules:
|
||||
- settings/logger: "yes"
|
||||
#################################################
|
||||
##
|
||||
## Access to ClickHouse instances
|
||||
##
|
||||
################################################
|
||||
access:
|
||||
# Possible values for 'scheme' are:
|
||||
# 1. http - force http to be used to connect to ClickHouse instances
|
||||
# 2. https - force https to be used to connect to ClickHouse instances
|
||||
# 3. auto - either http or https is selected based on open ports
|
||||
scheme: "auto"
|
||||
# ClickHouse credentials (username, password and port) to be used by the operator to connect to ClickHouse instances.
|
||||
# These credentials are used for:
|
||||
# 1. Metrics requests
|
||||
# 2. Schema maintenance
|
||||
# User with these credentials can be specified in additional ClickHouse .xml config files,
|
||||
# located in 'clickhouse.configuration.file.path.user' folder
|
||||
username: ""
|
||||
password: ""
|
||||
rootCA: ""
|
||||
# Location of the k8s Secret with username and password to be used by the operator to connect to ClickHouse instances.
|
||||
# Can be used instead of explicitly specified username and password available in sections:
|
||||
# - clickhouse.access.username
|
||||
# - clickhouse.access.password
|
||||
# Secret should have two keys:
|
||||
# 1. username
|
||||
# 2. password
|
||||
secret:
|
||||
# Empty `namespace` means that k8s secret would be looked in the same namespace where operator's pod is running.
|
||||
namespace: ""
|
||||
# Empty `name` means no k8s Secret would be looked for
|
||||
name: '{{ include "altinity-clickhouse-operator.fullname" . }}'
|
||||
# Port where to connect to ClickHouse instances to
|
||||
port: 8123
|
||||
# Timeouts used to limit connection and queries from the operator to ClickHouse instances
|
||||
# Specified in seconds.
|
||||
timeouts:
|
||||
# Timout to setup connection from the operator to ClickHouse instances. In seconds.
|
||||
connect: 1
|
||||
# Timout to perform SQL query from the operator to ClickHouse instances. In seconds.
|
||||
query: 4
|
||||
################################################
|
||||
##
|
||||
## Addons specifies additional configuration sections
|
||||
## Should it be called something like "templates"?
|
||||
##
|
||||
################################################
|
||||
addons:
|
||||
rules:
|
||||
- version: "*"
|
||||
spec:
|
||||
configuration:
|
||||
users:
|
||||
profiles:
|
||||
quotas:
|
||||
settings:
|
||||
files:
|
||||
- version: ">= 23.3"
|
||||
spec:
|
||||
configuration:
|
||||
###
|
||||
### users.d is global while description depends on CH version which may vary on per-host basis
|
||||
### In case of global-ness this may be better to implement via auto-templates
|
||||
###
|
||||
### As a solution, this may be applied on the whole cluster based on any of its hosts
|
||||
###
|
||||
### What to do when host is just created? CH version is not known prior to CH started and user config is required before CH started.
|
||||
### We do not have any info about the cluster on initial creation
|
||||
###
|
||||
users:
|
||||
"{clickhouseOperatorUser}/access_management": 1
|
||||
"{clickhouseOperatorUser}/named_collection_control": 1
|
||||
"{clickhouseOperatorUser}/show_named_collections": 1
|
||||
"{clickhouseOperatorUser}/show_named_collections_secrets": 1
|
||||
profiles:
|
||||
quotas:
|
||||
settings:
|
||||
files:
|
||||
- version: ">= 23.5"
|
||||
spec:
|
||||
configuration:
|
||||
users:
|
||||
profiles:
|
||||
clickhouse_operator/format_display_secrets_in_show_and_select: 1
|
||||
quotas:
|
||||
settings:
|
||||
##
|
||||
## this may be added on per-host basis into host's conf.d folder
|
||||
##
|
||||
display_secrets_in_show_and_select: 1
|
||||
files:
|
||||
#################################################
|
||||
##
|
||||
## Metrics collection
|
||||
##
|
||||
################################################
|
||||
metrics:
|
||||
# Timeouts used to limit connection and queries from the metrics exporter to ClickHouse instances
|
||||
# Specified in seconds.
|
||||
timeouts:
|
||||
# Timeout used to limit metrics collection request. In seconds.
|
||||
# Upon reaching this timeout metrics collection is aborted and no more metrics are collected in this cycle.
|
||||
# All collected metrics are returned.
|
||||
collect: 9
|
||||
keeper:
|
||||
configuration:
|
||||
################################################
|
||||
##
|
||||
## Configuration files section
|
||||
##
|
||||
################################################
|
||||
file:
|
||||
# Each 'path' can be either absolute or relative.
|
||||
# In case path is absolute - it is used as is
|
||||
# In case path is relative - it is relative to the folder where configuration file you are reading right now is located.
|
||||
path:
|
||||
# Path to the folder where Keeper configuration files common for all instances within a CHK are located.
|
||||
common: chk/keeper_config.d
|
||||
# Path to the folder where Keeper configuration files unique for each instance (host) within a CHK are located.
|
||||
host: chk/conf.d
|
||||
# Path to the folder where Keeper configuration files with users' settings are located.
|
||||
# Files are common for all instances within a CHI.
|
||||
user: chk/users.d
|
||||
################################################
|
||||
##
|
||||
## Template(s) management section
|
||||
##
|
||||
################################################
|
||||
template:
|
||||
chi:
|
||||
# CHI template updates handling policy
|
||||
# Possible policy values:
|
||||
# - ReadOnStart. Accept CHIT updates on the operator's start only.
|
||||
# - ApplyOnNextReconcile. Accept CHIT updates at all time. Apply new CHITs on next regular reconcile of the CHI
|
||||
policy: ApplyOnNextReconcile
|
||||
# Path to the folder where ClickHouseInstallation templates .yaml manifests are located.
|
||||
# Templates are added to the list of all templates and used when CHI is reconciled.
|
||||
# Templates are applied in sorted alpha-numeric order.
|
||||
path: chi/templates.d
|
||||
chk:
|
||||
# CHK template updates handling policy
|
||||
# Possible policy values:
|
||||
# - ReadOnStart. Accept CHIT updates on the operators start only.
|
||||
# - ApplyOnNextReconcile. Accept CHIT updates at all time. Apply new CHITs on next regular reconcile of the CHI
|
||||
policy: ApplyOnNextReconcile
|
||||
# Path to the folder where ClickHouseInstallation templates .yaml manifests are located.
|
||||
# Templates are added to the list of all templates and used when CHI is reconciled.
|
||||
# Templates are applied in sorted alpha-numeric order.
|
||||
path: chk/templates.d
|
||||
################################################
|
||||
##
|
||||
## Reconcile section
|
||||
##
|
||||
################################################
|
||||
reconcile:
|
||||
# Reconcile runtime settings
|
||||
runtime:
|
||||
# Max number of concurrent CHI reconciles in progress
|
||||
reconcileCHIsThreadsNumber: 10
|
||||
# The operator reconciles shards concurrently in each CHI with the following limitations:
|
||||
# 1. Number of shards being reconciled (and thus having hosts down) in each CHI concurrently
|
||||
# can not be greater than 'reconcileShardsThreadsNumber'.
|
||||
# 2. Percentage of shards being reconciled (and thus having hosts down) in each CHI concurrently
|
||||
# can not be greater than 'reconcileShardsMaxConcurrencyPercent'.
|
||||
# 3. The first shard is always reconciled alone. Concurrency starts from the second shard and onward.
|
||||
# Thus limiting number of shards being reconciled (and thus having hosts down) in each CHI by both number and percentage
|
||||
|
||||
# Max number of concurrent shard reconciles within one cluster in progress
|
||||
reconcileShardsThreadsNumber: 5
|
||||
# Max percentage of concurrent shard reconciles within one cluster in progress
|
||||
reconcileShardsMaxConcurrencyPercent: 50
|
||||
# Reconcile StatefulSet scenario
|
||||
statefulSet:
|
||||
# Create StatefulSet scenario
|
||||
create:
|
||||
# What to do in case created StatefulSet is not in 'Ready' after `reconcile.statefulSet.update.timeout` seconds
|
||||
# Possible options:
|
||||
# 1. abort - abort the process, do nothing with the problematic StatefulSet, leave it as it is,
|
||||
# do not try to fix or delete or update it, just abort reconcile cycle.
|
||||
# Do not proceed to the next StatefulSet(s) and wait for an admin to assist.
|
||||
# 2. delete - delete newly created problematic StatefulSet and follow 'abort' path afterwards.
|
||||
# 3. ignore - ignore an error, pretend nothing happened, continue reconcile and move on to the next StatefulSet.
|
||||
onFailure: ignore
|
||||
# Update StatefulSet scenario
|
||||
update:
|
||||
# How many seconds to wait for created/updated StatefulSet to be 'Ready'
|
||||
timeout: 300
|
||||
# How many seconds to wait between checks/polls for created/updated StatefulSet status
|
||||
pollInterval: 5
|
||||
# What to do in case updated StatefulSet is not in 'Ready' after `reconcile.statefulSet.update.timeout` seconds
|
||||
# Possible options:
|
||||
# 1. abort - abort the process, do nothing with the problematic StatefulSet, leave it as it is,
|
||||
# do not try to fix or delete or update it, just abort reconcile cycle.
|
||||
# Do not proceed to the next StatefulSet(s) and wait for an admin to assist.
|
||||
# 2. rollback - delete Pod and rollback StatefulSet to previous Generation.
|
||||
# Pod would be recreated by StatefulSet based on rollback-ed StatefulSet configuration.
|
||||
# Follow 'abort' path afterwards.
|
||||
# 3. ignore - ignore an error, pretend nothing happened, continue reconcile and move on to the next StatefulSet.
|
||||
onFailure: abort
|
||||
# Reconcile Host scenario
|
||||
host:
|
||||
# The operator during reconcile procedure should wait for a ClickHouse host to achieve the following conditions:
|
||||
wait:
|
||||
# Whether the operator during reconcile procedure should wait for a ClickHouse host:
|
||||
# - to be excluded from a ClickHouse cluster
|
||||
# - to complete all running queries
|
||||
# - to be included into a ClickHouse cluster
|
||||
# respectfully before moving forward with host reconcile
|
||||
exclude: true
|
||||
queries: true
|
||||
include: false
|
||||
# The operator during reconcile procedure should wait for replicas to catch-up
|
||||
# replication delay a.k.a replication lag for the following replicas
|
||||
replicas:
|
||||
# All replicas (new and known earlier) are explicitly requested to wait for replication to catch-up
|
||||
all: no
|
||||
# New replicas only are requested to wait for replication to catch-up
|
||||
new: yes
|
||||
# Replication catch-up is considered to be completed as soon as replication delay
|
||||
# a.k.a replication lag - calculated as "MAX(absolute_delay) FROM system.replicas"
|
||||
# is within this specified delay (in seconds)
|
||||
delay: 10
|
||||
probes:
|
||||
# Whether the operator during host launch procedure should wait for startup probe to succeed.
|
||||
# In case probe is unspecified wait is assumed to be completed successfully.
|
||||
# Default option value is to do not wait.
|
||||
startup: no
|
||||
# Whether the operator during host launch procedure should wait for readiness probe to succeed.
|
||||
# In case probe is unspecified wait is assumed to be completed successfully.
|
||||
# Default option value is to wait.
|
||||
readiness: yes
|
||||
# The operator during reconcile procedure should drop the following entities:
|
||||
drop:
|
||||
replicas:
|
||||
# Whether the operator during reconcile procedure should drop replicas when replica is deleted
|
||||
onDelete: yes
|
||||
# Whether the operator during reconcile procedure should drop replicas when replica volume is lost
|
||||
onLostVolume: yes
|
||||
# Whether the operator during reconcile procedure should drop active replicas when replica is deleted or recreated
|
||||
active: no
|
||||
################################################
|
||||
##
|
||||
## Annotations management section
|
||||
##
|
||||
################################################
|
||||
annotation:
|
||||
# Applied when:
|
||||
# 1. Propagating annotations from the CHI's `metadata.annotations` to child objects' `metadata.annotations`,
|
||||
# 2. Propagating annotations from the CHI Template's `metadata.annotations` to CHI's `metadata.annotations`,
|
||||
# Include annotations from the following list:
|
||||
# Applied only when not empty. Empty list means "include all, no selection"
|
||||
include: []
|
||||
# Exclude annotations from the following list:
|
||||
exclude: []
|
||||
################################################
|
||||
##
|
||||
## Labels management section
|
||||
##
|
||||
################################################
|
||||
label:
|
||||
# Applied when:
|
||||
# 1. Propagating labels from the CHI's `metadata.labels` to child objects' `metadata.labels`,
|
||||
# 2. Propagating labels from the CHI Template's `metadata.labels` to CHI's `metadata.labels`,
|
||||
# Include labels from the following list:
|
||||
# Applied only when not empty. Empty list means "include all, no selection"
|
||||
include: []
|
||||
# Exclude labels from the following list:
|
||||
# Applied only when not empty. Empty list means "nothing to exclude, no selection"
|
||||
exclude: []
|
||||
# Whether to append *Scope* labels to StatefulSet and Pod.
|
||||
# Full list of available *scope* labels check in 'labeler.go'
|
||||
# LabelShardScopeIndex
|
||||
# LabelReplicaScopeIndex
|
||||
# LabelCHIScopeIndex
|
||||
# LabelCHIScopeCycleSize
|
||||
# LabelCHIScopeCycleIndex
|
||||
# LabelCHIScopeCycleOffset
|
||||
# LabelClusterScopeIndex
|
||||
# LabelClusterScopeCycleSize
|
||||
# LabelClusterScopeCycleIndex
|
||||
# LabelClusterScopeCycleOffset
|
||||
appendScope: "no"
|
||||
################################################
|
||||
##
|
||||
## Metrics management section
|
||||
##
|
||||
################################################
|
||||
metrics:
|
||||
labels:
|
||||
exclude: []
|
||||
################################################
|
||||
##
|
||||
## Status management section
|
||||
##
|
||||
################################################
|
||||
status:
|
||||
fields:
|
||||
action: false
|
||||
actions: false
|
||||
error: true
|
||||
errors: true
|
||||
################################################
|
||||
##
|
||||
## StatefulSet management section
|
||||
##
|
||||
################################################
|
||||
statefulSet:
|
||||
revisionHistoryLimit: 0
|
||||
################################################
|
||||
##
|
||||
## Pod management section
|
||||
##
|
||||
################################################
|
||||
pod:
|
||||
# Grace period for Pod termination.
|
||||
# How many seconds to wait between sending
|
||||
# SIGTERM and SIGKILL during Pod termination process.
|
||||
# Increase this number is case of slow shutdown.
|
||||
terminationGracePeriod: 30
|
||||
################################################
|
||||
##
|
||||
## Log parameters section
|
||||
##
|
||||
################################################
|
||||
logger:
|
||||
logtostderr: "true"
|
||||
alsologtostderr: "false"
|
||||
v: "1"
|
||||
stderrthreshold: ""
|
||||
vmodule: ""
|
||||
log_backtrace_at: ""
|
||||
templatesdFiles:
|
||||
001-templates.json.example: |
|
||||
{
|
||||
"apiVersion": "clickhouse.altinity.com/v1",
|
||||
"kind": "ClickHouseInstallationTemplate",
|
||||
"metadata": {
|
||||
"name": "01-default-volumeclaimtemplate"
|
||||
},
|
||||
"spec": {
|
||||
"templates": {
|
||||
"volumeClaimTemplates": [
|
||||
{
|
||||
"name": "chi-default-volume-claim-template",
|
||||
"spec": {
|
||||
"accessModes": [
|
||||
"ReadWriteOnce"
|
||||
],
|
||||
"resources": {
|
||||
"requests": {
|
||||
"storage": "2Gi"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"podTemplates": [
|
||||
{
|
||||
"name": "chi-default-oneperhost-pod-template",
|
||||
"distribution": "OnePerHost",
|
||||
"spec": {
|
||||
"containers" : [
|
||||
{
|
||||
"name": "clickhouse",
|
||||
"image": "clickhouse/clickhouse-server:23.8",
|
||||
"ports": [
|
||||
{
|
||||
"name": "http",
|
||||
"containerPort": 8123
|
||||
},
|
||||
{
|
||||
"name": "client",
|
||||
"containerPort": 9000
|
||||
},
|
||||
{
|
||||
"name": "interserver",
|
||||
"containerPort": 9009
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
default-pod-template.yaml.example: |
|
||||
apiVersion: "clickhouse.altinity.com/v1"
|
||||
kind: "ClickHouseInstallationTemplate"
|
||||
metadata:
|
||||
name: "default-oneperhost-pod-template"
|
||||
spec:
|
||||
templates:
|
||||
podTemplates:
|
||||
- name: default-oneperhost-pod-template
|
||||
distribution: "OnePerHost"
|
||||
default-storage-template.yaml.example: |
|
||||
apiVersion: "clickhouse.altinity.com/v1"
|
||||
kind: "ClickHouseInstallationTemplate"
|
||||
metadata:
|
||||
name: "default-storage-template-2Gi"
|
||||
spec:
|
||||
templates:
|
||||
volumeClaimTemplates:
|
||||
- name: default-storage-template-2Gi
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 2Gi
|
||||
readme: |-
|
||||
Templates in this folder are packaged with an operator and available via 'useTemplate'
|
||||
usersdFiles:
|
||||
01-clickhouse-operator-profile.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<!--
|
||||
#
|
||||
# Template parameters available:
|
||||
#
|
||||
-->
|
||||
<yandex>
|
||||
<!-- clickhouse-operator user is generated by the operator based on config.yaml in runtime -->
|
||||
<profiles>
|
||||
<clickhouse_operator>
|
||||
<log_queries>0</log_queries>
|
||||
<skip_unavailable_shards>1</skip_unavailable_shards>
|
||||
<http_connection_timeout>10</http_connection_timeout>
|
||||
<max_concurrent_queries_for_all_users>0</max_concurrent_queries_for_all_users>
|
||||
<os_thread_priority>0</os_thread_priority>
|
||||
</clickhouse_operator>
|
||||
</profiles>
|
||||
</yandex>
|
||||
02-clickhouse-default-profile.xml: |-
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<yandex>
|
||||
<profiles>
|
||||
<default>
|
||||
<os_thread_priority>2</os_thread_priority>
|
||||
<log_queries>1</log_queries>
|
||||
<connect_timeout_with_failover_ms>1000</connect_timeout_with_failover_ms>
|
||||
<distributed_aggregation_memory_efficient>1</distributed_aggregation_memory_efficient>
|
||||
<parallel_view_processing>1</parallel_view_processing>
|
||||
<do_not_merge_across_partitions_select_final>1</do_not_merge_across_partitions_select_final>
|
||||
<load_balancing>nearest_hostname</load_balancing>
|
||||
<prefer_localhost_replica>0</prefer_localhost_replica>
|
||||
<!-- materialize_ttl_recalculate_only>1</materialize_ttl_recalculate_only> 21.10 and above -->
|
||||
</default>
|
||||
</profiles>
|
||||
</yandex>
|
||||
keeperConfdFiles: null
|
||||
keeperConfigdFiles:
|
||||
01-keeper-01-default-config.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<clickhouse>
|
||||
<keeper_server>
|
||||
<coordination_settings>
|
||||
<min_session_timeout_ms>10000</min_session_timeout_ms>
|
||||
<operation_timeout_ms>10000</operation_timeout_ms>
|
||||
<raft_logs_level>information</raft_logs_level>
|
||||
<session_timeout_ms>100000</session_timeout_ms>
|
||||
</coordination_settings>
|
||||
<hostname_checks_enabled>true</hostname_checks_enabled>
|
||||
<log_storage_path>/var/lib/clickhouse-keeper/coordination/logs</log_storage_path>
|
||||
<snapshot_storage_path>/var/lib/clickhouse-keeper/coordination/snapshots</snapshot_storage_path>
|
||||
<storage_path>/var/lib/clickhouse-keeper</storage_path>
|
||||
<tcp_port>2181</tcp_port>
|
||||
</keeper_server>
|
||||
<listen_host>::</listen_host>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<listen_try>1</listen_try>
|
||||
<logger>
|
||||
<console>1</console>
|
||||
<level>information</level>
|
||||
</logger>
|
||||
<max_connections>4096</max_connections>
|
||||
</clickhouse>
|
||||
01-keeper-02-readiness.xml: |
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<clickhouse>
|
||||
<keeper_server>
|
||||
<http_control>
|
||||
<port>9182</port>
|
||||
<readiness>
|
||||
<endpoint>/ready</endpoint>
|
||||
</readiness>
|
||||
</http_control>
|
||||
</keeper_server>
|
||||
</clickhouse>
|
||||
01-keeper-03-enable-reconfig.xml: |-
|
||||
<!-- IMPORTANT -->
|
||||
<!-- This file is auto-generated -->
|
||||
<!-- Do not edit this file - all changes would be lost -->
|
||||
<!-- Edit appropriate template in the following folder: -->
|
||||
<!-- deploy/builder/templates-config -->
|
||||
<!-- IMPORTANT -->
|
||||
<clickhouse>
|
||||
<keeper_server>
|
||||
<enable_reconfiguration>false</enable_reconfiguration>
|
||||
</keeper_server>
|
||||
</clickhouse>
|
||||
keeperTemplatesdFiles:
|
||||
readme: |-
|
||||
Templates in this folder are packaged with an operator and available via 'useTemplate'
|
||||
keeperUsersdFiles: null
|
||||
# additionalResources -- list of additional resources to create (processed via `tpl` function),
|
||||
# useful for create ClickHouse clusters together with clickhouse-operator.
|
||||
# check `kubectl explain chi` for details
|
||||
additionalResources: []
|
||||
# - |
|
||||
# apiVersion: v1
|
||||
# kind: ConfigMap
|
||||
# metadata:
|
||||
# name: {{ include "altinity-clickhouse-operator.fullname" . }}-cm
|
||||
# namespace: {{ include "altinity-clickhouse-operator.namespace" . }}
|
||||
# - |
|
||||
# apiVersion: v1
|
||||
# kind: Secret
|
||||
# metadata:
|
||||
# name: {{ include "altinity-clickhouse-operator.fullname" . }}-s
|
||||
# namespace: {{ include "altinity-clickhouse-operator.namespace" . }}
|
||||
# stringData:
|
||||
# mykey: my-value
|
||||
# - |
|
||||
# apiVersion: clickhouse.altinity.com/v1
|
||||
# kind: ClickHouseInstallation
|
||||
# metadata:
|
||||
# name: {{ include "altinity-clickhouse-operator.fullname" . }}-chi
|
||||
# namespace: {{ include "altinity-clickhouse-operator.namespace" . }}
|
||||
# spec:
|
||||
# configuration:
|
||||
# clusters:
|
||||
# - name: default
|
||||
# layout:
|
||||
# shardsCount: 1
|
||||
|
||||
dashboards:
|
||||
# dashboards.enabled -- provision grafana dashboards as configMaps (can be synced by grafana dashboards sidecar https://github.com/grafana/helm-charts/blob/grafana-8.3.4/charts/grafana/values.yaml#L778 )
|
||||
enabled: false
|
||||
# dashboards.additionalLabels -- labels to add to a secret with dashboards
|
||||
additionalLabels:
|
||||
# dashboards.additionalLabels.grafana_dashboard - will watch when official grafana helm chart sidecar.dashboards.enabled=true
|
||||
grafana_dashboard: "1"
|
||||
# dashboards.annotations -- annotations to add to a secret with dashboards
|
||||
annotations:
|
||||
# dashboards.annotations.grafana_folder -- folder where will place dashboards, requires define values in official grafana helm chart sidecar.dashboards.folderAnnotation: grafana_folder
|
||||
grafana_folder: clickhouse-operator
|
||||
|
||||
0
clickhouse-operator-values.yaml
Normal file
0
clickhouse-operator-values.yaml
Normal file
58
clickhouse/app/clickhouse.yaml
Normal file
58
clickhouse/app/clickhouse.yaml
Normal file
@ -0,0 +1,58 @@
|
||||
apiVersion: clickhouse.altinity.com/v1
|
||||
kind: ClickHouseInstallation
|
||||
metadata:
|
||||
name: clickhouse
|
||||
spec:
|
||||
configuration:
|
||||
users:
|
||||
# printf 'test_password' | sha256sum
|
||||
#test_user/password_sha256_hex: 10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01
|
||||
admin/password: Transcity123
|
||||
# to allow access outside from kubernetes
|
||||
admin/networks/ip:
|
||||
- 0.0.0.0/0
|
||||
zookeeper:
|
||||
nodes:
|
||||
- host: chk-keeper-chk-0-0
|
||||
port: 2181
|
||||
|
||||
clusters:
|
||||
- name: "report"
|
||||
layout:
|
||||
shardsCount: 1
|
||||
replicasCount: 1
|
||||
|
||||
defaults:
|
||||
templates:
|
||||
podTemplate: default
|
||||
|
||||
templates:
|
||||
podTemplates:
|
||||
- name: default
|
||||
spec:
|
||||
containers:
|
||||
- name: clickhouse
|
||||
image: clickhouse/clickhouse-server:24.8
|
||||
volumeMounts:
|
||||
- name: data-storage-vc-template
|
||||
mountPath: /var/lib/clickhouse
|
||||
- name: log-storage-vc-template
|
||||
mountPath: /var/log/clickhouse-server
|
||||
|
||||
volumeClaimTemplates:
|
||||
- name: data-storage-vc-template
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 30Gi
|
||||
- name: log-storage-vc-template
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
|
||||
|
||||
30
clickhouse/app/keeper.yaml
Normal file
30
clickhouse/app/keeper.yaml
Normal file
@ -0,0 +1,30 @@
|
||||
apiVersion: clickhouse-keeper.altinity.com/v1
|
||||
kind: ClickHouseKeeperInstallation
|
||||
metadata:
|
||||
name: keeper
|
||||
spec:
|
||||
defaults:
|
||||
templates:
|
||||
podTemplate: default
|
||||
volumeClaimTemplate: default
|
||||
templates:
|
||||
podTemplates:
|
||||
- name: default
|
||||
spec:
|
||||
containers:
|
||||
- name: clickhouse-keeper
|
||||
image: "clickhouse/clickhouse-keeper:24.3.5.46"
|
||||
volumeClaimTemplates:
|
||||
- name: default
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
configuration:
|
||||
clusters:
|
||||
- name: chk
|
||||
layout:
|
||||
replicasCount: 1
|
||||
|
||||
6
clickhouse/app/kustomization.yaml
Normal file
6
clickhouse/app/kustomization.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
namespace: reports-clickhouse
|
||||
resources:
|
||||
- ../base
|
||||
- namespace.yaml
|
||||
- keeper.yaml
|
||||
- clickhouse.yaml
|
||||
7
clickhouse/app/namespace.yaml
Normal file
7
clickhouse/app/namespace.yaml
Normal file
@ -0,0 +1,7 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
labels:
|
||||
kubernetes.io/metadata.name: reports-clickhouse
|
||||
name: reports-clickhouse
|
||||
|
||||
5748
clickhouse/base/clickhouse-operator.yaml
Normal file
5748
clickhouse/base/clickhouse-operator.yaml
Normal file
File diff suppressed because it is too large
Load Diff
2
clickhouse/base/kustomization.yaml
Normal file
2
clickhouse/base/kustomization.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
resources:
|
||||
- clickhouse-operator.yaml
|
||||
2
clickhouse/local/kustomization.yaml
Normal file
2
clickhouse/local/kustomization.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
resources:
|
||||
- ../app
|
||||
Loading…
x
Reference in New Issue
Block a user