本文永久链接: https://www.xtplayer.cn/rancher/install/ha-self-signed-ssl-ingress/

节点软硬件要求

节点硬件要求请参考:https://docs.rancher.cn/docs/rancher2/installation_new/requirements/_index/

节点基础环境配置

请参考 基础环境配置

同步镜像

如果你是在离线环境安装,请先访问 rancher 离线安装镜像同步,按照方法同步所有镜像到离线私有镜像仓库。如果主机能够直接拉取镜像,则跳过此步骤。

创建 rke 配置文件

使用下面的示例创建 rancher-cluster.yml 文件,使用创建的 3 个节点的 IP 地址或域名替换列表中的 IP 地址。

注意: 如果节点有公网地址 和 内网地址地址,建议手动设置 internal_address:以便 Kubernetes 将内网地址用于集群内部通信。如果需要开启自动配置安全组或防火墙,某些服务(如 AWS EC2)需要设置 internal_address:

nodes:
- address: 165.227.114.x
internal_address: 172.16.22.x
user: ubuntu
role: [controlplane,worker,etcd]
- address: 165.227.116.x
internal_address: 172.16.32.x
user: ubuntu
role: [controlplane,worker,etcd]
- address: 165.227.127.x
internal_address: 172.16.42.x
user: ubuntu
role: [controlplane,worker,etcd]

# 如果要使用私有仓库中的镜像,配置以下参数来指定默认私有仓库地址。
##private_registries:
## - url: registry.com
## user: Username
## password: password
## is_default: true

services:
etcd:
# 扩展参数 https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md
extra_args:
auto-compaction-mode: periodic
auto-compaction-retention: 60m
# 修改空间配额为$((6*1024*1024*1024)),默认 2G,最大 8G
quota-backend-bytes: '6442450944'
snapshot-count: 50000
# 自动备份
## rke 版本小于 0.2.x 或 rancher 版本小于 v2.2.0 时使用
snapshot: true
creation: 6h
retention: 24h
## rke 版本大于等于 0.2.x 或 rancher 版本大于等于 v2.2.0 时使用(两段配置二选一)
backup_config:
enabled: true # 设置 true 启用 ETCD 自动备份,设置 false 禁用;
interval_hours: 12 # 快照创建间隔时间,不加此参数,默认 5 分钟;
retention: 6 # etcd 备份保留份数;

更多 etcd 配置请参考: etcd 优化

RKE 节点参数说明

参数必须描述
addressyes公共域名或 IP 地址
useryes可以运行 docker 命令的用户
roleyes分配给节点的 Kubernetes 角色列表
internal_addressno内部集群通信的私有域名或 IP 地址
ssh_key_pathno用于对节点进行身份验证的 SSH 私钥的路径(默认为~/.ssh/id_rsa)

镜像仓库配置

如果需要使用自己镜像仓库的镜像或者是离线安装,那么可以在 private_registries 字段中配置私有镜像仓库信息。

选项描述
url‘’镜像仓库地址
user‘’镜像仓库用户名
password‘’镜像仓库密码
is_defaulttrue/false这个参数很重要,当配置这个参数后,rke 会自动为系统镜像
添加镜像仓库前缀,比如 rancher/rancher 会变为
192.168.1.1/rancher/rancher,用于离线环境或者使用自己的私有仓库构建集群。

完整的配置示例,请参考完整-cluster-yml-示例

高级配置

RKE 有许多配置选项可用于自定义安装以适合您的特定环境,有关选项和功能的完整列表,请查看RKE 文档

安装 rke、kubectl、helm 工具

需要选择一个节点用来运行 rke、kubectl、helm 等命令,你可以叫它为 操作节点。这个节点可以是 local 集群中的任意一台,也可以是专门准备的独立的一个节点。

# rke
sudo curl -o /usr/local/bin/rke http://rancher-mirror.cnrancher.com/rke/v1.2.4/rke_linux-amd64
sudo chmod +x /usr/local/bin/rke
# kubectl
sudo curl -o /usr/local/bin/kubectl http://rancher-mirror.cnrancher.com/kubectl/v1.20.0/linux-amd64-v1.20.0-kubectl
sudo chmod +x /usr/local/bin/kubectl
# helm
cd /tmp
sudo curl -O http://rancher-mirror.cnrancher.com/helm/v3.5.0/helm-v3.5.0-linux-amd64.tar.gz;
sudo tar -zxf helm*tar.gz;
sudo cp -rf /tmp/linux-amd64/helm /usr/local/bin/helm
sudo chmod +x /usr/local/bin/helm

或者访问 http://mirror.cnrancher.com/ 下载 rke、kubectl、helm 二进制文件,然后放在操作节点/usr/local/bin 目录下,并给与执行权限。

创建 Kubernetes 集群

运行 RKE 命令创建 Kubernetes 集群

rke up --config ./rancher-cluster.yml

完成后,它应显示:Finished building Kubernetes cluster successfully

测试集群

RKE 会自动创建 kube_config_rancher-cluster.yml。这个文件包含 kubectl 和 helm 访问 K8S 的凭据,请妥善保管。

注意: 如果您使用的文件不叫 rancher-cluster.yml, 那么这个 kubeconfig 配置文件将被命名为 kube_config_<FILE_NAME>.yml

