1 - 四层负载均衡HA部署


重要提示: 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

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

NGINX配置示例:

  1. worker_processes 4;
  2. worker_rlimit_nofile 40000;
  3. events {
  4. worker_connections 8192;
  5. }
  6. http {
  7. server {
  8. listen 80;
  9. return 301 https://$host$request_uri;
  10. }
  11. }
  12. stream {
  13. upstream rancher_servers {
  14. least_conn;
  15. server IP_NODE_1:443 max_fails=3 fail_timeout=5s;
  16. server IP_NODE_2:443 max_fails=3 fail_timeout=5s;
  17. server IP_NODE_3:443 max_fails=3 fail_timeout=5s;
  18. }
  19. server {
  20. listen 443;
  21. proxy_pass rancher_servers;
  22. }
  23. }
  • 保存 nginx.conf ,并复制nginx.conf到负载均衡器节点的/etc/nginx/nginx.conf路径下。

  • 重新加载nginx配置

  1. nginx -s reload

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

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

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

三、配置DNS

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

  • 方案1 - 有DNS服务器
  • 登录DNS服务,创建一条 A 记录指向负载均衡主机IP。

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

nslookup HOSTNAME.DOMAIN.COM

  • 如果解析生效:
  1. nslookup demo.rancher.com
  2. DNS Server: YOUR_HOSTNAME_IP_ADDRESS
  3. DNS Address: YOUR_HOSTNAME_IP_ADDRESS#53
  4. Non-authoritative answer:
  5. Name: demo.rancher.com
  6. Address: <负载均衡IP地址>
  • 如果解析不生效
  1. nslookup demo.rancher.com
  2. DNS Server: YOUR_HOSTNAME_IP_ADDRESS
  3. DNS Address: YOUR_HOSTNAME_IP_ADDRESS#53
  4. ** server can't find demo.rancher.com: NXDOMAIN
  • 方案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.exe2、通过chmod +x命令给刚下载的RKE二进制文件添加可执行权限。

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

  1. # MacOS
  2. $ chmod +x rke_darwin-amd64
  3. # Linux
  4. $ chmod +x rke_linux-amd64

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

  1. # MacOS
  2. ./rke_darwin-amd64 --version
  3. # Linux
  4. ./rke_linux-amd64 --version

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

  1. rke version v<N.N.N>

五、下载RKE配置模板

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

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

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

六、节点配置

1、节点免密登录

  • 第一步:在任意一台Linux主机使用ssh-keygen命令产生公钥私钥对
  1. ssh-keygen
  • 第二步:通过ssh-copy-id命令将公钥复制到远程机器中
  1. 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所在主机上生成的公钥私钥对,此配置可保持默认:

  1. nodes:
  2. - address: `IP_ADDRESS_1`
  3. user: `USER`
  4. role: [controlplane,etcd,worker]
  5. ssh_key_path: ~/.ssh/id_rsa
  6. - address: `IP_ADDRESS_2`
  7. user: `USER`
  8. role: [controlplane,etcd,worker]
  9. ssh_key_path: ~/.ssh/id_rsa
  10. - address: `IP_ADDRESS_3`
  11. user: `USER`
  12. role: [controlplane,etcd,worker]
  13. ssh_key_path: ~/.ssh/id_rsa
  14. services:
  15. etcd:
  16. # rke 0.2之前版本
  17. snapshot: true
  18. creation: 6h
  19. retention: 24h
  20. # rke 0.2之后版本 (两段配置二选一)
  21. backup_config:
  22. enabled: true # enables recurring etcd snapshots
  23. interval_hours: 6 # time increment between snapshots
  24. retention: 60 # time in days before snapshot purge
  25. # Optional S3
  26. s3_backup_config:
  27. access_key: "myaccesskey"
  28. secret_key: "myaccesssecret"
  29. bucket_name: "my-backup-bucket"
  30. endpoint: "s3.eu-west-1.amazonaws.com"
  31. 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.在您的证书文件中,包含链中的所有中间证书;

  • kind: Secretname: cattle-keys-ingress中:

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

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

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

  1. ---
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: cattle-keys-ingress
  6. namespace: cattle-system
  7. type: Opaque
  8. data:
  9. tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1RENDQWN5Z0F3SUJBZ0lKQUlHc25NeG1LeGxLTUEwR0
  10. tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdEY3WEN6TVZHaDF1aU5oWTBJZW
  • kind: Secretname: cattle-keys-server中, 替换为CA证书文件的base64加密字符串(通常称为ca.pem或ca.crt)。

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

结果: 该文件修改后应如下所示(base64编码的字符串应该不同):

  1. ---
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: cattle-keys-server
  6. namespace: cattle-system
  7. type: Opaque
  8. data:
  9. cacerts.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvRENDQVlnQ0NRRHVVWjZuMEZWeU
  • 方案B — 使用权威CA机构颁发的SSL证书

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

  • kind: Secretname: cattle-keys-ingress中:

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

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

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

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

  1. ---
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: cattle-keys-ingress
  6. namespace: cattle-system
  7. type: Opaque
  8. data:
  9. tls.crt:
  10. tls.key:

八、域名配置

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

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

  1. ---
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. namespace: cattle-system
  6. name: cattle-ingress-http
  7. annotations:
  8. nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
  9. nginx.ingress.kubernetes.io/proxy-read-timeout: "1800" # Max time in seconds for w to remain shell window open
  10. nginx.ingress.kubernetes.io/proxy-send-timeout: "1800" # Max time in seconds for w to remain shell window open
  11. spec:
  12. rules:
  13. - host: demo.rancher.com
  14. http:
  15. paths:
  16. - backend:
  17. serviceName: cattle-service
  18. servicePort: 80
  19. tls:
  20. - secretName: cattle-keys-ingress
  21. hosts:
  22. - demo.rancher.com

九、备份配置文件

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

十、运行RKE

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

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

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

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

  1. # MacOS
  2. ./rke_darwin-amd64 up --config rancher-cluster.yml
  3. # Linux
  4. ./rke_linux-amd64 up --config rancher-cluster.yml

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

  1. INFO[0000] Building Kubernetes cluster
  2. INFO[0000] [dialer] Setup tunnel for host [1.1.1.1]
  3. INFO[0000] [network] Deploying port listener containers
  4. INFO[0000] [network] Pulling image [alpine:latest] on host [1.1.1.1]
  5. ...
  6. 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,最终导致无法通信。

解决方法

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

  • cattle-cluster-agent pod
  1. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  2. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  3. patch deployments cattle-cluster-agent --patch '{
  4. "spec": {
  5. "template": {
  6. "spec": {
  7. "hostAliases": [
  8. {
  9. "hostnames":
  10. [
  11. "demo.cnrancher.com"
  12. ],
  13. "ip": "192.168.1.100"
  14. }
  15. ]
  16. }
  17. }
  18. }
  19. }'
  • cattle-node-agent pod
  1. export kubeconfig=xxx/xxx/xx.kubeconfig.yaml
  2. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  3. patch daemonsets cattle-node-agent --patch '{
  4. "spec": {
  5. "template": {
  6. "spec": {
  7. "hostAliases": [
  8. {
  9. "hostnames":
  10. [
  11. "xxx.rancher.com"
  12. ],
  13. "ip": "192.168.1.100"
  14. }
  15. ]
  16. }
  17. }
  18. }
  19. }'

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

十三、FAQ和故障排除

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