2 - 七层负载均衡HA部署


重要提示:

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:
    HeaderValue描述
    Host传递给Rancher的主机名识别客户端请求的主机名。
    X-Forwarded-Protohttps识别客户端用于连接负载均衡器的协议。注意:如果存在此标头,rancher/rancher不会将HTTP重定向到HTTPS。
    X-Forwarded-PortPort used to reach Rancher.识别客户端用于连接负载均衡器的端口。
    X-Forwarded-ForIP of the client connection.识别客户端的原始IP地址。

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

三、配置DNS

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

1、方案1 - 有DNS服务器

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

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

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#5
  4. ** 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.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证书类型。

六、节点配置

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

  • 节点免密登录

    • 第一步:在任意一台Linux主机使用ssh-keygen命令产生公钥私钥对
  1. ssh-keygen
  • 第二步:通过ssh-copy-id命令将公钥复制到远程机器中
  1. ssh-copy-id -i .ssh/id_rsa.pub $user@192.168.x.xxx
  • 编辑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. # THE IP ADDRESS OR HOSTNAME OF THE NODE
  4. user: USER
  5. # USER WITH ADMIN ACCESS. USUALLY `root`
  6. role: [controlplane,etcd,worker]
  7. ssh_key_path: ~/.ssh/id_rsa
  8. # PATH TO SSH KEY THAT AUTHENTICATES ON YOUR WORKSTATION
  9. # USUALLY THE VALUE ABOVE
  10. - address: IP_ADDRESS_2
  11. user: USER
  12. role: [controlplane,etcd,worker]
  13. ssh_key_path: ~/.ssh/id_rsa
  14. - address: IP_ADDRESS_3
  15. user: USER
  16. role: [controlplane,etcd,worker]
  17. ssh_key_path: ~/.ssh/id_rsa
  18. services:
  19. etcd:
  20. # rke 0.2之前版本
  21. snapshot: true
  22. creation: 6h
  23. retention: 24h
  24. # rke 0.2之后版本 (两段配置二选一)
  25. backup_config:
  26. enabled: true # enables recurring etcd snapshots
  27. interval_hours: 6 # time increment between snapshots
  28. retention: 60 # time in days before snapshot purge
  29. # Optional S3
  30. s3_backup_config:
  31. access_key: "myaccesskey"
  32. secret_key: "myaccesssecret"
  33. bucket_name: "my-backup-bucket"
  34. endpoint: "s3.eu-west-1.amazonaws.com"
  35. 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中:

  • 替换为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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNvRENDQVlnQ0NRRHVVWjZuMEZWeU16QU5CZ2txaGtpRzl3MEJBUXNGQURBU01SQXdEZ1lEVlFRRERBZDAKWlhOMExXTmhNQjRYRFRFNE1EVXdOakl4TURRd09Wb1hEVEU0TURjd05USXhNRFF3T1Zvd0VqRVFNQTRHQTFVRQpBd3dIZEdWemRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNQmpBS3dQCndhRUhwQTdaRW1iWWczaTNYNlppVmtGZFJGckJlTmFYTHFPL2R0RUdmWktqYUF0Wm45R1VsckQxZUlUS3UzVHgKOWlGVlV4Mmo1Z0tyWmpwWitCUnFiZ1BNbk5hS1hocmRTdDRtUUN0VFFZdGRYMVFZS0pUbWF5NU45N3FoNTZtWQprMllKRkpOWVhHWlJabkdMUXJQNk04VHZramF0ZnZOdmJ0WmtkY2orYlY3aWhXanp2d2theHRUVjZlUGxuM2p5CnJUeXBBTDliYnlVcHlad3E2MWQvb0Q4VUtwZ2lZM1dOWmN1YnNvSjhxWlRsTnN6UjVadEFJV0tjSE5ZbE93d2oKaG41RE1tSFpwZ0ZGNW14TU52akxPRUc0S0ZRU3laYlV2QzlZRUhLZTUxbGVxa1lmQmtBZWpPY002TnlWQUh1dApuay9DMHpXcGdENkIwbkVDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFHTCtaNkRzK2R4WTZsU2VBClZHSkMvdzE1bHJ2ZXdia1YxN3hvcmlyNEMxVURJSXB6YXdCdFJRSGdSWXVtblVqOGo4T0hFWUFDUEthR3BTVUsKRDVuVWdzV0pMUUV0TDA2eTh6M3A0MDBrSlZFZW9xZlVnYjQrK1JLRVJrWmowWXR3NEN0WHhwOVMzVkd4NmNOQQozZVlqRnRQd2hoYWVEQmdma1hXQWtISXFDcEsrN3RYem9pRGpXbi8walI2VDcrSGlaNEZjZ1AzYnd3K3NjUDIyCjlDQVZ1ZFg4TWpEQ1hTcll0Y0ZINllBanlCSTJjbDhoSkJqa2E3aERpVC9DaFlEZlFFVFZDM3crQjBDYjF1NWcKdE03Z2NGcUw4OVdhMnp5UzdNdXk5bEthUDBvTXl1Ty82Tm1wNjNsVnRHeEZKSFh4WTN6M0lycGxlbTNZQThpTwpmbmlYZXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  • 方案B—使用权威CA机构颁发的证书

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

八、域名配置

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

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

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

九、备份配置文件

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

十、运行RKE

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

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

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

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

  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中整理了常见的问题与解决方法。