运维部署

Ngrok 内网穿透部署指南

自建内网穿透隧道,安全高效实现公网访问

Ngrok 内网穿透部署方案

📦 项目地址

代码仓库: git@github.com:blowizer/ngrok.git

git clone git@github.com:blowizer/ngrok.git
cd ngrok

🎯 场景使用

实现 ngrok 公网转发访问,用于内网穿透,将本地服务暴露到公网。

🖥️ 服务器环境准备

1. Ubuntu 系统依赖安装

apt-get -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git

2. Go 语言环境安装

推荐版本: go version go1.16.3 linux/amd64

# 删除旧版本 golang 依赖包(如果存在)
rpm -qa|grep golang|xargs rpm -e

# 下载安装包
wget https://golang.org/dl/go1.16.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.16.3.linux-amd64.tar.gz

# 配置环境变量
vim /etc/profile
# 在文件末尾添加以下内容:
# #go lang
# export GOROOT=/usr/local/go
# export PATH=$PATH:$GOROOT/bin

# 使配置生效
source /etc/profile

# 检测是否安装成功
go version

3. 防火墙端口配置

vim /etc/sysconfig/iptables
# 添加以下内容:
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 4443 -j ACCEPT
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -j ACCEPT

# 重新加载防火墙规则
/etc/init.d/iptables reload
/etc/init.d/iptables restart

# 查看开放的端口
iptables -nL

注意: 如果使用云服务器(如阿里云),还需要在安全组中开放相应端口。

Kubernetes 集群部署 - etcd 安装与配置

etcd 作为 Kubernetes 的数据存储核心,稳定可靠的部署至关重要

📋 概述

etcd 是 Kubernetes 集群的核心数据存储组件,负责存储集群的所有配置数据、状态信息和元数据。本文档提供 etcd 集群的完整安装、配置和部署方案。

架构说明

  • 集群模式: 建议至少 3 个节点(奇数个节点,避免脑裂)
  • 数据目录: /var/lib/etcd
  • 配置文件: /etc/etcd/etcd.conf
  • 服务文件: /etc/systemd/system/etcd.service
  • 端口:
    • 2379: 客户端通信端口
    • 2380: 节点间通信端口

🔧 环境准备

节点信息配置

根据实际环境修改以下节点信息:

# 节点格式: 主机名:IP地址:etcd节点名
NODES=(
    "k8s-master-01:192.168.1.100:etcd-01"
    "k8s-node-01:192.168.1.101:etcd-02"
    "k8s-master-02:192.168.1.102:etcd-03"
)

系统要求

  • 操作系统: CentOS 7+ / Ubuntu 18.04+
  • 内存: 至少 2GB(推荐 4GB+)
  • 磁盘: 至少 20GB 可用空间(SSD 推荐)
  • 网络: 节点间网络延迟 < 10ms

📦 安装 etcd

步骤 1: 下载 etcd 二进制文件

#!/bin/bash
# install-etcd.sh - etcd 安装脚本

set -e

ETCD_VERSION="v3.5.9"  # 根据 K8s 版本选择兼容的 etcd 版本
INSTALL_DIR="/usr/local/bin"
DATA_DIR="/var/lib/etcd"
CONFIG_DIR="/etc/etcd"

# 交互式确认
read -p "是否执行 etcd 安装步骤?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已跳过 etcd 安装"
    exit 0
fi

echo "=== 开始安装 etcd ${ETCD_VERSION} ==="

# 创建必要目录
sudo mkdir -p ${INSTALL_DIR}
sudo mkdir -p ${DATA_DIR}
sudo mkdir -p ${CONFIG_DIR}

# 下载 etcd
cd /tmp
wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz

# 解压并安装
tar -xzf etcd-${ETCD_VERSION}-linux-amd64.tar.gz
sudo cp etcd-${ETCD_VERSION}-linux-amd64/etcd* ${INSTALL_DIR}/
sudo chmod +x ${INSTALL_DIR}/etcd*

# 验证安装
${INSTALL_DIR}/etcd --version
${INSTALL_DIR}/etcdctl version

echo "✓ etcd 安装完成"

步骤 2: 配置 etcd 集群

#!/bin/bash
# configure-etcd.sh - etcd 集群配置脚本

set -e

NODES=(
    "k8s-master-01:192.168.1.100:etcd-01"
    "k8s-node-01:192.168.1.101:etcd-02"
    "k8s-master-02:192.168.1.102:etcd-03"
)

ETCD_VERSION="v3.5.9"
INSTALL_DIR="/usr/local/bin"
DATA_DIR="/var/lib/etcd"
CONFIG_DIR="/etc/etcd"
CERT_DIR="/etc/etcd/ssl"