通过 kubectl 测试您的连接,并查看您的所有节点是否处于 Ready 状态。

kubectl --kubeconfig=kube_config_xxx.yml get nodes

NAME STATUS ROLES AGE VERSION
165.227.114.63 Ready controlplane,etcd,worker 11m v1.10.1
165.227.116.167 Ready controlplane,etcd,worker 11m v1.10.1
165.227.127.226 Ready controlplane,etcd,worker 11m v1.10.1

检查集群 Pod 的运行状况

  • Pods 是 Running 或者 Completed 状态。
  • READY 列显示所有正在运行的容器 (i.e. 3/3),STATUS 显示 POD 是 Running
  • Pods 的 STATUSCompletedrun-one Jobs,这些 podsREADY 应该为 0/1
kubectl --kubeconfig=kube_config_xxx.yml get pods -A

NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-tnsn4 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-tw2ht 1/1 Running 0 30s
ingress-nginx nginx-ingress-controller-v874b 1/1 Running 0 30s
kube-system canal-jp4hz 3/3 Running 0 30s
kube-system canal-z2hg8 3/3 Running 0 30s
kube-system canal-z6kpw 3/3 Running 0 30s
kube-system kube-dns-7588d5b5f5-sf4vh 3/3 Running 0 30s
kube-system kube-dns-autoscaler-5db9bbb766-jz2k6 1/1 Running 0 30s
kube-system metrics-server-97bc649d5-4rl2q 1/1 Running 0 30s
kube-system rke-ingress-controller-deploy-job-bhzgm 0/1 Completed 0 30s
kube-system rke-kubedns-addon-deploy-job-gl7t4 0/1 Completed 0 30s
kube-system rke-metrics-addon-deploy-job-7ljkc 0/1 Completed 0 30s
kube-system rke-network-plugin-deploy-job-6pbgj 0/1 Completed 0 30s

Helm 安装 Rancher

准备 Rancher Chart

访问 rancher mirror 下载 Rancher Chart 压缩包,解压后应该有 rancher 文件夹。

创建自签名 ssl 证书

自签名 ssl 证书创建方法请参考 自签名 ssl 证书,注意不要修改生成的文件名称。

创建 K8S ssl 密文

使用 kubectl 创建 tls 类型的 secrets

注意:文件的名称一定要与下面的名称相同。

# 指定配置文件
kubeconfig=xxx/xxx/xx.kubeconfig.yml
# 创建命名空间
kubectl --kubeconfig=$kubeconfig create namespace cattle-system
# 服务证书和私钥密文
kubectl --kubeconfig=$kubeconfig \
-n cattle-system create secret tls tls-rancher-ingress \
--cert=./tls.crt \
--key=./tls.key
# ca 证书密文
kubectl --kubeconfig=$kubeconfig \
-n cattle-system create secret generic tls-ca \
--from-file=cacerts.pem

安装 Rancher Server

更多的 chart 参数可访问 https://docs.rancher.cn/docs/rancher2/installation_new/install-rancher-on-k8s/chart-options/_index

# 指定配置文件
kubeconfig=xxx/xxx/xx.kubeconfig.yml
kubectl --kubeconfig=$kubeconfig create namespace cattle-system
helm --kubeconfig=$kubeconfig install rancher ./rancher \
--namespace cattle-system \
--set hostname=<您自己的域名> \
--set ingress.tls.source=secret \
--set privateCA=true

注意: 申请证书对应的域名需要与 hostname 选项匹配,否则 ingress 将无法代理访问 Rancher。

(可选)为 Agent Pod 添加主机别名(/etc/hosts)

如果你的环境中没有 DNS 服务器做域名解析,那么这个时候通过 kubectl --kubeconfig=xxx.yaml -n cattle-system get pod 应该是可以看到 agent pod 一直无法正常运行,查看 agent pod 日志会发现是因为连接不上 rancher server url。

  • 解决方法

    可以通过给 cattle-cluster-agent Podcattle-node-agent pod 添加主机别名(/etc/hosts),让其可以正常通过 Rancher Server URL 与 Rancher Server 通信(前提是 IP 地址可以互通)

    1. cattle-cluster-agent pod

      export kubeconfig=xxx/xxx/xx.kubeconfig.yml

      kubectl --kubeconfig=$kubeconfig -n cattle-system \
      patch deployments cattle-cluster-agent --patch '{
      "spec": {
      "template": {
      "spec": {
      "hostAliases": [
      {
      "hostnames":
      [
      "demo.cnrancher.com"
      ],
      "ip": "192.168.1.100"
      }
      ]
      }
      }
      }
      }'
    2. cattle-node-agent pod

      export kubeconfig=xxx/xxx/xx.kubeconfig.yml

      kubectl --kubeconfig=$kubeconfig -n cattle-system \
      patch daemonsets cattle-node-agent --patch '{
      "spec": {
      "template": {
      "spec": {
      "hostAliases": [
      {
      "hostnames":
      [
      "xxx.rancher.com"
      ],
      "ip": "192.168.1.100"
      }
      ]
      }
      }
      }
      }'

      注意 1、替换其中的域名和 IP
      2、别忘记 json 中的引号。