Skip to content
Go back

K3s 学习(二)使用 Docker 部署 Rancher

| 0 Views Edit page

前言

优化了下之前的流程。
现在仍然是将 Rancher 部署在集群外的机器上,但是新增了通过 acme.sh 自动申请证书的功能。


方案概述

  1. 安装最新的 Docker(环境)
  2. 启动 Rancher
  3. 域名解析到服务器
  4. 安装最新的 Nginx
  5. 安装 acme.sh
  6. 申请和安装证书(包含证书更新时的 hook)
  7. 修改 Nginx 配置并重启
  8. 修改证书自动更新相关配置并测试

操作步骤

一、安装最新的 Docker(环境)

参考:Ubuntu 20.04 从官方源安装最新的 Docker

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker -v

二、启动 Rancher

  • 容器内的 80 端口映射到宿主机 8080 端口(之后会通过 Nginx 反代)
  • 容器内的 443 端口映射到宿主机 8443 端口
  • 使用 ectd 作为数据存储,并通过映射到 /rab/docker/rancher 目录实现持久化
docker run -d \
  --name rancher \
  --privileged \
  --restart=unless-stopped \
  -p 8080:80 \
  -p 8443:443 \
  -v /rab/docker/rancher:/var/lib/rancher \
  rancher/rancher:v2.8.6-rc3 \
  --no-cacerts

三、域名解析到服务器

在域名托管处进行操作,如果是 Cloudflare 的话记得关掉小云朵。
直到 ping 域名得到正确 IP 后再进行下一步。

四、安装最新的 Nginx

参考:Installing Prebuilt Ubuntu Packages
之后隐藏默认证书的时候需要用到新的配置项。

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
  http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
  | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
  | sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
sudo apt install nginx
systemctl enable nginx
systemctl start nginx

五、安装 acme.sh

# 安装所需软件
apt-get install curl
apt-get install socat
# 安装 acme
curl https://get.acme.sh | sh
# 添加软链接
ln -s  /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
# 切换 CA 机构
acme.sh --set-default-ca --server letsencrypt

六、申请和安装证书(包含证书更新时的 hook)

我这里的域名是 rancher.ceshiku.cn
先申请证书:

这里先用 --standalone 模式申请证书,之后 Nginx 后启动后会占用 80 端口,需要改为使用 --webroot 模式更新证书。

acme.sh  --issue -d rancher.ceshiku.cn --standalone -k ec-256

再安装证书:

  • 指定证书的目录
  • 在更新时执行 Nginx 的重新加载
# 建立证书的目录
mkdir -vp /etc/nginx/ssl/rancher.ceshiku.cn
# 安装
acme.sh --install-cert -d rancher.ceshiku.cn \
  --fullchain-file /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt \
  --key-file /etc/nginx/ssl/rancher.ceshiku.cn/private.key  \
  --reloadcmd "service nginx force-reload"

七、修改 Nginx 配置并重启

/etc/nginx/conf.d/ 目录下新建配置 rancher.ceshiku.cn.conf

vi /etc/nginx/conf.d/rancher.ceshiku.cn.conf

文件内容:

server {
    listen      80;
    server_name rancher.ceshiku.cn;

    # 强制跳转 HTTPS
    location / {
        return 301 https://$server_name$request_uri;
    }

    # 设置证书认证用的路径
    location /.well-known/acme-challenge/ {
        # acme.sh --webroot 模式,认证文件生成后放置的路径
        root /var/acme/webroot/;
    }
}

server {
    listen      443 ssl;
    server_name rancher.ceshiku.cn;

    # SSL 配置
    ssl_certificate             /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt;
    ssl_certificate_key         /etc/nginx/ssl/rancher.ceshiku.cn/private.key;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    location / {
        proxy_pass  http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

然后为 /etc/nginx/nginx.conf 添加配置来防止出现 nginx: [emerg] unknown "connection_upgrade" variable 错误:

vi /etc/nginx/nginx.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

添加配置后的 nginx.conf

备份并重新建立 default.conf 来保证基础的安全,包括对 IP 的直接访问返回 500 错误,以及不返回默认的 SSL 证书:

mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
vi /etc/nginx/conf.d/default.conf
# 非域名访问返回 500 错误
server {
    listen      80;
    listen      [::]:80;
    server_name _;

    location / {
        return      500;
    }

    # 特殊的证书认证用的路径
    location /.well-known/acme-challenge/ {
        # acme.sh --webroot 模式,认证文件生成后放置的路径
        root /var/acme/webroot/;
    }
}

# 非域名访问防止发送 SSL 证书
server {
    listen      443 ssl default_server;
    server_name _;
 
    ssl_protocols           TLSv1.2 TLSv1.3;
    # 启用拒绝 TLS 握手
    ssl_reject_handshake    on;
    # SSL Session 缓存,不设置的话无缓存配置不生效
    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;

    # log 位置自行替换
    access_log  /var/log/nginx/host.access.log;
}

之后重启:

nginx -s reload
service nginx restart

最后访问域名即可:
Rancher 页面证书有效

八、修改证书自动更新相关配置并测试

看下当前申请的证书列表:

acme.sh --list

重新使用 --webroot 模式认证域名所有权,认证文件放在 /var/acme/webroot/ 中:

acme.sh --issue -d rancher.ceshiku.cn --webroot /var/acme/webroot/ -k ec-256 --force
acme.sh --install-cert -d rancher.ceshiku.cn \
  --fullchain-file /etc/nginx/ssl/rancher.ceshiku.cn/certificate.crt \
  --key-file /etc/nginx/ssl/rancher.ceshiku.cn/private.key  \
  --reloadcmd "service nginx force-reload"

然后执行 renew 确认一下可以正常更新:

acme.sh --renew -d rancher.ceshiku.cn --force

可以正常更新
之后在证书即将过期时,就会自动更新了。


参考资料:


Edit page