# 交互式确认
read -p "是否执行 etcd 集群配置?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已跳过 etcd 配置"
    exit 0
fi

echo "=== 开始配置 etcd 集群 ==="

# 生成集群初始成员列表
INITIAL_CLUSTER=""
for NODE_INFO in "${NODES[@]}"; do
    IFS=':' read -r HOSTNAME NODE_IP ETCD_NAME <<< "$NODE_INFO"
    INITIAL_CLUSTER+="${ETCD_NAME}=https://${NODE_IP}:2380,"
done
INITIAL_CLUSTER=${INITIAL_CLUSTER%,}

echo "集群成员列表: ${INITIAL_CLUSTER}"

# 为每个节点配置 etcd
for NODE_INFO in "${NODES[@]}"; do
    IFS=':' read -r HOSTNAME NODE_IP ETCD_NAME <<< "$NODE_INFO"
    
    echo "配置节点: ${HOSTNAME} (${ETCD_NAME})"
    
    ssh root@${NODE_IP} << EOF
        # 创建目录
        mkdir -p ${DATA_DIR}
        mkdir -p ${CONFIG_DIR}
        mkdir -p ${CERT_DIR}
        
        # 创建 etcd 配置文件
        cat > ${CONFIG_DIR}/etcd.conf << EOC
# 节点名称
ETCD_NAME=${ETCD_NAME}
# 数据目录
ETCD_DATA_DIR=${DATA_DIR}
# 监听客户端请求的地址
ETCD_LISTEN_CLIENT_URLS=https://${NODE_IP}:2379,https://127.0.0.1:2379
# 监听对等节点请求的地址
ETCD_LISTEN_PEER_URLS=https://${NODE_IP}:2380
# 客户端访问地址
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://${NODE_IP}:2380
ETCD_ADVERTISE_CLIENT_URLS=https://${NODE_IP}:2379
# 初始集群成员列表
ETCD_INITIAL_CLUSTER=${INITIAL_CLUSTER}
# 集群状态(new 表示新集群,existing 表示加入已有集群)
ETCD_INITIAL_CLUSTER_STATE=new
# 集群 token
ETCD_INITIAL_CLUSTER_TOKEN=k8s-etcd-cluster
# 客户端证书配置(如果使用 TLS)
ETCD_CLIENT_CERT_AUTH=true
ETCD_CERT_FILE=${CERT_DIR}/server.crt
ETCD_KEY_FILE=${CERT_DIR}/server.key
ETCD_TRUSTED_CA_FILE=${CERT_DIR}/ca.crt
# 对等节点证书配置
ETCD_PEER_CLIENT_CERT_AUTH=true
ETCD_PEER_CERT_FILE=${CERT_DIR}/peer.crt
ETCD_PEER_KEY_FILE=${CERT_DIR}/peer.key
ETCD_PEER_TRUSTED_CA_FILE=${CERT_DIR}/ca.crt
EOC
        
        # 设置权限
        chmod 644 ${CONFIG_DIR}/etcd.conf
        chown -R etcd:etcd ${DATA_DIR} ${CONFIG_DIR} 2>/dev/null || true
        
        echo "✓ ${HOSTNAME} 配置完成"
EOF
done

echo "✓ etcd 集群配置完成"

步骤 3: 创建 systemd 服务

#!/bin/bash
# setup-etcd-service.sh - 创建 etcd systemd 服务

set -e

NODES=(
    "k8s-master-01:192.168.1.100:etcd-01"
    "k8s-node-01:192.168.1.101:etcd-02"
    "k8s-master-02:192.168.1.102:etcd-03"
)

INSTALL_DIR="/usr/local/bin"
CONFIG_DIR="/etc/etcd"

# 交互式确认
read -p "是否创建 etcd systemd 服务?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已跳过服务创建"
    exit 0
fi

echo "=== 创建 etcd systemd 服务 ==="

for NODE_INFO in "${NODES[@]}"; do
    IFS=':' read -r HOSTNAME NODE_IP ETCD_NAME <<< "$NODE_INFO"
    
    echo "为 ${HOSTNAME} 创建服务..."
    
    ssh root@${NODE_IP} << EOF
        cat > /etc/systemd/system/etcd.service << EOS
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-${CONFIG_DIR}/etcd.conf
ExecStart=${INSTALL_DIR}/etcd
Restart=on-failure
RestartSec=10
LimitNOFILE=65536
# 关键:增加启动超时时间,避免集群启动时超时
TimeoutStartSec=120

[Install]
WantedBy=multi-user.target
EOS
        
        # 重新加载 systemd
        systemctl daemon-reload
        systemctl enable etcd
        
        echo "✓ ${HOSTNAME} 服务创建完成"
