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

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

一、架构说明

Rancher HA

一、Linux主机要求

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

我们将使用NGINX作为第4层负载均衡器(TCP)。NGINX会将所有连接转发到您的Rancher节点之一。如果要使用Amazon NLB,可以跳过此步骤并使用Amazon NLB configuration配置。

注意: 在此配置中,负载平衡器位于Rancher节点的前面,负载均衡器可以是任意能够运行NGINX的主机。不要使用任意一个Rancher节点作为负载均衡器节点,会出现端口冲突。

1、安装nginx

首先在负载均衡器主机上安装NGINX,NGINX具有适用于所有已知操作系统的软件包。有关安装NGINX的帮助,请查阅其安装文档nginx安装文档.

2、创建NGINX配置

安装NGINX后,您需要使用节点的IP地址更新NGINX配置文件nginx.conf

  1. 复制下面的代码到文本编辑器,保存为nginx.conf
  2. nginx.conf配置中, 替换IP_NODE_1IP_NODE_2IP_NODE_3 为您主机真实的IP地址。

    NGINX配置示例:

    worker_processes 4;
    worker_rlimit_nofile 40000;
    
    events {
        worker_connections 8192;
    }
    http {
        server {
            listen         80;
            return 301 https://$host$request_uri;
        }
    }
    stream {
        upstream rancher_servers {
            least_conn;
            server IP_NODE_1:443 max_fails=3 fail_timeout=5s;
            server IP_NODE_2:443 max_fails=3 fail_timeout=5s;
            server IP_NODE_3:443 max_fails=3 fail_timeout=5s;
        }
        server {
            listen     443;
            proxy_pass rancher_servers;
        }
    }
  3. 保存 nginx.conf ,并复制nginx.conf到负载均衡器节点的/etc/nginx/nginx.conf路径下。

  4. 重新加载nginx配置

    nginx -s reload

3、可选 - 以容器运行nginx服务

我们可以以容器的形式运行nginx服务,而不需要把它安装在宿主机上。将编辑好的NGINX示例配置文件保存到/etc/nginx.conf,并运行以下命令来启动NGINX容器:

docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  -v /etc/nginx.conf:/etc/nginx/nginx.conf \
  nginx:1.14

三、配置DNS

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

  • 方案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#53
      
      ** server can't find demo.rancher.com: NXDOMAIN
  • 方案2 - 无DNS服务器
  1. 如果环境为内部网络且无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

六、节点配置

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`
    user: `USER`
    role: [controlplane,etcd,worker]
    ssh_key_path: ~/.ssh/id_rsa
  - 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证书。

  • 方案A — 使用自签名证书

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

  1. kind: Secretname: cattle-keys-ingress中:

    • 替换 <BASE64_CRT> 为证书文件经过base64加密的字符串(证书文件通常名为 cert.pemdomain.crt)
    • 替换 <BASE64_KEY> 为证书密钥文件经过base64加密的字符串(通过证书密钥文件名为key.pemdomain.key)

    注意: base64编码的字符串应与tls.crtor&tls.key在同一行,并且在开头,冒号后有一个空格,中间或末尾没有任何换行符。

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

    ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: cattle-keys-ingress
        namespace: cattle-system
      type: Opaque
      data:
        tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1RENDQWN5Z0F3SUJBZ0lKQUlHc25NeG1LeGxLTUEwR0
        tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdEY3WEN6TVZHaDF1aU5oWTBJZW
  2. kind: Secretname: cattle-keys-server中, 替换为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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvRENDQVlnQ0NRRHVVWjZuMEZWeU
  • 方案B — 使用权威CA机构颁发的SSL证书

    如果您使用的是由权威CA机构颁发的SSL证书,则需要为证书文件和证书密钥文件生成base64编码的字符串(确保您的证书文件包含链中的所有中间证书)。在这种情况下,证书的顺序首先是您自己的证书,然后是中间证书。请查阅CSP(证书服务提供商)的文档,了解需要包含哪些中间证书。

  1. kind: Secretname: cattle-keys-ingress中:

    • 替换<BASE64_CRT>为证书文件的base64加密字符串(通常称为cert.pemdomain.crt);

    • 替换<BASE64_CRT>为证书文件的base64加密字符串(通常称为cert.pemdomain.crt);

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

    注意: base64编码的字符串应与tls.crtor 在同一行tls.key,冒号后有一个空格,并且在开头,中间或末尾没有任何换行符。

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: cattle-keys-ingress
      namespace: cattle-system
    type: Opaque
    data:
      tls.crt:
      tls.key:

八、域名配置

配置文件中有两个引用了<FQDN>,一个是在spec\rules\host处,tls\hosts处。

kind: Ingressname: cattle-ingress-http中,替换 <FQDN>为预先准备的域名,替换后应为如下显示:

 ---
  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 w  to remain shell        window open
      nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"   # Max time in seconds for w  to remain shell        window open
  spec:
    rules:
    - host: demo.rancher.com
      http:
        paths:
        - backend:
            serviceName: cattle-service
            servicePort: 80
    tls:
    - secretName: cattle-keys-ingress
      hosts:
      - demo.rancher.com

九、备份配置文件

保存关闭.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地址可以互通)

  • 操作步骤
  1. cattle-cluster-agent Podcattle-node-agent需要在LOCAL集群初始化之后才会部署,所以先通过Rancher Server URL访问Rancher Web UI进行初始化。
  2. 执行以下命令为Rancher Server容器配置hosts:

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

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

  5. 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"
                        }
                    ]
                }
            }
        }
    }'
  6. 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中的引号。

十三、FAQ和故障排除

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