聲明
1.此貼僅供參考,請根據自身需求在測試環境測試和修改。
安裝準備
1.獲取對應的安裝包和授權,并將授權和安裝包放在同一個目錄下
2.docekr已配置遠程倉庫
3.提前拉取jdk的鏡像(這里配置了使用openjdk:8)
安裝
將以下內容復制到k8s_deploy_TongWeb7049m6.sh里:
#!/bin/bash
# TongWeb Kubernetes 全自動部署腳本(支持鏡像倉庫)# 使用說明:
# 文件準備統一在同級目錄下:
# /部署目錄/
# ├── k8s_deploy_TongWeb.sh 部署腳本
# ├── license.dat 產品授權
# └──TongWeb7.0.4.9_M6_Enterprise_Linux.tar.gz 安裝包
# 執行權限:chmod +x k8s_deploy_TongWeb7049m6.sh
# 運行部署:sudo ./k8s_deploy_TongWeb7049m6.sh# 配置信息
APP_NAME="tongweb"
APP_VERSION="7.0.4.9_M6_Enterprise_Linux"
TAR_PACKAGE="TongWeb7.0.4.9_M6_Enterprise_Linux.tar.gz"
INSTALL_DIR="/opt/tongweb-7049m6"
NAMESPACE="tongweb7049m6cloud-namespace"
IMAGE_NAME="tongweb:7049m6"
K8S_DIR="/tmp/tongweb-k8s-manifests"# 鏡像倉庫配置(根據實際情況修改)
REGISTRY_URL="192.168.10.108:5000" # 鏡像倉庫地址
REGISTRY_PROJECT="tongweb7-cloud-7049m6" # 倉庫中的項目/命名空間名稱(若無可留空)
REGISTRY_USER="admin" # 倉庫用戶名
REGISTRY_PASSWORD="Harbor12345" # 倉庫密碼
APP_VERSION="7.0.4.9_M6_Enterprise_Linux" # 需在腳本中定義版本變量# 完整鏡像地址格式:
REMOTE_IMAGE_NAME="${REGISTRY_URL}/${REGISTRY_PROJECT}/tongweb:${APP_VERSION}-$(date +%Y%m%d%H%M)"# 初始化環境
init_env() {# 創建臨時目錄mkdir -p "$K8S_DIR"# 檢查必需命令for cmd in docker kubectl tar; doif ! command -v $cmd &> /dev/null; thenecho "錯誤:必需命令 $cmd 未找到!"exit 1fidone
}# 解壓安裝包
extract_package() {if [ ! -f "$TAR_PACKAGE" ]; thenecho "錯誤:安裝包 $TAR_PACKAGE 不存在!"exit 1fiecho "正在解壓安裝包..."tar -zxvf "$TAR_PACKAGE" -C /optmv "/opt/TongWeb${APP_VERSION}" "$INSTALL_DIR"cp license.dat "$INSTALL_DIR"
}# 配置Kubernetes
setup_kubernetes() {# 創建命名空間if ! kubectl get namespace "$NAMESPACE" &> /dev/null; thenkubectl create namespace "$NAMESPACE"fi# 創建ConfigMapkubectl create configmap license7049m6 \--from-file=license.dat \-n "$NAMESPACE"
}# 構建并推送鏡像
build_and_push_image() {# 基礎鏡像配置(可根據需要修改)local BASE_IMAGE="openjdk:8"# 生成Dockerfileecho "正在生成Dockerfile..."cat > "$INSTALL_DIR/Dockerfile" <<EOF
FROM ${BASE_IMAGE}# 時區配置
ENV TZ=Asia/Shanghai \\LANG=C.UTF-8# 拷貝TongWeb
#ADD tongweb /opt/TongWeb
ADD . /opt/TongWeb# 暴露端口(按需求改)
EXPOSE 8080 8443 9060# 啟動命令
#ENTRYPOINT ["/opt/TongWeb/bin/startservernohup.sh"]
# 啟動命令
ENTRYPOINT ["/opt/TongWeb/bin/startserver.sh"]RUN echo "[$(date '+%Y-%m-%d %H:%M:%S')] TongWeb ${APP_VERSION} 鏡像構建成功"
EOF# 構建本地鏡像echo "正在構建本地鏡像..."if ! docker build -t "$IMAGE_NAME" -f "$INSTALL_DIR/Dockerfile" "$INSTALL_DIR"; thenecho "鏡像構建失敗!"exit 1fi# 標記并推送鏡像echo "正在標記鏡像..."docker tag "$IMAGE_NAME" "$REMOTE_IMAGE_NAME"echo "登錄鏡像倉庫..."if ! docker login -u "$REGISTRY_USER" -p "$REGISTRY_PASSWORD" "$REGISTRY_URL"; thenecho "鏡像倉庫登錄失敗!"exit 1fiecho "正在推送鏡像到倉庫..."if ! docker push "$REMOTE_IMAGE_NAME"; thenecho "鏡像推送失敗!"exit 1fiecho "鏡像推送成功:$REMOTE_IMAGE_NAME"
}# 生成部署文件
generate_manifests() {# 生成Deploymentcat > "$K8S_DIR/deployment.yaml" <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: $APP_NAME
spec:selector:matchLabels:app: $APP_NAMEreplicas: 1template:metadata:labels:app: $APP_NAMEspec:containers:- name: $APP_NAMEimage: $REMOTE_IMAGE_NAME # 使用倉庫鏡像地址imagePullPolicy: Always # 總是從倉庫拉取env:- name: CONFIG_REMOTE_ENABLEvalue: "false"- name: ENV_TYPEvalue: "cloud"ports:- name: httpcontainerPort: 8080- name: httpscontainerPort: 8443- name: admincontainerPort: 9060volumeMounts:- name: log-volumemountPath: /opt/TongWeb/logs- name: autodeploy-volumemountPath: /opt/TongWeb/autodeploy- name: licensemountPath: /opt/TongWeb/license.datsubPath: license.datvolumes:- name: log-volumehostPath:path: /home/work/logstype: DirectoryOrCreate- name: autodeploy-volumehostPath:path: /home/work/autodeploytype: DirectoryOrCreate- name: licenseconfigMap:name: license7049m6
EOF# 生成Servicecat > "$K8S_DIR/service.yaml" <<EOF
apiVersion: v1
kind: Service
metadata:name: ${APP_NAME}srv
spec:selector:app: $APP_NAMEtype: NodePortports:- name: httpport: 8088targetPort: 8088nodePort: 30808 # 修改為有效范圍內的端口- name: httpsport: 8443targetPort: 8443nodePort: 32443 # 修改為有效范圍內的端口- name: adminport: 9060targetPort: 9060nodePort: 30906 # 修改為有效范圍內的端口
EOF
}# 部署應用到集群
deploy_to_cluster() {echo "正在部署應用..."kubectl apply -f "$K8S_DIR/deployment.yaml" -n "$NAMESPACE"kubectl apply -f "$K8S_DIR/service.yaml" -n "$NAMESPACE"# 等待Pod就緒echo -n "等待Pod啟動"local retry=0local max_retries=30 # 把重試次數增加為30local sleep_time=15 # 增加檢查間隔為10秒while [ $retry -lt $max_retries ]; dolocal pod_status=$(kubectl get pod -n "$NAMESPACE" -l app=$APP_NAME -o jsonpath='{.items[0].status.phase}')local image_pulled=$(kubectl get pod -n "$NAMESPACE" -l app=$APP_NAME -o jsonpath='{.items[0].status.containerStatuses[0].state}')if [ "$pod_status" == "Running" ]; thenecho -e "\nPod 已正常運行!"kubectl get pod -n "$NAMESPACE"return 0elif [[ "$image_pulled" == *"ErrImagePull"* ]]; thenecho -e "\n錯誤:鏡像拉取失敗!請檢查:"echo "1. 鏡像地址是否正確:$REMOTE_IMAGE_NAME"echo "2. 倉庫認證信息是否正確"exit 1fiecho -n "."((retry++))sleep $sleep_timedoneecho "錯誤:Pod 啟動超時!"kubectl describe pod -n "$NAMESPACE" -l app=$APP_NAMEexit 1
}# 主流程
main() {init_envextract_packagesetup_kubernetesbuild_and_push_imagegenerate_manifestsdeploy_to_clusterecho ""echo "═"*50echo "TongWeb 7.0.4.9_M6 部署完成!"echo "管理控制臺: http://<節點IP>:30906/console"echo "管理控制臺初始賬號:thanos"echo "管理控制臺初始密碼:thanos123.com"echo "如部署應用,訪問: http://<節點IP>:30808"echo "管理命令:"echo " kubectl get pod -n $NAMESPACE"echo " kubectl logs -f <pod名稱> -n $NAMESPACE"echo "═"*50
}# 執行主流程
main
執行以下指令:
# 執行權限:
chmod +x k8s_deploy_TongWeb7049m6.sh
# 運行部署:
sudo ./k8s_deploy_TongWeb7049m6.sh
執行后,使用以下指令查看日志:
kubectl get pod -n tongweb7049m6cloud-namespacekubectl logs -f <pod名稱> -n tongweb7049m6cloud-namespace
如果安裝有問題,需要刪掉pod重新操作,可執行以下指令:
#先查pod名稱
kubectl get pod -n tongweb7049m6cloud-namespace
#刪除pod
kubectl delete pod pod名 -n tongweb7049m6cloud-namespace
#刪除跟license相關的configmap
kubectl delete configmap license -n tongweb7049m6cloud-namespace
#刪除命名空間(前提是該命名空間只有tongweb相關的資源和配置)
kubectl delete namespace tongweb7049m6cloud-namespace