EOF
done

echo "✓ etcd 服务创建完成"

🚀 启动 etcd 集群

步骤 4: 启动集群

#!/bin/bash
# start-etcd-cluster.sh - 启动 etcd 集群

set -e

NODES=(
    "k8s-master-01:192.168.1.100:etcd-01"
    "k8s-node-01:192.168.1.101:etcd-02"
    "k8s-master-02:192.168.1.102:etcd-03"
)

# 交互式确认
read -p "是否启动 etcd 集群?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已跳过集群启动"
    exit 0
fi

echo "=== 启动 etcd 集群 ==="

# 按顺序启动节点(避免同时启动导致的问题)
for i in "${!NODES[@]}"; do
    NODE_INFO="${NODES[$i]}"
    IFS=':' read -r HOSTNAME NODE_IP ETCD_NAME <<< "$NODE_INFO"
    
    echo "启动节点 ${HOSTNAME} (第 $((i+1)) 个节点)..."
    
    ssh root@${NODE_IP} "systemctl start etcd"
    
    # 等待节点启动
    sleep 5
    
    # 检查节点状态
    if ssh root@${NODE_IP} "systemctl is-active --quiet etcd"; then
        echo "✓ ${HOSTNAME} 启动成功"
    else
        echo "✗ ${HOSTNAME} 启动失败,请检查日志: journalctl -u etcd -n 50"
    fi
done

echo "=== 检查集群状态 ==="
# 使用第一个节点检查集群状态
FIRST_NODE="${NODES[0]}"
IFS=':' read -r FIRST_HOST FIRST_IP FIRST_NAME <<< "$FIRST_NODE"

ssh root@${FIRST_IP} "/usr/local/bin/etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/etcd/ssl/ca.crt --cert=/etc/etcd/ssl/server.crt --key=/etc/etcd/ssl/server.key endpoint health" || echo "注意: 如果使用 TLS,请确保证书已正确配置"

echo "✓ etcd 集群启动完成"

✅ 验证和监控

检查集群状态

# 检查服务状态
systemctl status etcd

# 查看日志
journalctl -u etcd -f

# 检查集群健康(如果使用 TLS)
etcdctl --endpoints=https://127.0.0.1:2379 \
    --cacert=/etc/etcd/ssl/ca.crt \
    --cert=/etc/etcd/ssl/server.crt \
    --key=/etc/etcd/ssl/server.key \
    endpoint health

# 查看集群成员
etcdctl --endpoints=https://127.0.0.1:2379 \
    --cacert=/etc/etcd/ssl/ca.crt \
    --cert=/etc/etcd/ssl/server.crt \
    --key=/etc/etcd/ssl/server.key \
    member list

常用维护命令

# 备份 etcd 数据
etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db

# 恢复 etcd 数据
etcdctl snapshot restore /backup/etcd-snapshot-20231229.db \
    --data-dir=/var/lib/etcd-restore

# 查看集群统计信息
etcdctl endpoint status --write-out=table

📝 注意事项

  1. 证书配置: 如果使用 TLS,确保所有节点的证书已正确配置
  2. 网络连通性: 确保所有节点间的 2379 和 2380 端口互通
  3. 数据备份: 定期备份 etcd 数据,防止数据丢失
  4. 资源监控: 监控 etcd 的 CPU、内存和磁盘使用情况
  5. 版本兼容: 确保 etcd 版本与 Kubernetes 版本兼容

🔗 相关资源

运维部署

运筹帷幄之中,部署千里之外

「运维部署机关篇」

收录基础设施即代码、持续部署、监控告警等运维实战经验。从单机到集群,从脚本到平台,构建稳定可靠的部署体系。


🐳 「容器化机关术」

🏗️ 「Docker 精要」

「镜像构建艺术」
  • Dockerfile 优化指南 —— 多阶段构建、层缓存优化、安全最佳实践
  • 计划:多架构镜像构建、镜像扫描与漏洞修复
  • 计划:私有仓库管理、镜像分发策略
「容器编排实战」
  • Docker Compose 进阶 —— 多环境配置、网络设计、数据卷管理
  • 计划:Swarm 集群部署、服务更新策略、滚动升级

☸️ 「Kubernetes 排兵阵」

「集群部署与管理」
  • K8s 集群建设指南 —— 高可用架构、网络插件选型、存储方案

  • etcd 集群部署详解 —— 集群模式、高可用部署、证书管理与运维故障排查

  • 计划:节点管理、资源配额、命名空间规划

「工作负载编排」
  • K8s 工作负载详解 —— Deployment策略、StatefulSet状态管理、DaemonSet系统服务
  • 计划:HPA自动扩缩、Resource资源配置、调度优化
