2 - 七层负载均衡HA部署


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

    一、Linux主机要求

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

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

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

    • WebSocket 连接
    • SPDY/HTTP/2协议
    • 传递/设置以下headers:

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

    三、配置DNS

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

    • 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#5
    4. ** server can't find demo.rancher.com: NXDOMAIN

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

    image-20180711140926370

    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二进制文件添加可执行权限。
    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

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

    五、下载RKE配置模板

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

    六、节点配置

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

    • 节点免密登录

    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. # USUALLY THE VALUE ABOVE
    9. - address: IP_ADDRESS_2
    10. user: USER
    11. role: [controlplane,etcd,worker]
    12. ssh_key_path: ~/.ssh/id_rsa
    13. - address: IP_ADDRESS_3
    14. user: USER
    15. role: [controlplane,etcd,worker]
    16. ssh_key_path: ~/.ssh/id_rsa
    17. services:
    18. etcd:
    19. # rke 0.2之前版本
    20. snapshot: true
    21. creation: 6h
    22. retention: 24h
    23. # rke 0.2之后版本 (两段配置二选一)
    24. backup_config:
    25. enabled: true # enables recurring etcd snapshots
    26. interval_hours: 6 # time increment between snapshots
    27. retention: 60 # time in days before snapshot purge
    28. # Optional S3
    29. s3_backup_config:
    30. access_key: "myaccesskey"
    31. secret_key: "myaccesssecret"
    32. bucket_name: "my-backup-bucket"
    33. endpoint: "s3.eu-west-1.amazonaws.com"
    34. region: "eu-west-1"

    七、证书配置

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

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

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

    kind: Secretname: cattle-keys-ingress中:

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

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

    • 方案B—使用权威CA机构颁发的证书

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

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

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

    1. apiVersion: extensions/v1beta1
    2. kind: Ingress
    3. metadata:
    4. namespace: cattle-system
    5. annotations:
    6. nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
    7. nginx.ingress.kubernetes.io/proxy-read-timeout: "1800" # Max time in seconds for ws toremain shell window open
    8. nginx.ingress.kubernetes.io/proxy-send-timeout: "1800" # Max time in seconds for ws toremain shell window open
    9. spec:
    10. - host: demo.rancher.com
    11. http:
    12. paths:
    13. - backend:
    14. serviceName: cattle-service
    15. 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集群。复制此文件将其备份到安全位置。

    如果您没有内部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
    • 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. }

    十三、FAQ和故障排除

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