mirror of
https://github.com/labring/sealos.git
synced 2026-09-24 15:46:19 +08:00
902 lines
36 KiB
Bash
902 lines
36 KiB
Bash
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
GREEN='\033[0;32m'
|
|
BOLD='\033[1m'
|
|
RESET='\033[0m'
|
|
|
|
# Configurations
|
|
CLOUD_DIR="/root/.sealos/cloud"
|
|
SEALOS_VERSION="v5.0.1"
|
|
cloud_version="latest"
|
|
#mongodb_version="mongodb-6.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
|
|
#acme=y/n
|
|
image_registry=${image_registry:-"docker.io"}
|
|
image_repository=${image_repository:-"labring"}
|
|
kubernetes_version=${kubernetes_version:-"1.28.11"}
|
|
cilium_version=${cilium_version:-"1.15.8"}
|
|
cert_manager_version=${cert_manager_version:-"1.14.6"}
|
|
helm_version=${helm_version:-"3.16.2"}
|
|
openebs_version=${openebs_version:-"3.10.0"}
|
|
higress_version=${higress_version:-"2.0.1"}
|
|
kubeblocks_version=${kubeblocks_version:-"0.8.2"}
|
|
metrics_server_version=${metrics_server_version:-"0.6.4"}
|
|
victoria_metrics_k8s_stack_version=${victoria_metrics_k8s_stack_version:-"1.96.0"}
|
|
acmedns_host=${acmedns_host:-"auth.acme-dns.io"}
|
|
|
|
|
|
# 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."
|
|
["invalid_master_ips"]="The number of master IPs is even. Please provide an odd number of master IPs."
|
|
["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 ACME to automatically apply for certificates): "
|
|
["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."
|
|
["partner_installation"]="Installing Higress and Kubeblocks."
|
|
["installing_monitoring"]="Installing kubernetes monitoring."
|
|
["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)."
|
|
["optimizing_h2_buffer"]="Optimizing the size of the H2 flow control buffer."
|
|
["mongo_avx_requirement"]="MongoDB 6.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.4 version. For more information, see: https://www.mongodb.com/docs/v6.0/administration/production-notes/"
|
|
["enable_acme"]="Do you want to enable ACME to automatically obtain certificates (Press n to use the self-signed certificate provided by Sealos)? (y/n): "
|
|
["acmedns_registration_failed"]="ACME DNS registration failed. Please check if the acmedns-host: '${GREEN}%s${RESET}' is correct."
|
|
["acme_cname_record"]="Please create a CNAME record for '${GREEN}_acme-challenge.%s${RESET}'\npointing to '${GREEN}%s${RESET}'."
|
|
["i_have_confirmed"]="I have confirmed (Enter to continue): "
|
|
["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.27.11)
|
|
--cilium-version # Cilium version (default: 1.15.8)
|
|
--cert-manager-version # Cert Manager version (default: 1.14.6)
|
|
--helm-version # Helm version (default: 3.14.1)
|
|
--openebs-version # OpenEBS version (default: 3.10.0)
|
|
--higress-version # Higress version (default: 2.0.1)
|
|
--kubeblocks-version # Kubeblocks version (default: 0.8.2)
|
|
--metrics-server-version # Metrics Server version (default: 0.6.4)
|
|
--cloud-version # Sealos Cloud version (default: latest)
|
|
--mongodb-version # MongoDB version (default: mongodb-6.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)
|
|
--acme # Enable ACME to automatically obtain certificates
|
|
--acmedns-host # ACME DNS host (default: auth.acme-dns.io)
|
|
--disable-acme # Disable ACME and use self-signed certificates
|
|
--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无效或错误格式, 请再试一次."
|
|
["invalid_master_ips"]="Master IP的数量是偶数,请提供奇数个 Master 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"]="请输入证书路径 (回车使用 ACME 自动申请证书): "
|
|
["private_key_path"]="请输入私钥路径: "
|
|
["choose_language"]="请选择语言: "
|
|
["enter_choice"]="请输入您的选择 (zh/en): "
|
|
["k8s_installation"]="正在安装 Kubernetes 集群."
|
|
["partner_installation"]="正在安装 Higress 和 Kubeblocks."
|
|
["installing_monitoring"]="正在安装 kubernetes 监控."
|
|
["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)."
|
|
["optimizing_h2_buffer"]="正在优化H2流控缓冲区大小."
|
|
["mongo_avx_requirement"]="MongoDB 6.0版本依赖支持 AVX 指令集的 CPU, 当前环境不支持 AVX, 已切换为 MongoDB 4.4版本, 更多信息查看: https://www.mongodb.com/docs/v6.0/administration/production-notes/"
|
|
["enable_acme"]="是否启用 ACME 自动获取证书(输入 n 使用 Sealos 提供的自签证书)? (y/n): "
|
|
["acmedns_registration_failed"]="注册 ACME DNS 失败, 请检查 acmedns-host: '${GREEN}%s${RESET}' 是否正确."
|
|
["acme_cname_record"]="请为 '${GREEN}_acme-challenge.%s${RESET}' 创建一条 CNAME 记录\n指向 '${GREEN}%s${RESET}'."
|
|
["i_have_confirmed"]="我已确认(回车继续):"
|
|
["usage"]="Usage: $0 [options]=[value] [options]=[value] ...
|
|
|
|
Options:
|
|
--image-registry # 镜像仓库地址 (默认: docker.io)
|
|
--image-repository # 镜像仓库名称 (默认: labring)
|
|
--kubernetes-version # Kubernetes版本 (默认: 1.27.11)
|
|
--cilium-version # Cilium版本 (默认: 1.15.8)
|
|
--cert-manager-version # Cert Manager版本 (默认: 1.14.6)
|
|
--helm-version # Helm版本 (默认: 3.14.1)
|
|
--openebs-version # OpenEBS版本 (默认: 3.10.0)
|
|
--higress-version # Higress版本 (默认: 2.0.1)
|
|
--kubeblocks-version # Kubeblocks版本 (默认: 0.8.2)
|
|
--metrics-server-version # Metrics Server版本 (默认: 0.6.4)
|
|
--cloud-version # Sealos Cloud版本 (默认: latest)
|
|
--mongodb-version # MongoDB版本 (默认: mongodb-6.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)
|
|
--acme # 启用 ACME 自动获取证书
|
|
--acmedns-host # ACME DNS host (默认: auth.acme-dns.io)
|
|
--disable-acme # 禁用 ACME 并使用自签名证书
|
|
--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 6.0 need avx support, if not support, change to 4.4
|
|
setMongoVersion() {
|
|
set +e
|
|
grep avx /proc/cpuinfo > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
get_prompt "mongo_avx_requirement"
|
|
mongodb_version="mongodb-4.4"
|
|
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/main/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.27.11}"
|
|
[[ $k8s_ready == "y" ]] || pull_image "cilium" "v${cilium_version#v:-1.15.8}"
|
|
pull_image "cert-manager" "v${cert_manager_version#v:-1.14.6}"
|
|
pull_image "helm" "v${helm_version#v:-3.14.1}"
|
|
pull_image "openebs" "v${openebs_version#v:-3.10.0}"
|
|
pull_image "higress" "v${higress_version#v:-2.0.1}"
|
|
pull_image "kubeblocks" "v${kubeblocks_version#v:-0.8.2}"
|
|
pull_image "kubeblocks-redis" "v${kubeblocks_version#v:-0.8.2}"
|
|
pull_image "kubeblocks-apecloud-mysql" "v${kubeblocks_version#v:-0.8.2}"
|
|
pull_image "kubeblocks-postgresql" "v${kubeblocks_version#v:-0.8.2}"
|
|
pull_image "kubeblocks-mongodb" "v${kubeblocks_version#v:-0.8.2}"
|
|
pull_image "kubeblocks-csi-s3" "v0.31.4"
|
|
pull_image "cockroach" "v2.12.0"
|
|
pull_image "metrics-server" "v${metrics_server_version#v:-0.6.4}"
|
|
pull_image "victoria-metrics-k8s-stack" "v${victoria_metrics_k8s_stack_version#v:-1.96.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 [[ $acme != "y" && $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
|
|
|
|
if [[ $cert_path == "" && $key_path == "" ]]; then
|
|
while [[ $acme == "" ]] ; do
|
|
read -p "$(get_prompt "enable_acme")" acme
|
|
done
|
|
if [[ $acme == "y" ]]; then
|
|
acmednsSecret="$(curl -s -X POST https://$acmedns_host/register)"
|
|
fulldomain=$(echo $acmednsSecret | sed -n 's/.*"fulldomain":"\([^"]*\)".*/\1/p')
|
|
if [[ $fulldomain != "" ]]; then
|
|
printf "$(get_prompt "acme_cname_record")\n" "$cloud_domain" "$fulldomain"
|
|
read -p "$(get_prompt "i_have_confirmed")" confirm
|
|
else
|
|
printf "$(get_prompt "acmedns_registration_failed")\n" "$acmedns_host"
|
|
echo "$acmednsSecret"
|
|
exit 1
|
|
fi
|
|
else
|
|
acme="n"
|
|
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
|
|
|
|
higress_config="
|
|
apiVersion: apps.sealos.io/v1beta1
|
|
kind: Config
|
|
metadata:
|
|
name: higress-config
|
|
spec:
|
|
data: |
|
|
global:
|
|
ingressClass: nginx
|
|
enableStatus: false
|
|
enableGatewayAPI: false
|
|
disableAlpnH2: false
|
|
enableIstioAPI: true
|
|
enableSRDS: true
|
|
gateway:
|
|
httpsPort: ${cloud_port:-443}
|
|
hostNetwork: true
|
|
service:
|
|
type: NodePort
|
|
kind: DaemonSet
|
|
tolerations:
|
|
- effect: "NoExecute"
|
|
operator: "Exists"
|
|
- effect: "NoSchedule"
|
|
operator: "Exists"
|
|
resources:
|
|
requests:
|
|
cpu: 256m
|
|
memory: 256Mi
|
|
limits:
|
|
memory: 4Gi
|
|
controller:
|
|
autoscaling:
|
|
enabled: true
|
|
affinity:
|
|
nodeAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
nodeSelectorTerms:
|
|
- matchExpressions:
|
|
- key: node-role.kubernetes.io/control-plane
|
|
operator: Exists
|
|
tolerations:
|
|
- effect: "NoExecute"
|
|
operator: "Exists"
|
|
- effect: "NoSchedule"
|
|
operator: "Exists"
|
|
resources:
|
|
requests:
|
|
cpu: 256m
|
|
memory: 256Mi
|
|
match: ${image_registry}/${image_repository}/higress:v${higress_version#v:-2.0.1}
|
|
path: charts/higress/charts/higress-core/values.yaml
|
|
strategy: merge
|
|
"
|
|
echo "$higress_config" > $CLOUD_DIR/higress-config.yaml
|
|
higress_console_config="
|
|
apiVersion: apps.sealos.io/v1beta1
|
|
kind: Config
|
|
metadata:
|
|
name: higress-console-config
|
|
spec:
|
|
data: |
|
|
replicaCount: 0
|
|
match: ${image_registry}/${image_repository}/higress:v${higress_version#v:-2.0.1}
|
|
path: charts/higress/charts/higress-console/values.yaml
|
|
strategy: merge
|
|
"
|
|
echo "$higress_console_config" > $CLOUD_DIR/higress-console-config.yaml
|
|
|
|
higress_https_config="
|
|
apiVersion: v1
|
|
data:
|
|
cert: |
|
|
automaticHttps: false
|
|
fallbackForInvalidSecret: true
|
|
acmeIssuer:
|
|
- email: cloud@sealos.io
|
|
name: letsencrypt
|
|
renewBeforeDays: 1
|
|
credentialConfig:
|
|
- domains:
|
|
- '*.$cloud_domain'
|
|
- '$cloud_domain'
|
|
tlsSecret: sealos-system/wildcard-cert
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: higress-https
|
|
namespace: higress-system
|
|
"
|
|
echo "$higress_https_config" > $CLOUD_DIR/higress-https.yaml
|
|
|
|
higress_plugins_config="
|
|
apiVersion: networking.istio.io/v1alpha3
|
|
kind: EnvoyFilter
|
|
metadata:
|
|
name: hcm-options
|
|
namespace: higress-system
|
|
spec:
|
|
configPatches:
|
|
- applyTo: NETWORK_FILTER
|
|
match:
|
|
context: GATEWAY
|
|
listener:
|
|
filterChain:
|
|
filter:
|
|
name: envoy.filters.network.http_connection_manager
|
|
patch:
|
|
operation: MERGE
|
|
value:
|
|
name: envoy.filters.network.http_connection_manager
|
|
typed_config:
|
|
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
|
max_request_headers_kb: 8192
|
|
---
|
|
apiVersion: networking.istio.io/v1alpha3
|
|
kind: EnvoyFilter
|
|
metadata:
|
|
name: global-route-config
|
|
namespace: higress-system
|
|
spec:
|
|
configPatches:
|
|
- applyTo: ROUTE_CONFIGURATION
|
|
match:
|
|
context: GATEWAY
|
|
patch:
|
|
operation: MERGE
|
|
value:
|
|
request_headers_to_add:
|
|
- append: false
|
|
header:
|
|
key: x-real-ip
|
|
value: '%REQ(X-ENVOY-EXTERNAL-ADDRESS)%'
|
|
---
|
|
apiVersion: networking.istio.io/v1alpha3
|
|
kind: EnvoyFilter
|
|
metadata:
|
|
name: tailscale-options
|
|
namespace: higress-system
|
|
spec:
|
|
configPatches:
|
|
- applyTo: NETWORK_FILTER
|
|
match:
|
|
context: GATEWAY
|
|
listener:
|
|
filterChain:
|
|
filter:
|
|
name: envoy.filters.network.http_connection_manager
|
|
patch:
|
|
operation: MERGE
|
|
value:
|
|
typed_config:
|
|
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
|
|
upgrade_configs:
|
|
- upgrade_type: tailscale-control-protocol
|
|
"
|
|
echo "$higress_plugins_config" > $CLOUD_DIR/higress-plugins.yaml
|
|
|
|
backuprepo='
|
|
apiVersion: dataprotection.kubeblocks.io/v1alpha1
|
|
kind: BackupRepo
|
|
metadata:
|
|
annotations:
|
|
dataprotection.kubeblocks.io/need-update-tool-config: "true"
|
|
dataprotection.kubeblocks.io/is-default-repo: "true"
|
|
name: backup
|
|
spec:
|
|
accessMethod: Mount
|
|
config:
|
|
accessMode: ReadWriteOnce
|
|
storageClassName: openebs-backup
|
|
volumeMode: Filesystem
|
|
pvReclaimPolicy: Retain
|
|
storageProviderRef: pvc
|
|
volumeCapacity: 5Gi
|
|
'
|
|
echo "$backuprepo" > $CLOUD_DIR/backuprepo.yaml
|
|
|
|
vm_secret='
|
|
apiVersion: v1
|
|
kind: Secret
|
|
metadata:
|
|
name: additional-scrape-configs
|
|
namespace: vm
|
|
stringData:
|
|
prometheus-additional.yaml: |
|
|
- 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
|
|
- 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
|
|
'
|
|
|
|
echo "$vm_secret" > $CLOUD_DIR/vm-secret.yaml
|
|
|
|
sealos_gen_cmd="sealos gen ${image_registry}/${image_repository}/kubernetes:v${kubernetes_version#v:-1.27.11}\
|
|
${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 -e '/InitConfiguration/a skipPhases:\n - addon/kube-proxy' -i $CLOUD_DIR/Clusterfile
|
|
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
|
|
}
|
|
|
|
check_control_plane_count() {
|
|
# Check if master_ips is empty
|
|
if [[ -z "$master_ips" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
IFS=',' read -r -a master_ips_array <<< "$master_ips"
|
|
num_ips=${#master_ips_array[@]}
|
|
|
|
# If the number is even, output an error message and exit
|
|
if (( num_ips % 2 == 0 )); then
|
|
get_prompt "invalid_master_ips"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
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.14.1}"
|
|
[[ $k8s_ready == "y" ]] || (get_prompt "cilium_requirement" && sealos run "${image_registry}/${image_repository}/cilium:v${cilium_version#v:-1.15.8}" --env ExtraValues="ipam.mode=kubernetes")
|
|
wait_cluster_ready
|
|
sealos run "${image_registry}/${image_repository}/cert-manager:v${cert_manager_version#v:-1.14.6}"
|
|
sealos run "${image_registry}/${image_repository}/openebs:v${openebs_version#v:-3.10.0}"
|
|
sealos run "${image_registry}/${image_repository}/metrics-server:v${metrics_server_version#v:-0.6.4}"
|
|
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
|
|
|
|
# TODO use sealos run to install cockroachdb-operator
|
|
sealos run "${image_registry}/${image_repository}/cockroach:v2.12.0"
|
|
|
|
get_prompt "installing_monitoring"
|
|
sealos run "${image_registry}/${image_repository}/victoria-metrics-k8s-stack:v${victoria_metrics_k8s_stack_version#v:-1.96.0}"
|
|
|
|
get_prompt "partner_installation"
|
|
sealos run ${image_registry}/${image_repository}/higress:v${higress_version#v:-2.0.1} --config-file $CLOUD_DIR/higress-config.yaml --config-file $CLOUD_DIR/higress-console-config.yaml
|
|
kubectl apply -f $CLOUD_DIR/higress-https.yaml
|
|
kubectl apply -f $CLOUD_DIR/higress-plugins.yaml
|
|
get_prompt "optimizing_h2_buffer"
|
|
kubectl patch cm higress-config -n higress-system -p '{"data":{"higress":"downstream:\n http2:\n initialConnectionWindowSize: 4194304\n initialStreamWindowSize: 524288"}}' --type=merge
|
|
|
|
sealos run ${image_registry}/${image_repository}/kubeblocks:v${kubeblocks_version#v:-0.8.2}
|
|
sealos run ${image_registry}/${image_repository}/kubeblocks-apecloud-mysql:v${kubeblocks_version#v:-0.8.2} \
|
|
${image_registry}/${image_repository}/kubeblocks-postgresql:v${kubeblocks_version#v:-0.8.2} \
|
|
${image_registry}/${image_repository}/kubeblocks-mongodb:v${kubeblocks_version#v:-0.8.2} \
|
|
${image_registry}/${image_repository}/kubeblocks-redis:v${kubeblocks_version#v:-0.8.2} \
|
|
${image_registry}/${image_repository}/kubeblocks-csi-s3:v0.31.4
|
|
|
|
addons=("snapshot-controller" "migration" "milvus" "weaviate")
|
|
|
|
for addon in "${addons[@]}"; do
|
|
kubectl patch addon $addon --type='merge' -p '{"spec":{"install":{"enabled":true,"resources":{},"tolerations":"[{\"effect\":\"NoSchedule\",\"key\":\"kb-controller\",\"operator\":\"Equal\",\"value\":\"true\"}]"}}}'
|
|
done
|
|
|
|
kubectl apply -f $CLOUD_DIR/backuprepo.yaml
|
|
|
|
kubectl apply -f $CLOUD_DIR/vm-secret.yaml
|
|
kubectl patch vmagent -n vm victoria-metrics-k8s-stack --type merge -p '{"spec":{"additionalScrapeConfigs":{"key":"prometheus-additional.yaml","name":"additional-scrape-configs"}}}'
|
|
kubectl rollout restart deploy -n vm vmagent-victoria-metrics-k8s-stack || true
|
|
|
|
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-6.0}"\
|
|
--config-file $CLOUD_DIR/tls-secret.yaml
|
|
elif [[ $acme == "y" ]]; 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-6.0}"\
|
|
--env acmednsSecret="$(echo $acmednsSecret | base64 -w0)"\
|
|
--env acmednsHost="$acmedns_host"
|
|
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-6.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 ;;
|
|
--higress-version=*) higress_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 ;;
|
|
--acme) acme="y"; shift ;;
|
|
--acmedns-host=*) acmedns_host="${i#*=}"; shift ;;
|
|
--disable-acme) acme="n"; 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 | \
|
|
--higress-version | higress-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 | \
|
|
--acmedns-host | acmedns-host | \
|
|
--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
|
|
check_control_plane_count
|
|
init
|
|
collect_input
|
|
prepare_configs
|
|
execute_commands
|
|
|
|
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}"
|
|
if [[ $fulldomain != "" ]]; then
|
|
printf "$(get_prompt "acme_cname_record")\n" "$cloud_domain" "$fulldomain"
|
|
fi
|