Rancher HA 高可用安装步骤

一时失言乱红尘 2021-11-13 22:20 908阅读 0赞

完整内容参考:High Availability (HA) Install

本文对关键步骤进行记录(翻译)。
本文使用的 CentOS Linux release 7.6.1810,部分内容可能和具体系统有关。
命令行特别说明:虽然文中命令行开头都是 $,实际上用 root 账号是 #,由于 # 在这里被当作注释,因此文中使用的 $

开始看本文前,最好先看看节点 配置要求,满足要求的情况下在继续往下看,避免浪费不必要的时间。

对于生产环境,我们建议在高可用性配置中安装Rancher,以便您的用户群始终可以访问Rancher Server。当安装在Kubernetes集群中时,Rancher将与集群的etcd数据库集成,并利用Kubernetes调度实现高可用性。

此过程将指导您使用RKE设置3节点集群并使用Helm程序包管理器安装Rancher chart。

重要提示:
在托管的Kubernetes解决方案(如亚马逊的EKS或Google的GKE)之上运行Rancher是不受支持的,也不是一般的好主意。这些托管的Kubernetes解决方案不会将etcd暴露给Rancher可管理的程度,并且它们的自定义可能会干扰Rancher操作。强烈建议使用EC2或GCE等托管基础架构。

重要提示:
为获得最佳性能,我们建议将此Kubernetes集群专用于运行Rancher。设置运行Rancher的Kubernetes集群后,您可以创建或导入集群以运行工作负载。

重要提示:
2.2 中运行 rke 是会提示:If you are using RedHat/CentOS, you can’t use the user root. Please refer to the documentation for more instructions. Error: ssh: rejected: administratively prohibited (open failed)
因此在使用 RedHat/CentOS 时,需要提供账号用于 docker 操作,本文后续有介绍。

1. 必备工具

此安装需要以下CLI工具。请确保您的这些工具已安装并可用 $PATH

  1. kubectl - Kubernetes命令行工具。
  2. rke - Rancher Kubernetes Engine,cli用于构建Kubernetes集群。
  3. helm - Kubernetes的包管理。

1.1 安装 kubectl

国内直接使用阿里巴巴开源镜像站安装:

https://opsx.alibaba.com/mirror

从列表找到 kubernetes,点击帮助,显示如下信息。

重要提示:
可以从安裝列表去掉 kubeadm、kubelet,只安装 kubectl

Debian / Ubuntu

  1. apt-get update && apt-get install -y apt-transport-https
  2. curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
  3. cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
  4. deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
  5. EOF
  6. apt-get update
  7. apt-get install -y kubectl

CentOS / RHEL / Fedora

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF
  10. setenforce 0
  11. yum install -y kubectl

1.2 安装 rke

下载RKE二进制文件
在您的工作站上,打开Web浏览器并导航到我们的RKE版本页面。下载适用于您的操作系统和体系结构的最新RKE安装程序:

  • MacOS:rke_darwin-amd64
  • Linux(Intel / AMD):rke_linux-amd64
  • Linux(ARM 32位):rke_linux-arm
  • Linux(ARM 64位):rke_linux-arm64
  • Windows(32位):rke_windows-386.exe
  • Windows(64位):rke_windows-amd64.exe

将RKE二进制文件复制到您的文件夹中$PATH并重命名 rke(或 rke.exe 用于 Windows)。

  1. # MacOS
  2. $ mv rke_darwin-amd64 rke
  3. # 增加可执行权限
  4. $ chmod +x rke
  5. # Linux
  6. $ mv rke_linux-amd64 rke
  7. # 增加可执行权限
  8. $ chmod +x rke
  9. # Windows PowerShell
  10. > mv rke_windows-amd64.exe rke.exe

验证安装:

  1. $ rke --version
  2. # 输出类似下面版本信息
  3. rke version v0.2.6

1.3 安装 Helm

重要提示:
由于Helm v2.12.0和cert-manager存在问题,请使用Helm v2.12.1或更高版本。

和 rke 类似,从 Releases 页面下载合适的二进制版本:

  • MacOS amd64
  • Linux amd64
  • Linux arm
  • Linux arm64
  • Linux i386
  • Linux ppc64le
  • Linux s390x
  • Windows amd64

下载后解压(tar -zxvf helm-v2.0.0-linux-amd64.tgz),然后将 helm 程序放到 $PATH 中(mv linux-amd64/helm /usr/bin/helm)。

