重要提示:

RKE HA安装仅支持Rancher v2.0.8以及早期版本,Rancher v2.0.8之后的版本使用helm安装Rancher

以下步骤将创建一个新的Kubernetes集群,专用于Rancher server高可用(HA)运行,本文档将引导您使用Rancher Kubernetes Engine(RKE)配置三个节点的集群.

一、架构说明

Rancher HA

一、Linux主机要求

二、配置负载均衡器(以NGINX为例)

默认情况下,rancher容器会将80端口上的请求重定向到443端口上。如果rancher server通过负载均衡器来代理,这个时候请求是通过负载均衡器发送给rancher server,而并非客户端直接访问rancher server。在非全局https的环境中,如果以外部负载均衡器作为ssl终止,这个时候通过负载均衡器的https请求将需要被反向代理到rancher server http(80)上。在负载均衡器上配置X-Forwarded-Proto: https参数,rancher server http(80)上收到负载均衡器的请求后,就不会再重定向到https(443)上。

负载均衡器或代理必须支持以下参数:

  • WebSocket 连接
  • SPDY/HTTP/2协议
  • 传递/设置以下headers:
Header Value 描述
Host 传递给Rancher的主机名 识别客户端请求的主机名。
X-Forwarded-Proto https 识别客户端用于连接负载均衡器的协议。注意:如果存在此标头,rancher/rancher不会将HTTP重定向到HTTPS。
X-Forwarded-Port Port used to reach Rancher. 识别客户端用于连接负载均衡器的端口。
X-Forwarded-For IP of the client connection. 识别客户端的原始IP地址。

我们有以下负载均衡器的示例配置:

三、配置DNS

选择一个用于访问Rancher的域名(FQDN)(例如,demo.rancher.com).

1、方案1 - 有DNS服务器

  • 1、登录DNS服务,创建一条 A 记录指向负载均衡主机IP;

  • 2、在终端中执行以下命令来验证运行解析是否生效:

    nslookup HOSTNAME.DOMAIN.COM

    如果解析生效

    nslookup demo.rancher.com
    DNS Server:         YOUR_HOSTNAME_IP_ADDRESS
    DNS Address:        YOUR_HOSTNAME_IP_ADDRESS#53
    Non-authoritative answer:
    Name:   demo.rancher.com
    Address: <负载均衡IP地址>

    如果解析不生效

    nslookup demo.rancher.com
    DNS Server:         YOUR_HOSTNAME_IP_ADDRESS
    DNS Address:        YOUR_HOSTNAME_IP_ADDRESS#5
    ** server can't find demo.rancher.com: NXDOMAIN

2、方案2 - 无DNS服务器

如果环境为内部网络且无DNS服务器,可以通过修改客户端的/etc/hosts文件,添加相应的条目。比如:

image-20180711140926370

四、下载 RKE

RKE是一种快速,通用的Kubernetes安装程序,可用于在Linux主机上安装Kubernetes。我们将使用RKE来配置Kubernetes集群并运行Rancher。

1、打开浏览器访问下载文件页面,根据您操作系统类型下载最新版本的RKE:

  • MacOS: rke_darwin-amd64
  • Linux: rke_linux-amd64
  • Windows: rke_windows-amd64.exe

2、通过chmod +x命令给刚下载的RKE二进制文件添加可执行权限。

如果是Windows系统,则跳过这一步.

# MacOS
$ chmod +x rke_darwin-amd64
# Linux
$ chmod +x rke_linux-amd64

3、确认RKE是否是最新版本:

# MacOS
./rke_darwin-amd64 --version
# Linux
./rke_linux-amd64 --version

步骤结果: 您将看到以下内容:

rke version v<N.N.N>

五、下载RKE配置模板

RKE通过 .yml 配置文件来安装和配置Kubernetes集群,有2个模板可供选择,具体取决于使用的SSL证书类型。

  1. 根据您使用的SSL证书类型,选择模板下载:

  2. 重命名模板文件为 rancher-cluster.yml

六、节点配置