「服务网格进阶」
  • Istio 服务治理 —— 流量管理、安全策略、可观测性
  • 计划:Envoy配置深入、多集群服务发现

🔄 「CI/CD 连弩」

🤖 「Jenkins 流水线」

「Pipeline as Code」
  • Jenkinsfile 高级技巧 —— 声明式流水线、共享库开发、并行执行
  • 计划:多分支流水线、流水线模板、审批流程
「插件生态与扩展」
  • Jenkins 插件开发 —— 自定义步骤、UI扩展、集成第三方服务
  • 计划:插件性能优化、安全最佳实践

🚀 「GitLab CI/CD」

「.gitlab-ci.yml 深度解析」
  • GitLab CI 实战指南 —— 作业依赖、缓存策略、制品管理
  • 计划:动态环境、Review Apps、安全扫描集成
「Auto DevOps」
  • 计划:全自动流水线、K8s自动部署、监控集成

🚇 「内网穿透工具 」

⚡ 「云原生 CI/CD」

「GitHub Actions」
  • Actions 工作流设计 —— 复合动作、矩阵构建、自托管Runner
  • 计划:组织级工作流、安全加固、成本优化
「ArgoCD & Flux」
  • GitOps 实践指南 —— 应用同步策略、健康检查、自动回滚
  • 计划:多集群管理、配置漂移检测

👁️ 「监控日志镜」

📊 「指标监控体系」

「Prometheus 生态」
  • Prometheus 深入实战 —— 数据模型、查询语言、存储优化
  • 计划:高可用方案、远程读写、联邦集群
「Grafana 可视化」
  • Grafana 仪表板艺术 —— 面板设计、告警配置、数据源管理
  • 计划:插件开发、权限控制、报表生成

📝 「日志管理方案」

「ELK/EFK 栈」
  • Elasticsearch 集群运维 —— 索引管理、性能调优、安全配置
  • 计划:冷热架构、跨集群搜索、数据生命周期
「Loki 轻量日志」
  • Loki 日志聚合 —— 日志流水线、标签策略、查询优化
  • 计划:多租户支持、存储后端选型

🚨 「告警与自愈」

「告警管理智能化」
  • Alertmanager 高级配置 —— 路由策略、静默规则、告警模板
  • 计划:告警去噪、智能降噪、根因分析
「自动化运维」
  • 计划:自愈脚本、事件驱动自动化、ChatOps集成

☁️ 「云原生天工」

🌐 「服务网格」

「Istio 实战进阶」
  • Istio 流量治理 —— 金丝雀发布、故障注入、熔断降级
  • 计划:多集群服务网格、安全策略管理
「API 网关」
  • Gateway 架构设计 —— 路由规则、限流策略、认证授权
  • 计划:Kong/Envoy对比、插件开发

🔐 「安全与治理」

「零信任安全」
  • 云原生安全实践 —— 网络策略、Pod安全策略、机密管理
  • 计划:服务账户管理、安全上下文配置
「策略即代码」
  • OPA/Gatekeeper —— 策略编写、验证执行、合规检查
  • 计划:自定义资源验证、多集群策略管理

🏗️ 「基础设施即代码」

📜 「Terraform 工程」

「模块化设计」
  • Terraform 模块开发 —— 模块结构、变量设计、版本管理
  • 计划:私有模块库、模块测试、代码复用
「多环境管理」
  • Terraform 工作空间 —— 状态管理、后端配置、团队协作
  • 计划:状态锁定、远程状态、敏感数据加密

🎯 「Ansible 自动化」

「Playbook 工程化」
  • Ansible 最佳实践 —— 角色设计、变量管理、错误处理
  • 计划:动态Inventory、回调插件、性能优化
「Ansible Tower/AWX」
  • 计划:作业模板、权限控制、审计日志

🔄 「跨云管理」

「多云策略」
  • 多云架构实践 —— 资源编排、网络互联、数据同步
  • 计划:成本优化、容灾方案、迁移策略

🗄️ 「存储与网络」

💾 「存储方案」

「块存储与文件系统」
  • 分布式存储实战 —— Ceph部署、性能调优、数据迁移
  • 计划:CSI驱动开发、快照与克隆
「对象存储架构」
  • 计划:MinIO集群、数据生命周期、跨区域复制

🌐 「网络架构」

「CNI 网络插件」
  • K8s 网络深度解析 —— Calico/Flannel对比、网络策略、服务发现
  • 计划:多网络平面、网络性能优化
「负载均衡器」
  • 计划:Ingress控制器、Service Mesh集成、全局负载均衡

运维之道,在于预见问题于未发,化解风险于无形。此处记录实战中验证的部署模式与避坑指南。