验证安装:

  1. $ helm version
  2. # 输出类似下面信息
  3. Client: &version.Version{ SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
  4. Error: Get http://localhost:8080/api/v1/namespaces/kube-system/pods?labelSelector=app%3Dhelm%2Cname%3Dtiller: dial tcp [::1]:8080: connect: connection refused

2. 安装步骤

  1. 创建节点和负载均衡器
  2. 使用RKE安装Kubernetes
  3. 初始化Helm(tiller)
  4. 安装Rancher

2.1 创建节点和负载均衡器

先看节点 配置要求。
满足配置要求的情况下,需要配置负载均衡器
在这里插入图片描述

负载均衡器

RKE将在每个节点上配置Ingress控制器窗格。Ingress控制器pod绑定到主机网络上的端口TCP/80和TCP/443,并且是到Rancher服务器的HTTPS流量的入口点。

将负载均衡器配置为第4层TCP转发器。具体配置将根据您的环境而有所不同。这里只介绍 Nginx。

NGINX将配置为第4层负载均衡器(TCP),它可以将连接转发到您的Rancher节点之一。

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

首先在要用作负载均衡器的节点上安装NGINX。NGINX提供适用于所有已知操作系统的软件包。测试的版本是1.14和1.15。有关安装NGINX的帮助,请参阅其安装文档。

stream模块是必需的,在使用官方NGINX包时会出现。有关如何在操作系统上安装和启用NGINX stream模块的信息,请参阅操作系统文档。

stream 相关资料:http://nginx.org/en/docs/stream/ngx_stream_core_module.html
自己编译请看这里:https://blog.csdn.net/jijiuqiu6646/article/details/78675891

创建NGINX配置

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

  1. 将下面的代码示例复制并粘贴到您喜欢的文本编辑器中。保存为nginx.conf
  2. 从nginx.conf,更换两个OCCURENCES(端口80和443)<IP_NODE_1><IP_NODE_2><IP_NODE_3>与你的IP地址的节点。

    注意:
    请参阅NGINX文档:TCP和UDP负载平衡的所有配置选项的。

    示例NGINX配置

    1. worker_processes 4;
    2. worker_rlimit_nofile 40000;
    3. events {
    4. worker_connections 8192;
    5. }
    6. stream {
    7. upstream rancher_servers_http {
    8. least_conn;
    9. server <IP_NODE_1>:80 max_fails=3 fail_timeout=5s;
    10. server <IP_NODE_2>:80 max_fails=3 fail_timeout=5s;
    11. server <IP_NODE_3>:80 max_fails=3 fail_timeout=5s;
    12. }
    13. server {
    14. listen 80;
    15. proxy_pass rancher_servers_http;
    16. }
    17. upstream rancher_servers_https {
    18. least_conn;
    19. server <IP_NODE_1>:443 max_fails=3 fail_timeout=5s;
    20. server <IP_NODE_2>:443 max_fails=3 fail_timeout=5s;
    21. server <IP_NODE_3>:443 max_fails=3 fail_timeout=5s;
    22. }
    23. server {
    24. listen 443;
    25. proxy_pass rancher_servers_https;
    26. }
    27. }
  3. 保存 nginx.conf/etc/nginx/nginx.conf
  4. 刷新 NGINX 配置 nginx -s reload

另一种选择:将NGINX作为Docker容器运行

您可以将其作为Docker容器运行,而不是将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

PS:负载均衡有很多方式,这一层有很多可替换的选项,而且为了解决负载均衡层的单点故障,还要考虑配置 Keepalived 等。

2.2 使用RKE安装Kubernetes

使用RKE安装高可用etcd配置的Kubernetes。

注意:
对于不能访问Internet的系统,请参阅Air Gap:High Availability Install以获取详细的安装信息。

创建 rancher-cluster.yml 配置文件

参考下面的示例创建rancher-cluster.yml文件,替换 nodes 3个节点的配置信息。

注意:
如果您的节点有公共(外网?)地址和内部(内网?)地址,建议设置 internal_address,以便Kubernetes将其用于集群内通信。某些服务(如AWS EC2)如果要使用自引用安全组或防火墙需要设置internal_address

  1. nodes:
  2. - address: 165.227.114.63
  3. internal_address: 172.16.22.12
  4. user: ubuntu
  5. role: [controlplane,worker,etcd]
  6. - address: 165.227.116.167
  7. internal_address: 172.16.32.37
  8. user: ubuntu
  9. role: [controlplane,worker,etcd]
  10. - address: 165.227.127.226
  11. internal_address: 172.16.42.73
  12. user: ubuntu
  13. role: [controlplane,worker,etcd]
  14. services:
  15. etcd:
  16. snapshot: true
  17. creation: 6h
  18. retention: 24h

重要提示!
如果你也使用的 RedHat/CentOS,在开篇已经提醒过,不能使用 root 账号,因此要添加专用的账号进行 docker 操作。
需要在每个节点重复该操作添加账号
创建 rancher 用户:useradd rancher
添加到 docker 组:usermod -aG docker rancher

常见的RKE节点选项




































Option Required Description
address yes 公共DNS或IP地址
user yes 可以运行docker命令的用户
role yes 分配给节点的Kubernetes角色列表
internal_address no 内部集群流量的私有DNS或IP地址
ssh_key_path no 用于对节点进行身份验证的SSH私钥的路径(默认为~/.ssh/id_rsa

特别注意!特别注意!特别注意!
看到这里的 ssh_key_path 以及说明了吗,在继续往下进行前,我们需要先配置节点间的 ssh_key 登录,rke 在运行时需要登陆到对应节点去执行,所以运行 rke 的节点必须能通过 ssh_key 登录 所有(3个) 节点。

配置 ssh_key 登录

假设分别为 NODE1, NODE2, NODE3 3个节点。

分别在每个节点上执行下面的命令生成密钥(我使用的 root 账号):

  1. $ ssh-keygen -t rsa
  2. # 之后会有一些默认选项和可以手工配置的选项,可以自行配制,或者一直回车用默认值
  3. # 执行完成后,会生成两个文件
  4. Your identification has been saved in /root/.ssh/id_rsa.
  5. Your public key has been saved in /root/.ssh/id_rsa.pub.

查看 id_rsa.pub 文件,复制文件内容,将 3 个节点的文件集合到一起,在每个节点上,切换到 rancher 用户,然后执行下面的命令:

  1. # 切换到前面创建的用户
  2. $ su rancher
  3. # 进入自己的 home 目录
  4. $ cd ~
  5. # 创建 .ssh 目录
  6. $ mkdir .ssh
  7. # 写入3个服务的公钥
  8. $ echo "复制的内容" >> .ssh/authorized_keys
  9. # 设置权限
  10. $ chmod 700 .ssh
  11. $ chmod 644 .ssh/authorized_keys

配置后可以在 NODE1 测试:

  1. $ ssh rancher@NODE2
  2. # 连接成功后通过 exit 退出

特别注意!
两个潜在的坑,ssh配置authorized_keys后仍然需要输入密码的问题

  1. 注意$HOME/.ssh目录 或 $HOME目录的权限 最好是700,我就在这里栽跟头了。
  2. 注意uthorized_keys的权限 chmod 644 authorized_keys 这个也是要注意的。

高级配置

RKE有许多配置选项可用于自定义安装以适合您的特定环境。

有关选项和功能的完整列表,请参阅RKE文档。

要为更大的Rancher安装调整您的etcd集群,请参阅etcd设置指南。

运行 RKE

到这一步运行时遇到了很多的坑,这些坑都已经补充到前面的各个步骤和特别提醒中了。

根据自己的配置修改保存好 rancher-cluster.yml 后,执行下面的命令:

  1. rke up --config ./rancher-cluster.yml

该命令根据网速等多种情况,需要等待很久。这期间输出的部分日志如下:

  1. [root@localhost ~]# rke up --config ./rancher-cluster.yml
  2. INFO[0000] Initiating Kubernetes cluster
  3. INFO[0000] [certificates] Generating admin certificates and kubeconfig
  4. INFO[0000] Successfully Deployed state file at [./rancher-cluster.rkestate]
  5. INFO[0000] Building Kubernetes cluster
  6. INFO[0000] [dialer] Setup tunnel for host [10.10.1.242]
  7. INFO[0000] [dialer] Setup tunnel for host [10.10.1.241]
  8. INFO[0000] [dialer] Setup tunnel for host [10.10.1.238]
  9. INFO[0000] [network] Deploying port listener containers
  10. INFO[0000] [network] Pulling image [rancher/rke-tools:v0.1.34] on host [10.10.1.238]
  11. INFO[0000] [network] Pulling image [rancher/rke-tools:v0.1.34] on host [10.10.1.241]
  12. INFO[0000] [network] Pulling image [rancher/rke-tools:v0.1.34] on host [10.10.1.242]
  13. INFO[0030] [network] Successfully pulled image [rancher/rke-tools:v0.1.34] on host [10.10.1.241]

主要时间都花在了下载镜像上,而且(猜测)三个节点可能是分别下载。下载的 3 个镜像如下:

  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. rancher/rke-tools v0.1.34 39bce5e7ca0b 5 weeks ago 133MB
  3. rancher/hyperkube v1.14.3-rancher1 6bfed920059c 7 weeks ago 1.05GB
  4. rancher/coreos-etcd v3.3.10-rancher1 643c21638c1c 9 months ago 39.5MB

第一次执行完成后,输出了一行错误:
在这里插入图片描述

FATA[0461] [etcd] Failed to bring up Etcd Plane: [etcd] Etcd Cluster is not healthy

此时如果去节点查看 etcd 的日志,可能有类似日志:

  1. "remote error: tls: bad certificate", ServerName ""

更详细的原因我没找到,但是通过清理节点重新安装是有效的。

对我来说,很可能是第一次运行 rke up 时出错中断导致的。

清理节点的命令来自看 这里。这里也抄一遍:

  1. # 停止服务
  2. systemctl disable kubelet.service
  3. systemctl disable kube-scheduler.service
  4. systemctl disable kube-proxy.service
  5. systemctl disable kube-controller-manager.service
  6. systemctl disable kube-apiserver.service
  7. systemctl stop kubelet.service
  8. systemctl stop kube-scheduler.service
  9. systemctl stop kube-proxy.service
  10. systemctl stop kube-controller-manager.service
  11. systemctl stop kube-apiserver.service
  12. # 删除所有容器
  13. docker rm -f $(docker ps -qa)
  14. # 删除所有容器卷
  15. docker volume rm $(docker volume ls -q)
  16. # 卸载mount目录
  17. for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done
  18. # 备份目录
  19. mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
  20. mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
  21. mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
  22. mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")
  23. # 删除残留路径
  24. rm -rf /etc/ceph \
  25. /etc/cni \
  26. /opt/cni \
  27. /run/secrets/kubernetes.io \
  28. /run/calico \
  29. /run/flannel \
  30. /var/lib/calico \
  31. /var/lib/cni \
  32. /var/lib/kubelet \
  33. /var/log/containers \
  34. /var/log/pods \
  35. /var/run/calico
  36. # 清理网络接口
  37. network_interface=`ls /sys/class/net`
  38. for net_inter in $network_interface;
  39. do
  40. if ! echo $net_inter | grep -qiE 'lo|docker0|eth*|ens*';then
  41. ip link delete $net_inter
  42. fi
  43. done
  44. # 清理残留进程
  45. port_list=`80 443 6443 2376 2379 2380 8472 9099 10250 10254`
  46. for port in $port_list
  47. do
  48. pid=`netstat -atlnup|grep $port |awk '{print $7}'|awk -F '/' '{print $1}'|grep -v -|sort -rnk2|uniq`
  49. if [[ -n $pid ]];then
  50. kill -9 $pid
  51. fi
  52. done
  53. pro_pid=`ps -ef |grep -v grep |grep kube|awk '{print $2}'`
  54. if [[ -n $pro_pid ]];then
  55. kill -9 $pro_pid
  56. fi
  57. # 清理Iptables表
  58. ## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
  59. sudo iptables --flush
  60. sudo iptables --flush --table nat
  61. sudo iptables --flush --table filter
  62. sudo iptables --table nat --delete-chain
  63. sudo iptables --table filter --delete-chain
  64. systemctl restart docker

经历一番风波后,终于完成了。
在这里插入图片描述

测试集群

集群创建成功后,在当前目录下面有以下文件:

  1. -rw-r----- 1 root root 5382 Aug 1 16:17 kube_config_rancher-cluster.yml
  2. -rw-r----- 1 root root 114422 Aug 1 16:18 rancher-cluster.rkestate
  3. -rw-r--r-- 1 root root 423 Aug 1 15:50 rancher-cluster.yml

RKE 自动创建了一个 kube_config_rancher-cluster.yml,这个文件有 kubectlhelm 的凭据。

注意:
如果您使用了不同的文件名 rancher-cluster.yml,则 kube 配置文件将命名为 kube_config_<FILE_NAME>.yml

kube_config_rancher-cluster.yml 复制到 $HOME/.kube/config,如果想在其他节点通过 kubectl 访问集群,将该文件复制到其他节点的相同路径下。

如果你有多个 Kubernetes 集群,还需要设置 KUBECONFIG 环境变量。设置如下:
export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

现在可以通过 kubectl 来查看当前的节点状态:

  1. $ kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. 10.10.1.238 Ready controlplane,etcd,worker 16m v1.14.3
  4. 10.10.1.241 Ready controlplane,etcd,worker 16m v1.14.3
  5. 10.10.1.242 Ready controlplane,etcd,worker 16m v1.14.3

检查集群 Pods 运行状况

检查所有必需的Pod和容器是否健康可以继续。

  • Pod处于Running或Completed状态。
  • READY列显示所有容器正在运行(如 3/3)的 Pod 状态是 Running
  • Pod 状态为Completed是一次运行的Job。这些Pod 的READY应该是0/1

    $ kubectl get pods —all-namespaces
    NAMESPACE NAME READY STATUS RESTARTS AGE
    ingress-nginx default-http-backend-5954bd5d8c-9c2cg 1/1 Running 0 19m
    ingress-nginx nginx-ingress-controller-6zvql 1/1 Running 0 19m
    ingress-nginx nginx-ingress-controller-7qjms 1/1 Running 0 19m
    ingress-nginx nginx-ingress-controller-8r2xs 1/1 Running 0 19m
    kube-system canal-mx6p6 2/2 Running 0 19m
    kube-system canal-r7prj 2/2 Running 0 19m
    kube-system canal-xddff 2/2 Running 0 19m
    kube-system coredns-86bc4b7c96-gmzd6 1/1 Running 0 19m
    kube-system coredns-autoscaler-5d5d49b8ff-rj8qj 1/1 Running 0 19m
    kube-system metrics-server-7f6bd4c888-mkshr 1/1 Running 0 19m
    kube-system rke-coredns-addon-deploy-job-9jqns 0/1 Completed 0 19m
    kube-system rke-ingress-controller-deploy-job-m8sjn 0/1 Completed 0 19m
    kube-system rke-metrics-addon-deploy-job-djslk 0/1 Completed 0 19m
    kube-system rke-network-plugin-deploy-job-jj887 0/1 Completed 0 19m

保存文件

重要信息
需要下面提到的文件来维护,排除故障并升级您的集群。

将以下文件的副本保存在安全位置:

  • rancher-cluster.yml:RKE集群配置文件。
  • kube_config_rancher-cluster.yml:集群的 Kube config文件,此文件包含完全访问集群的凭据。
  • rancher-cluster.rkestate:Kubernetes集群状态文件,此文件包含完全访问集群的凭据。

仅在使用RKE v0.2.0或更高版本时才会创建Kubernetes集群状态文件。

写到这儿时提示有 14000 字(包含日志等等等等),500 行。。累~

2.3 初始化Helm(Tiller)

Helm是Kubernetes首选的包管理工具。Helm“chart”为Kubernetes YAML清单文档提供模板语法。使用Helm,我们可以创建可配置的部署,而不仅仅是使用静态文件。有关创建自己的部署目录的更多信息,请查看 https://helm.sh/ 上的文档。为了能够使用Helm,tiller需要在集群上安装服务器端组件。

注意:
对于不能直接访问互联网的系统,请参阅Helm - Air Gap了解安装详情。

在集群上安装Tiller

Helm tiller 在群集上安装服务以管理charts。由于RKE默认启用RBAC,因此我们需要使用kubectl创建serviceaccount 和 clusterrolebinding 让 tiller具有部署到集群的权限。

  1. 在kube-system命名空间中创建ServiceAccount。

    1. $ kubectl -n kube-system create serviceaccount tiller
  2. 创建ClusterRoleBinding以授予tiller帐户对群集的访问权限。

    1. $ kubectl create clusterrolebinding tiller \
    2. --clusterrole=cluster-admin \
    3. --serviceaccount=kube-system:tiller
  3. 最后用helm安装tiller服务
    这里特别提到中国。我们需要靠aliyun了。

    1. # 查看版本号
    2. $ helm version
    3. # Client: &version.Version{SemVer:"v2.14.3", GitCommit:"...", GitTreeState:"clean"}
    4. # 使用版本号替换下面命令的版本号
    5. $ helm init --service-account tiller --skip-refresh \
    6. --tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:v2.14.3
  4. 查看 tiller 状态

    1. $ kubectl get pods --all-namespaces
    2. # 省略其他
    3. NAMESPACE NAME READY STATUS RESTARTS AGE
    4. kube-system tiller-deploy-7464dff9-7msvc 0/1 Running 0 18s

测试 Tiller

运行下面的命令验证:

  1. $ kubectl -n kube-system rollout status deploy/tiller-deploy
  2. deployment "tiller-deploy" successfully rolled out

运行以下命令以验证Helm是否可以与tiller服务进行通信:

  1. $ helm version
  2. Client: &version.Version{ SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
  3. Server: &version.Version{ SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

2.4 安装Rancher

完整内容:https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/

添加Helm Chart Repository

  1. $ helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

补充,默认的 stable 仓库可能无法访问,参考 https://github.com/BurdenBear/kube-charts-mirror 这里设置 stable。
微软也提供了helm 仓库的镜像, 找到这儿的朋友推荐使用微软的镜像:
stable: http://mirror.azure.cn/kubernetes/charts/
incubator: http://mirror.azure.cn/kubernetes/charts-incubator/
使用方式

  1. $ helm repo add stable http://mirror.azure.cn/kubernetes/charts/

选择您的SSL配置

这里直接选择 Rancher生成的证书

需要安装 cert-manager:

  1. $ helm install stable/cert-manager --name cert-manager --namespace kube-system --version v0.5.2
  2. # 等了很久才有反应
  3. NAME: cert-manager
  4. LAST DEPLOYED: Thu Aug 1 18:04:45 2019
  5. NAMESPACE: kube-system
  6. STATUS: DEPLOYED
  7. RESOURCES:
  8. ==> v1/ServiceAccount
  9. NAME SECRETS AGE
  10. cert-manager 1 0s
  11. ==> v1beta1/ClusterRole
  12. NAME AGE
  13. cert-manager 0s
  14. ==> v1beta1/ClusterRoleBinding
  15. NAME AGE
  16. cert-manager 0s
  17. ==> v1beta1/Deployment
  18. NAME READY UP-TO-DATE AVAILABLE AGE
  19. cert-manager 0/1 0 0 0s
  20. NOTES:
  21. cert-manager has been deployed successfully!
  22. In order to begin issuing certificates, you will need to set up a ClusterIssuer
  23. or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).
  24. More information on the different types of issuers and how to configure them
  25. can be found in our documentation:
  26. https://cert-manager.readthedocs.io/en/latest/reference/issuers.html
  27. For information on how to configure cert-manager to automatically provision
  28. Certificates for Ingress resources, take a look at the `ingress-shim`
  29. documentation:
  30. https://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html

查看 cert-manager rollout 状态:

  1. $ kubectl -n kube-system rollout status deploy/cert-manager
  2. deployment "cert-manager" successfully rolled out

继续Rancher生成的证书,将 hostname 您指向负载均衡器的域名(不能是 IP),执行下面的代码:

  1. $ helm install rancher-stable/rancher \
  2. --name rancher \
  3. --namespace cattle-system \
  4. --set hostname=rancher.my.org

完整的选项看这里:Rancher Chart Options

特别说明!
如果你没有域名,你这里可以先随便写,例如 hostname=rancher.mybatis.io,然后继续往下看。

hostname 相关问题

Rancher 的 hostname 一直是个坑:https://github.com/rancher/rancher/issues/16454

由于 Rancher 要求必须设置域名,因此内网没有 DNS 的情况下很可能无法提供一个可用的域名。如果我们设置一个自定义的域名后,在通过修改 hosts 进行映射时,还会遇到很多问题,这里把所有和该情况相关的改动全部列举出来。

可能会遇到的问题,查看所有 pod 状态如下:

  1. $ kubectl get pods --all-namespaces
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. cattle-system cattle-cluster-agent-9c57fb57f-p2sj5 0/1 CrashLoopBackOff 12 44h
  4. cattle-system cattle-node-agent-hggd9 0/1 CrashLoopBackOff 12 44h
  5. cattle-system cattle-node-agent-phf2s 0/1 CrashLoopBackOff 12 44h
  6. cattle-system cattle-node-agent-rs6rz 0/1 CrashLoopBackOff 12 44h
  7. cattle-system rancher-5ff9669886-dfcbl 1/1 Running 2 44h
  8. cattle-system rancher-5ff9669886-jvnvm 1/1 Running 1 44h
  9. cattle-system rancher-5ff9669886-s7st9 1/1 Running 2 44h
  10. ingress-nginx default-http-backend-5954bd5d8c-6r5k8 1/1 Running 1 44h
  11. ingress-nginx nginx-ingress-controller-8rxv7 1/1 Running 1 44h
  12. ingress-nginx nginx-ingress-controller-p4qt7 1/1 Running 1 44h
  13. ingress-nginx nginx-ingress-controller-qxgg4 1/1 Running 1 44h
  14. kube-system canal-67hxd 2/2 Running 2 44h
  15. kube-system canal-fj6kg 2/2 Running 2 44h
  16. kube-system canal-wxc72 2/2 Running 2 44h
  17. kube-system cert-manager-54d94bb6fc-qf9ff 1/1 Running 1 44h
  18. kube-system coredns-86bc4b7c96-w67th 1/1 Running 1 44h
  19. kube-system coredns-autoscaler-5d5d49b8ff-tphhh 1/1 Running 1 44h
  20. kube-system metrics-server-7f6bd4c888-cz556 1/1 Running 1 44h
  21. kube-system rke-coredns-addon-deploy-job-vzxs4 0/1 Completed 0 44h
  22. kube-system rke-ingress-controller-deploy-job-ffzzj 0/1 Completed 0 44h
  23. kube-system rke-metrics-addon-deploy-job-mzsgt 0/1 Completed 0 44h
  24. kube-system rke-network-plugin-deploy-job-f94cs 0/1 Completed 0 44h
  25. kube-system tiller-deploy-7464dff9-8lrrf 1/1 Running 1 44h

可以看到 4 个和节点有关的 pod 状态异常 CrashLoopBackOff

下面是解决方法:

  1. 修改客户端的 hosts 配置映射
  2. 配置 所有 Rancher 节点 的 hosts 映射
  3. 修改和网络相关的 pod(deployment)中的映射关系

前两点修改很容易,修改 Windows 中的 C:\Windows\System32\drivers\etc\hosts 或者 Linux 中的 /etc/hosts,增加下面的映射:

  1. # 负载均衡对应的实际IP 自定义域名
  2. # 例如下面
  3. 192.168.200.203 rancher.mybatis.io

第 3 点需要通过下面的命令来修改 cattle-cluster-agentcattle-node-agent

修改 cattle-cluster-agent

  1. $ kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{ "spec": { "template": { "spec": { "hostAliases": [ { "hostnames": [ "自定义域名" ], "ip": "负载均衡IP" } ] } } } }'

修改 cattle-node-agent

  1. $ kubectl -n cattle-system patch daemonsets cattle-node-agent --patch '{ "spec": { "template": { "spec": { "hostAliases": [ { "hostnames": [ "自定义域名" ], "ip": "负载均衡IP" } ] } } } }'

改完后,再次查看 pod 状态:

  1. NAMESPACE NAME READY STATUS RESTARTS AGE
  2. cattle-system cattle-cluster-agent-54fb6d584c-gb6p8 1/1 Running 0 2m51s
  3. cattle-system cattle-node-agent-mhnwf 1/1 Running 0 2m35s
  4. cattle-system cattle-node-agent-x2gph 1/1 Running 0 2m35s
  5. cattle-system cattle-node-agent-xxwms 1/1 Running 0 2m35s

未完待续

本文的目的是我自己记录下完整的过程,方便后续根据本文重复试验,因此本文后续会不断的进行更新内容。

由于本文过长,除了必要的需要增加在本文的内容外,其他问题会写在:Rancher HA 问题汇总。

发表评论

表情:
评论列表 (有 0 条评论,908人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Slipstream中的可用HA

           一个Application或者一个StreamJob,如果上游的流发生故障(例如意外退出)无法及时恢复,可能会导致整个系统的瘫痪。因此,流处理系统的高可用性显得尤