获得rancher-cluster.yml配置文件模板后,编辑节点部分以指向Linux主机。

  1. 节点免密登录

    • 第一步:在任意一台Linux主机使用ssh-keygen命令产生公钥私钥对
    ssh-keygen
    • 第二步:通过ssh-copy-id命令将公钥复制到远程机器中
    ssh-copy-id -i .ssh/id_rsa.pub  $user@192.168.x.xxx
  2. 编辑rancher-cluster.yml配置文件

    编辑器打开 rancher-cluster.yml 文件,在nodes配置版块中,修改 IP_ADDRESS_X and USER为您真实的Linux主机IP和用户名,ssh_key_path为第一步生成的私钥文件,如果是在RKE所在主机上生成的公钥私钥对,此配置可保持默认:

        nodes:
        - address: IP_ADDRESS_1
          # THE IP ADDRESS OR HOSTNAME OF THE NODE
          user: USER
          # USER WITH ADMIN ACCESS. USUALLY `root`
          role: [controlplane,etcd,worker]
          ssh_key_path: ~/.ssh/id_rsa
          # PATH TO SSH KEY THAT AUTHENTICATES ON YOUR WORKSTATION
          # USUALLY THE VALUE ABOVE
        - address: IP_ADDRESS_2
          user: USER
          role: [controlplane,etcd,worker]
          ssh_key_path: ~/.ssh/id_rsa
        - address: IP_ADDRESS_3
          user: USER
          role: [controlplane,etcd,worker]
          ssh_key_path: ~/.ssh/id_rsa
        services:
          etcd:
            # rke 0.2之前版本
            snapshot: true
            creation: 6h
            retention: 24h
          # rke 0.2之后版本 (两段配置二选一)
            backup_config:
              enabled: true     # enables recurring etcd snapshots
              interval_hours: 6 # time increment between snapshots
              retention: 60     # time in days before snapshot purge
              # Optional S3
              s3_backup_config:
                access_key: "myaccesskey"
                secret_key:  "myaccesssecret"
                bucket_name: "my-backup-bucket"
                endpoint: "s3.eu-west-1.amazonaws.com"
                region: "eu-west-1"

    注意 1、使用RHEL/CentOS系统时,因为系统安全限制,ssh不能使用root账户。
    2、需要开启API审计日志?
    3、了解RKE配置参数

七、证书配置

出于安全考虑,使用Rancher需要SSL加密。 SSL可以保护所有Rancher网络通信,例如登录或与集群交互时。

如果没有自己的ssl证书,可访问自签名ssl证书一键生成自签名ssl证书。

  1. 方案A — 使用自签名证书

    先决条件: 1.证书必须是PEM格式,PEM只是一种证书类型,并不是说文件必须是PEM为后缀,具体可以查看证书类型
    2.证书必须通过base64加密;
    3.在您的证书文件中,包含链中的所有中间证书;

    kind: Secretname: cattle-keys-ingress中:

    • 替换为CA证书文件的base64编码字符串(通常称为ca.pem或ca.crt)

    注意: base64编码的字符串应该与cacerts.pem在同一行,冒号后有一个空格,在开头,中间或结尾没有任何换行符。

    结果:替换值后,文件应如下所示(base64编码的字符串应该不同):

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: cattle-keys-server
      namespace: cattle-system
    type: Opaque
    data:
        cacerts.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvRENDQVlnQ0NRRHVVWjZuMEZWeU16QU5CZ2txaGtpRzl3MEJBUXNGQURBU01SQXdEZ1lEVlFRRERBZDAKWlhOMExXTmhNQjRYRFRFNE1EVXdOakl4TURRd09Wb1hEVEU0TURjd05USXhNRFF3T1Zvd0VqRVFNQTRHQTFVRQpBd3dIZEdWemRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNQmpBS3dQCndhRUhwQTdaRW1iWWczaTNYNlppVmtGZFJGckJlTmFYTHFPL2R0RUdmWktqYUF0Wm45R1VsckQxZUlUS3UzVHgKOWlGVlV4Mmo1Z0tyWmpwWitCUnFiZ1BNbk5hS1hocmRTdDRtUUN0VFFZdGRYMVFZS0pUbWF5NU45N3FoNTZtWQprMllKRkpOWVhHWlJabkdMUXJQNk04VHZramF0ZnZOdmJ0WmtkY2orYlY3aWhXanp2d2theHRUVjZlUGxuM2p5CnJUeXBBTDliYnlVcHlad3E2MWQvb0Q4VUtwZ2lZM1dOWmN1YnNvSjhxWlRsTnN6UjVadEFJV0tjSE5ZbE93d2oKaG41RE1tSFpwZ0ZGNW14TU52akxPRUc0S0ZRU3laYlV2QzlZRUhLZTUxbGVxa1lmQmtBZWpPY002TnlWQUh1dApuay9DMHpXcGdENkIwbkVDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFHTCtaNkRzK2R4WTZsU2VBClZHSkMvdzE1bHJ2ZXdia1YxN3hvcmlyNEMxVURJSXB6YXdCdFJRSGdSWXVtblVqOGo4T0hFWUFDUEthR3BTVUsKRDVuVWdzV0pMUUV0TDA2eTh6M3A0MDBrSlZFZW9xZlVnYjQrK1JLRVJrWmowWXR3NEN0WHhwOVMzVkd4NmNOQQozZVlqRnRQd2hoYWVEQmdma1hXQWtISXFDcEsrN3RYem9pRGpXbi8walI2VDcrSGlaNEZjZ1AzYnd3K3NjUDIyCjlDQVZ1ZFg4TWpEQ1hTcll0Y0ZINllBanlCSTJjbDhoSkJqa2E3aERpVC9DaFlEZlFFVFZDM3crQjBDYjF1NWcKdE03Z2NGcUw4OVdhMnp5UzdNdXk5bEthUDBvTXl1Ty82Tm1wNjNsVnRHeEZKSFh4WTN6M0lycGxlbTNZQThpTwpmbmlYZXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  2. 方案B—使用权威CA机构颁发的证书

    如果您使用的是权威CA机构颁发的证书,则不需要做任何操作。

