mirror of
https://github.com/labring/sealos.git
synced 2026-09-01 15:38:06 +08:00
c0660dbc59
* chore: add monitor for database and kubernetes. Signed-off-by: yy <lingdie.yy@outlook.com> Signed-off-by: yy <lingdie.yy@outlook.com> * chore: add monitor for database and kubernetes. Signed-off-by: yy <lingdie.yy@outlook.com> Signed-off-by: yy <lingdie.yy@outlook.com> * chore: fix pull image logic. Signed-off-by: yy <lingdie.yy@outlook.com> Signed-off-by: yy <lingdie.yy@outlook.com> * fix offline build * chore: fix database monitor. Signed-off-by: yy <lingdie.yy@outlook.com> Signed-off-by: yy <lingdie.yy@outlook.com> * chore: fix kb prometheus. Signed-off-by: yy <lingdie.yy@outlook.com> Signed-off-by: yy <lingdie.yy@outlook.com> --------- Signed-off-by: yy <lingdie.yy@outlook.com>
745 lines
31 KiB
Bash
745 lines
31 KiB
Bash
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
# Configurations
|
|
CLOUD_DIR="/root/.sealos/cloud"
|
|
SEALOS_VERSION="v4.3.7"
|
|
cloud_version="latest"
|
|
#mongodb_version="mongodb-5.0"
|
|
#master_ips=
|
|
#node_ips=
|
|
#ssh_private_key=
|
|
#ssh_password=
|
|
#pod_cidr=
|
|
#service_cidr=
|
|
#cloud_domain=
|
|
#cloud_port=
|
|
#input_cert=
|
|
#cert_path=
|
|
#key_path=
|
|
#single=y/n
|
|
image_registry=${image_registry:-"docker.io"}
|
|
image_repository=${image_repository:-"labring"}
|
|
kubernetes_version=${kubernetes_version:-"1.25.6"}
|
|
cilium_version=${cilium_version:-"1.12.14"}
|
|
cert_manager_version=${cert_manager_version:-"1.8.0"}
|
|
helm_version=${helm_version:-"3.12.0"}
|
|
openebs_version=${openebs_version:-"3.4.0"}
|
|
ingress_nginx_version=${ingress_nginx_version:-"1.5.1"}
|
|
kubeblocks_version=${kubeblocks_version:-"0.6.4"}
|
|
metrics_server_version=${metrics_server_version:-"0.6.4"}
|
|
kube_prometheus_stack_version=${kube_prometheus_stack_version:-"0.63.0"}
|
|
|
|
|
|
# Define English and Chinese prompts
|
|
declare -A PROMPTS_EN PROMPTS_CN
|
|
|
|
PROMPTS_EN=(
|
|
["pre_prompt"]="Depends on iptables, please make sure iptables is installed, multiple nodes need to configure ssh password-free login or the same password, after installation with the self-signed certificate provided by Sealos, you need to trust the certificate yourself."
|
|
["pull_image"]="Pulling image: "
|
|
["pull_image_success"]="Image pulled successfully: "
|
|
["pull_image_failed"]="Image pull failed: "
|
|
["install_sealos"]="Sealos CLI is not installed, do you want to install it? (y/n): "
|
|
["input_master_ips"]="Please enter Master IP (For single node installation, you can press enter to skip this step; separate multiple Master nodes with commas, e.g: 192.168.0.1,192.168.0.2,192.168.0.3): "
|
|
["invalid_ips"]="Invalid or incorrect IP format, please try again."
|
|
["input_node_ips"]="Please enter Node IP (If there are no Node nodes, you can press enter to skip this step; separate multiple Node nodes with commas, e.g: 192.168.1.1,192.168.1.2,192.168.1.3): "
|
|
["pod_subnet"]="Please enter the Pod subnet (Press enter to use the default value: 100.64.0.0/10): "
|
|
["service_subnet"]="Please enter the Service subnet (Press enter to use the default value: 10.96.0.0/22): "
|
|
["cloud_domain"]="Please enter the cloud domain name (You can use the nip.io domain name if you need: [ip].nip.io, for more details, please refer to: http://nip.io, e.g: 127.0.0.1.nip.io): "
|
|
["cloud_port"]="Please enter the cloud port (Press enter to use the default value: 443): "
|
|
["certificate_path"]="Please enter the certificate path (Press enter to use the self-signed certificate provided by Sealos): "
|
|
["private_key_path"]="Please enter the private key path: "
|
|
["choose_language"]="Please choose a language: "
|
|
["enter_choice"]="Please enter your choice (zh/en): "
|
|
["k8s_installation"]="Installing Kubernetes cluster."
|
|
["ingress_installation"]="Installing Ingress-nginx-controller and Kubeblocks."
|
|
["installing_monitoring"]="Installing kubernetes monitoring."
|
|
["patching_ingress"]="Modifying the tolerance of Ingress-nginx-controller to allow it to run on the master node."
|
|
["installing_cloud"]="Installing Sealos Cloud."
|
|
["avx_not_supported"]="CPU does not support AVX instruction set."
|
|
["ssh_private_key"]="Please enter the ssh private key path (Press enter to use the default value: '/root/.ssh/id_rsa'): "
|
|
["ssh_password"]="Please enter the ssh password (Press enter to use password-free login): "
|
|
["wait_cluster_ready"]="Waiting for the cluster to be ready, if you want to skip this step, please enter 'y': "
|
|
["cilium_requirement"]="Using Cilium as the network plugin, the host system must meet the following requirements:
|
|
1. Hosts with AMD64 or AArch64 architecture;
|
|
2. Linux kernel> = 4.19.57 or equivalent version (e.g., 4.18 on RHEL8)."
|
|
["mongo_avx_requirement"]="MongoDB 5.0 version depends on a CPU that supports the AVX instruction set. The current environment does not support AVX, so it has been switched to MongoDB 4.0 version. For more information, see: https://www.mongodb.com/docs/v5.0/administration/production-notes/"
|
|
["usage"]="Usage: $0 [options]=[value] [options]=[value] ...
|
|
|
|
Options:
|
|
--image-registry # Image repository address (default: docker.io)
|
|
--image-repository # Image repository name (default: labring)
|
|
--kubernetes-version # Kubernetes version (default: 1.25.6)
|
|
--cilium-version # Cilium version (default: 1.12.14)
|
|
--cert-manager-version # Cert Manager version (default: 1.8.0)
|
|
--helm-version # Helm version (default: 3.12.0)
|
|
--openebs-version # OpenEBS version (default: 3.4.0)
|
|
--reflector-version # Reflector version (default: 7.0.151)
|
|
--ingress-nginx-version # Ingress Nginx version (default: 1.5.1)
|
|
--kubeblocks-version # Kubeblocks version (default: 0.6.4)
|
|
--metrics-server-version # Metrics Server version (default: 0.6.4)
|
|
--cloud-version # Sealos Cloud version (default: latest)
|
|
--mongodb-version # MongoDB version (default: mongodb-5.0)
|
|
--master-ips # Master node IP list, separated by commas (no need to fill in for single node and current execution node)
|
|
--node-ips # Node node IP list, separated by commas
|
|
--ssh-private-key # SSH private key path (default: $HOME/.ssh/id_rsa)
|
|
--ssh-password # SSH password
|
|
--pod-cidr # Pod subnet (default: 100.64.0.0/10)
|
|
--service-cidr # Service subnet (default: 10.96.0.0/22)
|
|
--cloud-domain # Cloud domain name
|
|
--cloud-port # Cloud port (default: 443)
|
|
--cert-path # Certificate path
|
|
--key-path # Private key path
|
|
--single # Whether to install on a single node (y/n)
|
|
--proxy-prefix # Sealos binary installation address proxy prefix
|
|
--zh # Chinese prompt
|
|
--en # English prompt
|
|
--help # Help information"
|
|
)
|
|
PROMPTS_CN=(
|
|
["pre_prompt"]="依赖 iptables, 请确保 iptables 已经安装, 多节点需要配置 ssh 免密登录或密码一致, 使用 Sealos 提供的自签证书安装完成后需要自信任证书"
|
|
["pull_image"]="正在拉取镜像: "
|
|
["pull_image_success"]="镜像拉取成功: "
|
|
["pull_image_failed"]="镜像拉取失败: "
|
|
["install_sealos"]="Sealos CLI 尚未安装, 是否安装? (y/n): "
|
|
["input_master_ips"]="请输入 Master IP (单节点安装可输入回车跳过该步骤; 多个 Master 节点使用逗号分隔, 例: 192.168.0.1,192.168.0.2,192.168.0.3): "
|
|
["invalid_ips"]="IP无效或错误格式, 请再试一次."
|
|
["input_node_ips"]="请输入 Node IP (无 Node 节点可输入回车跳过该步骤; 多个 Node 节点使用逗号分隔, 例: 192.168.1.1,192.168.1.2,192.168.1.3): "
|
|
["pod_subnet"]="请输入 Pod 子网 (回车使用默认值: 100.64.0.0/10): "
|
|
["service_subnet"]="请输入 Service 子网 (回车使用默认值: 10.96.0.0/22): "
|
|
["cloud_domain"]="请输入 Sealos Cloud 域名 (无自备域名可使用 nip.io 域名: [ip].nip.io, 详细参考: http://nip.io, 例:127.0.0.1.nip.io): "
|
|
["cloud_port"]="请输入 Sealos Cloud 端口 (回车使用默认值: 443): "
|
|
["certificate_path"]="请输入证书路径 (回车使用 Sealos 提供的自签证书): "
|
|
["private_key_path"]="请输入私钥路径: "
|
|
["choose_language"]="请选择语言: "
|
|
["enter_choice"]="请输入您的选择 (zh/en): "
|
|
["k8s_installation"]="正在安装 Kubernetes 集群."
|
|
["ingress_installation"]="正在安装 Ingress-nginx-controller 和 Kubeblocks."
|
|
["installing_monitoring"]="正在安装 kubernetes 监控."
|
|
["patching_ingress"]="正在修改 Ingress-nginx-controller 的容忍度, 以允许它在主节点上运行."
|
|
["installing_cloud"]="正在安装 Sealos Cloud."
|
|
["avx_not_supported"]="CPU 不支持 AVX 指令集."
|
|
["ssh_private_key"]="请输入 ssh 私钥路径 (回车使用默认值: '/root/.ssh/id_rsa'): "
|
|
["ssh_password"]="请输入 ssh 密码 (回车使用免密登录): "
|
|
["wait_cluster_ready"]="正在等待集群就绪, 如果您想跳过此步骤, 请输入'y': "
|
|
["cilium_requirement"]="正在使用 Cilium 作为网络插件, 主机系统必须满足以下要求:
|
|
1.具有AMD64或AArch64架构的主机;
|
|
2.Linux内核> = 4.19.57或等效版本 (例如, 在RHEL8上为4.18)."
|
|
["mongo_avx_requirement"]="MongoDB 5.0版本依赖支持 AVX 指令集的 CPU, 当前环境不支持 AVX, 已切换为 MongoDB 4.0版本, 更多信息查看: https://www.mongodb.com/docs/v5.0/administration/production-notes/"
|
|
["usage"]="Usage: $0 [options]=[value] [options]=[value] ...
|
|
|
|
Options:
|
|
--image-registry # 镜像仓库地址 (默认: docker.io)
|
|
--image-repository # 镜像仓库名称 (默认: labring)
|
|
--kubernetes-version # Kubernetes版本 (默认: 1.25.6)
|
|
--cilium-version # Cilium版本 (默认: 1.12.14)
|
|
--cert-manager-version # Cert Manager版本 (默认: 1.8.0)
|
|
--helm-version # Helm版本 (默认: 3.12.0)
|
|
--openebs-version # OpenEBS版本 (默认: 3.4.0)
|
|
--reflector-version # Reflector版本 (默认: 7.0.151)
|
|
--ingress-nginx-version # Ingress Nginx版本 (默认: 1.5.1)
|
|
--kubeblocks-version # Kubeblocks版本 (默认: 0.6.4)
|
|
--metrics-server-version # Metrics Server版本 (默认: 0.6.4)
|
|
--cloud-version # Sealos Cloud版本 (默认: latest)
|
|
--mongodb-version # MongoDB版本 (默认: mongodb-5.0)
|
|
--master-ips # Master节点IP列表,使用英文逗号分割 (单节点且为当前执行节点可不填写)
|
|
--node-ips # Node节点IP列表,使用英文逗号分割
|
|
--ssh-private-key # SSH私钥路径 (默认: $HOME/.ssh/id_rsa)
|
|
--ssh-password # SSH密码
|
|
--pod-cidr # Pod子网 (默认: 100.64.0.0/10)
|
|
--service-cidr # Service子网 (默认: 10.96.0.0/22)
|
|
--cloud-domain # 云域名
|
|
--cloud-port # 云端口 (默认: 443)
|
|
--cert-path # 证书路径
|
|
--key-path # 私钥路径
|
|
--single # 是否单节点安装 (y/n)
|
|
--proxy-prefix # sealos二进制安装地址代理前缀
|
|
--zh # 中文提示
|
|
--en # 英文提示
|
|
--help # 帮助信息"
|
|
)
|
|
|
|
# Define error handling function
|
|
handle_error() {
|
|
echo "An error occurred on line $1 of the script $0"
|
|
echo "Exit code: $2"
|
|
echo "Exiting the script now."
|
|
# TODO add issue address for users to report issues and solutions.
|
|
}
|
|
|
|
# Set trap to the function when an error occurs
|
|
trap 'handle_error $LINENO $?' ERR
|
|
|
|
# Choose Language
|
|
get_prompt() {
|
|
local key="$1"
|
|
local inline="$2"
|
|
local prompts=""
|
|
if [[ $LANGUAGE == "CN" ]]; then
|
|
prompts="${PROMPTS_CN[$key]}"
|
|
else
|
|
prompts="${PROMPTS_EN[$key]}"
|
|
fi
|
|
if [[ -n "$inline" ]]; then
|
|
echo -ne "$prompts"
|
|
else
|
|
echo -e "$prompts"
|
|
fi
|
|
}
|
|
|
|
set_language() {
|
|
if [[ $LANGUAGE == "" ]]; then
|
|
get_prompt "choose_language"
|
|
echo "en. English"
|
|
echo "zh. 中文"
|
|
get_prompt "enter_choice" "y"
|
|
read -p "" lang_choice
|
|
if [[ $lang_choice == "zh" ]]; then
|
|
LANGUAGE="CN"
|
|
fi
|
|
fi
|
|
if [[ $LANGUAGE != "CN" ]]; then
|
|
LANGUAGE="EN"
|
|
fi
|
|
}
|
|
|
|
#TODO mongo 5.0 need avx support, if not support, change to 4.0
|
|
setMongoVersion() {
|
|
set +e
|
|
grep avx /proc/cpuinfo > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
get_prompt "mongo_avx_requirement"
|
|
mongodb_version="mongodb-4.0"
|
|
fi
|
|
set -e
|
|
}
|
|
|
|
k8s_installed="n"
|
|
k8s_ready="n"
|
|
|
|
# Initialization
|
|
init() {
|
|
if kubectl get no > /dev/null 2>&1; then
|
|
k8s_installed="y"
|
|
if ! kubectl get no | grep NotReady > /dev/null 2>&1; then
|
|
k8s_ready="y"
|
|
fi
|
|
fi
|
|
mkdir -p $CLOUD_DIR
|
|
|
|
# Check for sealos CLI
|
|
if ! command -v sealos &> /dev/null; then
|
|
get_prompt "install_sealos"
|
|
read -p " " installChoice
|
|
if [[ "${installChoice,,}" == "y" ]]; then
|
|
local install_url="https://raw.githubusercontent.com/labring/sealos/${SEALOS_VERSION}/scripts/install.sh"
|
|
[ -z "$proxy_prefix" ] || install_url="${proxy_prefix%/}/$install_url"
|
|
curl -sfL "$install_url" | PROXY_PREFIX=$proxy_prefix sh -s "${SEALOS_VERSION}" labring/sealos
|
|
else
|
|
echo "Please install sealos CLI to proceed."
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Sealos CLI is already installed."
|
|
fi
|
|
|
|
get_prompt "pre_prompt"
|
|
echo ""
|
|
[[ $k8s_installed == "y" ]] || pull_image "kubernetes" "v${kubernetes_version#v:-1.25.6}"
|
|
[[ $k8s_ready == "y" ]] || pull_image "cilium" "v${cilium_version#v:-1.12.14}"
|
|
pull_image "cert-manager" "v${cert_manager_version#v:-1.8.0}"
|
|
pull_image "helm" "v${helm_version#v:-3.12.0}"
|
|
pull_image "openebs" "v${openebs_version#v:-3.4.0}"
|
|
pull_image "ingress-nginx" "v${ingress_nginx_version#v:-1.5.1}"
|
|
pull_image "kubeblocks" "v${kubeblocks_version#v:-0.6.2}"
|
|
pull_image "metrics-server" "v${metrics_server_version#v:-0.6.4}"
|
|
pull_image "kube-prometheus-stack" "v${kube_prometheus_stack_version#v:-0.63.0}"
|
|
pull_image "sealos-cloud" "${cloud_version}"
|
|
}
|
|
|
|
pull_image() {
|
|
image_name=$1
|
|
image_version=$2
|
|
inline="y"
|
|
|
|
echo -ne "\033[1F\033[2K"
|
|
get_prompt "pull_image" $inline && echo "$image_name:$image_version"
|
|
sealos pull -q "${image_registry}/${image_repository}/${image_name}:${image_version}" >/dev/null
|
|
}
|
|
|
|
collect_input() {
|
|
# Utility function to validate IP address
|
|
validate_ips() {
|
|
local ips="$1"
|
|
for ip in $(echo "$ips" | tr ',' ' '); do
|
|
if ! [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
return 1
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
if [[ $k8s_installed == "n" ]]; then
|
|
# Master and Node IPs
|
|
if [[ $single != "y" ]]; then
|
|
if [[ $master_ips == "" ]]; then
|
|
while :; do
|
|
read -p "$(get_prompt "input_master_ips")" master_ips
|
|
if validate_ips "$master_ips"; then
|
|
if [[ -z "$master_ips" ]]; then
|
|
single="y"
|
|
fi
|
|
break
|
|
else
|
|
get_prompt "invalid_ips"
|
|
fi
|
|
done
|
|
fi
|
|
if [[ -z "$node_ips" && $single != "y" ]]; then
|
|
while :; do
|
|
read -p "$(get_prompt "input_node_ips")" node_ips
|
|
if validate_ips "$node_ips"; then
|
|
break
|
|
else
|
|
get_prompt "invalid_ips"
|
|
fi
|
|
done
|
|
fi
|
|
read -p "$(get_prompt "ssh_private_key")" ssh_private_key
|
|
|
|
if [[ -z "$ssh_private_key" ]]; then
|
|
ssh_private_key="${HOME}/.ssh/id_rsa"
|
|
fi
|
|
read -p "$(get_prompt "ssh_password")" ssh_password
|
|
fi
|
|
|
|
[[ $pod_cidr != "" ]] || read -p "$(get_prompt "pod_subnet")" pod_cidr
|
|
[[ $service_cidr != "" ]] || read -p "$(get_prompt "service_subnet")" service_cidr
|
|
fi
|
|
|
|
while [[ $cloud_domain == "" ]] ; do
|
|
read -p "$(get_prompt "cloud_domain")" cloud_domain
|
|
done
|
|
[[ $cloud_port != "" ]] || read -p "$(get_prompt "cloud_port")" cloud_port
|
|
|
|
if [[ $input_cert != "n" && ($cert_path == "" || $key_path == "") ]]; then
|
|
read -p "$(get_prompt "certificate_path")" cert_path
|
|
if [[ $cert_path != "" ]]; then
|
|
read -p "$(get_prompt "private_key_path")" key_path
|
|
fi
|
|
fi
|
|
}
|
|
|
|
prepare_configs() {
|
|
if [[ -n "${cert_path}" ]] || [[ -n "${key_path}" ]]; then
|
|
# Convert certificate and key to base64
|
|
tls_crt_base64=$(cat $cert_path | base64 | tr -d '\n')
|
|
tls_key_base64=$(cat $key_path | base64 | tr -d '\n')
|
|
|
|
# Define YAML content for certificate
|
|
tls_config="
|
|
apiVersion: apps.sealos.io/v1beta1
|
|
kind: Config
|
|
metadata:
|
|
name: secret
|
|
spec:
|
|
path: manifests/tls-secret.yaml
|
|
match: ${image_registry}/${image_repository}/sealos-cloud:${cloud_version}
|
|
strategy: merge
|
|
data: |
|
|
data:
|
|
tls.crt: $tls_crt_base64
|
|
tls.key: $tls_key_base64
|
|
"
|
|
# Create tls-secret.yaml file
|
|
echo "$tls_config" > $CLOUD_DIR/tls-secret.yaml
|
|
fi
|
|
|
|
ingress_config="
|
|
apiVersion: apps.sealos.io/v1beta1
|
|
kind: Config
|
|
metadata:
|
|
creationTimestamp: null
|
|
name: ingress-nginx-config
|
|
spec:
|
|
data: |
|
|
controller:
|
|
hostNetwork: true
|
|
kind: DaemonSet
|
|
service:
|
|
type: NodePort
|
|
match: ${image_registry}/${image_repository}/ingress-nginx:v${ingress_nginx_version#v:-1.5.1}
|
|
path: charts/ingress-nginx/values.yaml
|
|
strategy: merge
|
|
"
|
|
echo "$ingress_config" > $CLOUD_DIR/ingress-nginx-config.yaml
|
|
|
|
kb_addon_prometheus_server_patch='
|
|
data:
|
|
prometheus.yml: |
|
|
global:
|
|
evaluation_interval: 15s
|
|
scrape_interval: 15s
|
|
scrape_timeout: 10s
|
|
rule_files:
|
|
- /etc/config/recording_rules.yml
|
|
- /etc/config/alerting_rules.yml
|
|
- /etc/config/kubelet_alert_rules.yml
|
|
- /etc/config/mysql_alert_rules.yml
|
|
- /etc/config/postgresql_alert_rules.yml
|
|
- /etc/config/redis_alert_rules.yml
|
|
- /etc/config/kafka_alert_rules.yml
|
|
- /etc/config/mongodb_alert_rules.yml
|
|
scrape_configs:
|
|
- job_name: prometheus
|
|
static_configs:
|
|
- targets:
|
|
- localhost:9090
|
|
- honor_labels: true
|
|
job_name: kubeblocks-service
|
|
kubernetes_sd_configs:
|
|
- role: endpoints
|
|
relabel_configs:
|
|
- action: keep
|
|
regex: kubeblocks
|
|
source_labels:
|
|
- __meta_kubernetes_service_label_app_kubernetes_io_managed_by
|
|
- action: drop
|
|
regex: agamotto
|
|
source_labels:
|
|
- __meta_kubernetes_service_label_monitor_kubeblocks_io_managed_by
|
|
- action: keep
|
|
regex: true
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_scrape
|
|
- action: replace
|
|
regex: (https?)
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_scheme
|
|
target_label: __scheme__
|
|
- action: replace
|
|
regex: (.+)
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_path
|
|
target_label: __metrics_path__
|
|
- action: replace
|
|
regex: (.+?)(?::\d+)?;(\d+)
|
|
replacement: $1:$2
|
|
source_labels:
|
|
- __address__
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_port
|
|
target_label: __address__
|
|
- action: labelmap
|
|
regex: __meta_kubernetes_service_annotation_monitor_kubeblocks_io_param_(.+)
|
|
replacement: __param_$1
|
|
- action: labelmap
|
|
regex: __meta_kubernetes_service_label_(.+)
|
|
- action: replace
|
|
source_labels:
|
|
- __meta_kubernetes_namespace
|
|
target_label: namespace
|
|
- action: replace
|
|
source_labels:
|
|
- __meta_kubernetes_service_name
|
|
target_label: service
|
|
- action: replace
|
|
source_labels:
|
|
- __meta_kubernetes_pod_node_name
|
|
target_label: node
|
|
- action: replace
|
|
source_labels:
|
|
- __meta_kubernetes_pod_name
|
|
target_label: pod
|
|
- action: drop
|
|
regex: Pending|Succeeded|Failed|Completed
|
|
source_labels:
|
|
- __meta_kubernetes_pod_phase
|
|
- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
|
|
job_name: kubernetes-apiservers
|
|
kubernetes_sd_configs:
|
|
- role: endpoints
|
|
relabel_configs:
|
|
- action: keep
|
|
regex: default;kubernetes;https
|
|
source_labels:
|
|
- __meta_kubernetes_namespace
|
|
- __meta_kubernetes_service_name
|
|
- __meta_kubernetes_endpoint_port_name
|
|
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
|
|
job_name: kubernetes-nodes
|
|
kubernetes_sd_configs:
|
|
- role: node
|
|
relabel_configs:
|
|
- action: labelmap
|
|
regex: __meta_kubernetes_node_label_(.+)
|
|
- replacement: kubernetes.default.svc:443
|
|
target_label: __address__
|
|
- regex: (.+)
|
|
replacement: /api/v1/nodes/$1/proxy/metrics
|
|
source_labels:
|
|
- __meta_kubernetes_node_name
|
|
target_label: __metrics_path__
|
|
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
|
|
job_name: kubernetes-nodes-cadvisor
|
|
kubernetes_sd_configs:
|
|
- role: node
|
|
relabel_configs:
|
|
- action: labelmap
|
|
regex: __meta_kubernetes_node_label_(.+)
|
|
- replacement: kubernetes.default.svc:443
|
|
target_label: __address__
|
|
- regex: (.+)
|
|
replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor
|
|
source_labels:
|
|
- __meta_kubernetes_node_name
|
|
target_label: __metrics_path__
|
|
scheme: https
|
|
tls_config:
|
|
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
|
insecure_skip_verify: true
|
|
- honor_labels: true
|
|
job_name: kubeblocks-agamotto
|
|
kubernetes_sd_configs:
|
|
- role: endpoints
|
|
relabel_configs:
|
|
- action: keep
|
|
regex: agamotto
|
|
source_labels:
|
|
- __meta_kubernetes_service_label_monitor_kubeblocks_io_managed_by
|
|
- action: keep
|
|
regex: true
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_scrape
|
|
- action: replace
|
|
regex: (https?)
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_scheme
|
|
target_label: __scheme__
|
|
- action: replace
|
|
regex: (.+)
|
|
source_labels:
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_path
|
|
target_label: __metrics_path__
|
|
- action: replace
|
|
regex: (.+?)(?::\d+)?;(\d+)
|
|
replacement: $1:$2
|
|
source_labels:
|
|
- __address__
|
|
- __meta_kubernetes_service_annotation_monitor_kubeblocks_io_port
|
|
target_label: __address__
|
|
- action: labelmap
|
|
regex: __meta_kubernetes_service_annotation_monitor_kubeblocks_io_param_(.+)
|
|
replacement: __param_$1
|
|
- action: drop
|
|
regex: Pending|Succeeded|Failed|Completed
|
|
source_labels:
|
|
- __meta_kubernetes_pod_phase
|
|
alerting:
|
|
alertmanagers:
|
|
- kubernetes_sd_configs:
|
|
- role: pod
|
|
tls_config:
|
|
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
|
|
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
|
|
relabel_configs:
|
|
- source_labels: [__meta_kubernetes_namespace]
|
|
regex: kb-system
|
|
action: keep
|
|
- source_labels: [__meta_kubernetes_pod_label_app]
|
|
regex: prometheus
|
|
action: keep
|
|
- source_labels: [__meta_kubernetes_pod_label_component]
|
|
regex: alertmanager
|
|
action: keep
|
|
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe]
|
|
regex: .*
|
|
action: keep
|
|
- source_labels: [__meta_kubernetes_pod_container_port_number]
|
|
regex: "9093"
|
|
action: keep
|
|
'
|
|
echo "$kb_addon_prometheus_server_patch" > $CLOUD_DIR/kb-addon-prometheus-server-patch.yaml
|
|
|
|
|
|
sealos_gen_cmd="sealos gen ${image_registry}/${image_repository}/kubernetes:v${kubernetes_version#v:-1.25.6}\
|
|
${master_ips:+--masters $master_ips}\
|
|
${node_ips:+--nodes $node_ips}\
|
|
--pk=${ssh_private_key:-$HOME/.ssh/id_rsa}\
|
|
--passwd=${ssh_password} -o $CLOUD_DIR/Clusterfile"
|
|
|
|
if [[ $k8s_installed == "n" ]]; then
|
|
$sealos_gen_cmd
|
|
# Modify Clusterfile with sed
|
|
sed -i "s|100.64.0.0/10|${pod_cidr:-100.64.0.0/10}|g" $CLOUD_DIR/Clusterfile
|
|
sed -i "s|10.96.0.0/22|${service_cidr:-10.96.0.0/22}|g" $CLOUD_DIR/Clusterfile
|
|
fi
|
|
}
|
|
|
|
wait_cluster_ready() {
|
|
local prompt_msg=$(get_prompt "wait_cluster_ready")
|
|
while true; do
|
|
if kubectl get nodes | grep "NotReady" &> /dev/null; then
|
|
loading_animation "$prompt_msg"
|
|
else
|
|
echo && break # new line
|
|
fi
|
|
read -t 1 -n 1 -p "" input 2>/dev/null || true
|
|
if [[ "$input" == "y" ]]; then
|
|
echo && break # new line
|
|
fi
|
|
done
|
|
}
|
|
|
|
loading_animation() {
|
|
local message="$1"
|
|
local duration="${2:-0.5}"
|
|
|
|
echo -ne "\r$message \e[K"
|
|
sleep "$duration"
|
|
echo -ne "\r$message . \e[K"
|
|
sleep "$duration"
|
|
echo -ne "\r$message .. \e[K"
|
|
sleep "$duration"
|
|
echo -ne "\r$message ...\e[K"
|
|
sleep "$duration"
|
|
}
|
|
|
|
execute_commands() {
|
|
[[ $k8s_installed == "y" ]] || (get_prompt "k8s_installation" && sealos apply -f $CLOUD_DIR/Clusterfile)
|
|
command -v helm > /dev/null 2>&1 || sealos run "${image_registry}/${image_repository}/helm:v${helm_version#v:-3.12.0}"
|
|
[[ $k8s_ready == "y" ]] || (get_prompt "cilium_requirement" && sealos run "${image_registry}/${image_repository}/cilium:v${cilium_version#v:-1.12.14}")
|
|
wait_cluster_ready
|
|
sealos run "${image_registry}/${image_repository}/cert-manager:v${cert_manager_version#v:-1.8.0}"
|
|
sealos run "${image_registry}/${image_repository}/openebs:v${openebs_version#v:-3.4.0}"
|
|
kubectl get sc openebs-backup > /dev/null 2>&1 || kubectl create -f - <<EOF
|
|
apiVersion: storage.k8s.io/v1
|
|
kind: StorageClass
|
|
metadata:
|
|
name: openebs-backup
|
|
provisioner: openebs.io/local
|
|
reclaimPolicy: Delete
|
|
volumeBindingMode: WaitForFirstConsumer
|
|
EOF
|
|
|
|
get_prompt "ingress_installation"
|
|
sealos run ${image_registry}/${image_repository}/ingress-nginx:v${ingress_nginx_version#v:-1.5.1}\
|
|
${image_registry}/${image_repository}/kubeblocks:v${kubeblocks_version#v:-0.6.2}\
|
|
--config-file $CLOUD_DIR/ingress-nginx-config.yaml
|
|
|
|
kbcli addon enable prometheus
|
|
|
|
get_prompt "installing_monitoring"
|
|
|
|
sealos run "${image_registry}/${image_repository}/metrics-server:v${metrics_server_version#v:-0.6.4}"
|
|
sealos run "${image_registry}/${image_repository}/kube-prometheus-stack:v${kube_prometheus_stack_version#v:-0.63.0}"
|
|
|
|
kubectl patch cm kb-addon-prometheus-server -n kb-system --patch-file $CLOUD_DIR/kb-addon-prometheus-server-patch.yaml
|
|
|
|
get_prompt "patching_ingress"
|
|
kubectl -n ingress-nginx patch ds ingress-nginx-controller -p '{"spec":{"template":{"spec":{"tolerations":[{"key":"node-role.kubernetes.io/control-plane","operator":"Exists","effect":"NoSchedule"}]}}}}'
|
|
kubectl get daemonset ingress-nginx-controller -n ingress-nginx -o json | grep https-port= >/dev/null || kubectl patch daemonset ingress-nginx-controller -n ingress-nginx --type='json' -p="[{'op': 'add', 'path': '/spec/template/spec/containers/0/args/-', 'value': '--https-port=${cloud_port:-443}'}]"
|
|
kubectl get daemonset ingress-nginx-controller -n ingress-nginx -o json | grep default-ssl-certificate= >/dev/null || kubectl patch daemonset ingress-nginx-controller -n ingress-nginx --type='json' -p="[{'op': 'add', 'path': '/spec/template/spec/containers/0/args/-', 'value': '--default-ssl-certificate=sealos-system/wildcard-cert'}]"
|
|
|
|
get_prompt "installing_cloud"
|
|
|
|
setMongoVersion
|
|
if [[ -n "$tls_crt_base64" ]] || [[ -n "$tls_key_base64" ]]; then
|
|
sealos run ${image_registry}/${image_repository}/sealos-cloud:${cloud_version}\
|
|
--env cloudDomain="$cloud_domain"\
|
|
--env cloudPort="${cloud_port:-443}"\
|
|
--env mongodbVersion="${mongodb_version:-mongodb-5.0}"\
|
|
--config-file $CLOUD_DIR/tls-secret.yaml
|
|
else
|
|
sealos run ${image_registry}/${image_repository}/sealos-cloud:${cloud_version}\
|
|
--env cloudDomain="$cloud_domain"\
|
|
--env cloudPort="${cloud_port:-443}"\
|
|
--env mongodbVersion="${mongodb_version:-mongodb-5.0}"
|
|
fi
|
|
sealos cert --alt-names "$cloud_domain"
|
|
}
|
|
|
|
for i in "$@"; do
|
|
case ${i,,} in
|
|
--image-registry=*) image_registry="${i#*=}"; shift ;;
|
|
--image-repository=*) image_repository="${i#*=}"; shift ;;
|
|
--kubernetes-version=*) kubernetes_version="${i#*=}"; shift ;;
|
|
--cilium-version=*) cilium_version="${i#*=}"; shift ;;
|
|
--cert-manager-version=*) cert_manager_version="${i#*=}"; shift ;;
|
|
--helm-version=*) helm_version="${i#*=}"; shift ;;
|
|
--openebs-version=*) openebs_version="${i#*=}"; shift ;;
|
|
--reflector-version=*) reflector_version="${i#*=}"; shift ;;
|
|
--ingress-nginx-version=*) ingress_nginx_version="${i#*=}"; shift ;;
|
|
--kubeblocks-version=*) kubeblocks_version="${i#*=}"; shift ;;
|
|
--metrics-server-version=*) metrics_server_version="${i#*=}"; shift ;;
|
|
--cloud-version=*) cloud_version="${i#*=}"; shift ;;
|
|
--mongodb-version=*) mongodb_version="${i#*=}"; shift ;;
|
|
--master-ips=*) master_ips="${i#*=}"; shift ;;
|
|
--node-ips=*) node_ips="${i#*=}"; shift ;;
|
|
--ssh-private-key=*) ssh_private_key="${i#*=}"; shift ;;
|
|
--ssh-password=*) ssh_password="${i#*=}"; shift ;;
|
|
--pod-cidr=*) pod_cidr="${i#*=}"; shift ;;
|
|
--service-cidr=*) service_cidr="${i#*=}"; shift ;;
|
|
--cloud-domain=*) cloud_domain="${i#*=}"; shift ;;
|
|
--cloud-port=*) cloud_port="${i#*=}"; shift ;;
|
|
--cert-path=*) cert_path="${i#*=}"; shift ;;
|
|
--key-path=*) key_path="${i#*=}"; shift ;;
|
|
--single) single="y"; shift ;;
|
|
--proxy-prefix=*) proxy_prefix="${i#*=}"; shift ;;
|
|
--zh | zh ) LANGUAGE="CN"; shift ;;
|
|
--en | en ) LANGUAGE="EN"; shift ;;
|
|
--config=* | -c ) source ${i#*=} > /dev/null; shift ;;
|
|
-h | --help) HELP=true; shift ;;
|
|
-d | --debug) set -x; shift ;;
|
|
--image-registry | image-registry | \
|
|
--image-repository | image-repository | \
|
|
--kubernetes-version | kubernetes-version | \
|
|
--cilium-version | cilium-version | \
|
|
--cert-manager-version | cert-manager-version | \
|
|
--helm-version | helm-version | \
|
|
--openebs-version | openebs-version | \
|
|
--reflector-version | reflector-version | \
|
|
--ingress-nginx-version | ingress-nginx-version | \
|
|
--kubeblocks-version | kubeblocks-version | \
|
|
--metrics-server-version | metrics-server-version | \
|
|
--cloud-version | cloud-version | \
|
|
--mongodb-version | mongodb-version | \
|
|
--master-ips | master-ips | \
|
|
--node-ips | node-ips | \
|
|
--ssh-private-key | ssh-private-key | \
|
|
--ssh-password | ssh-password | \
|
|
--pod-cidr | pod-cidr | \
|
|
--service-cidr | service-cidr | \
|
|
--cloud-domain | cloud-domain | \
|
|
--cloud-port | cloud-port | \
|
|
--cert-path | cert-path | \
|
|
--key-path | key-path | \
|
|
--proxy-prefix | proxy-prefix | \
|
|
--config | config) echo "Please use '--${i#--}=' to assign value to option"; exit 1 ;;
|
|
-*) echo "Unknown option $i"; exit 1 ;;
|
|
*) ;;
|
|
esac
|
|
done
|
|
|
|
[[ $HELP == "" ]] || get_prompt "usage"
|
|
[[ $HELP == "" ]] || exit 0
|
|
set_language
|
|
init
|
|
collect_input
|
|
prepare_configs
|
|
execute_commands
|
|
|
|
GREEN='\033[0;32m'
|
|
BOLD='\033[1m'
|
|
RESET='\033[0m'
|
|
|
|
echo -e "${BOLD}Sealos cloud login info:${RESET}\nCloud Version: ${GREEN}${cloud_version}${RESET}\nURL: ${GREEN}https://$cloud_domain${cloud_port:+:$cloud_port}${RESET}\nadmin Username: ${GREEN}admin${RESET}\nadmin Password: ${GREEN}sealos2023${RESET}"
|