八、域名配置

RKE配置文件中有一个<FQDN>引用,编辑配置文件替换<FQDN>:

结果: 替换值后,文件应如下所示(base64编码的字符串应该不同):

apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    namespace: cattle-system
    name: cattle-ingress-http
    annotations:
      nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
      nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"   # Max time in seconds for ws toremain shell window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for ws toremain shell window open
  spec:
    rules:
    - host: demo.rancher.com
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80

九、备份配置文件

保存关闭.yml文件后,将其备份到安全位置。升级Rancher时,您需要再次使用此文件。

十、运行RKE

完成所有配置后,您可以通过运行rke up命令并使用–config参数指定配置文件来完成Rancher 集群的安装。

  1. 下载RKE二进制文档到您的主机,确保 rancher-cluster.yml与下载的rke 在同一目录下;

  2. 打开shell 终端,切换路径到RKE所在的目录;

  3. 根据操作系统类型,选择以下命令并执行:

    # MacOS
    ./rke_darwin-amd64 up --config rancher-cluster.yml
    # Linux
    ./rke_linux-amd64 up --config rancher-cluster.yml

    结果: 应该会有以下日志输出:

    INFO[0000] Building Kubernetes cluster
    INFO[0000] [dialer] Setup tunnel for host [1.1.1.1]
    INFO[0000] [network] Deploying port listener containers
    INFO[0000] [network] Pulling image [alpine:latest] on host [1.1.1.1]
    ...
    INFO[0101] Finished building Kubernetes cluster successfully

十一、备份自动生成的kubectl配置文件

在安装过程中,RKE会自动生成一个kube_config_rancher-cluster.yml与RKE二进制文件位于同一目录中的配置文件。此文件很重要,它可以在Rancher server故障时,利用kubectl通过此配置文件管理Kubernetes集群。复制此文件将其备份到安全位置。

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

如果您没有内部DNS服务器而是通过添加/etc/hosts主机别名的方式指定的Rancher server域名,那么不管通过哪种方式(自定义、导入、Host驱动等)创建K8S集群,K8S集群运行起来之后,因为cattle-cluster-agent Podcattle-node-agent无法通过DNS记录找到Rancher Server URL,最终导致无法通信。

解决方法

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

注意:Local集群中,需要先通过Rancher Server URL访问Rancher Web UI,进行初始化之后cattle-cluster-agent Podcattle-node-agent才会自动部署。

  • 操作步骤
  1. 执行以下命令为Rancher Server容器配置hosts:

    #指定kubectl配置文件
    export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
    
    kubectl --kubeconfig=$kubeconfig -n cattle-system \
        patch deployments rancher --patch '{
            "spec": {
                "template": {
                    "spec": {
                        "hostAliases": [
                            {
                                "hostnames":
                                [
                                    "xxx.cnrancher.com"
                                ],
                                    "ip": "192.168.1.100"
                            }
                        ]
                    }
                }
            }
        }'
  2. 通过Rancher Server URL访问Rancher Web UI,设置用户名密码和Rancher Server URL地址,然后会自动登录Rancher Web UI;

  3. 在Rancher Web UI中依次进入local集群/system项目,在cattle-system命名空间中查看是否有cattle-cluster-agent Podcattle-node-agent被创建。如果有创建则进行下面的步骤,没有创建则等待;

  4. cattle-cluster-agent pod

    export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
    
    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"
                        }
                    ]
                }
            }
        }
    }'
  5. cattle-node-agent pod

    export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
    
    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中的引号。

十三、FAQ和故障排除

FAQ中整理了常见的问题与解决方法。