Rancher HA 高可用安装步骤

完整内容参考: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

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

CentOS / RHEL / Fedora

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
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)。

# MacOS
$ mv rke_darwin-amd64 rke
# 增加可执行权限
$ chmod +x rke

# Linux
$ mv rke_linux-amd64 rke
# 增加可执行权限
$ chmod +x rke

# Windows PowerShell
> mv rke_windows-amd64.exe rke.exe

验证安装:

$ rke --version
# 输出类似下面版本信息
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)。

验证安装:

$ helm version
# 输出类似下面信息
Client: &version.Version{ SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
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 创建节点和负载均衡器

先看节点 配置要求
满足配置要求的情况下,需要配置负载均衡器
《Rancher HA 高可用安装步骤》

负载均衡器

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配置

    worker_processes 4;
    worker_rlimit_nofile 40000;
    
    events {
        worker_connections 8192;
    }
    
    stream {
        upstream rancher_servers_http {
            least_conn;
            server <IP_NODE_1>:80 max_fails=3 fail_timeout=5s;
            server <IP_NODE_2>:80 max_fails=3 fail_timeout=5s;
            server <IP_NODE_3>:80 max_fails=3 fail_timeout=5s;
        }
        server {
            listen     80;
            proxy_pass rancher_servers_http;
        }
    
        upstream rancher_servers_https {
            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_https;
        }
    }
    
  3. 保存 nginx.conf/etc/nginx/nginx.conf

  4. 刷新 NGINX 配置 nginx -s reload

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

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

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

nodes:
  - address: 165.227.114.63
    internal_address: 172.16.22.12
    user: ubuntu
    role: [controlplane,worker,etcd]
  - address: 165.227.116.167
    internal_address: 172.16.32.37
    user: ubuntu
    role: [controlplane,worker,etcd]
  - address: 165.227.127.226
    internal_address: 172.16.42.73
    user: ubuntu
    role: [controlplane,worker,etcd]

services:
  etcd:
    snapshot: true
    creation: 6h
    retention: 24h

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

常见的RKE节点选项

OptionRequiredDescription
addressyes公共DNS或IP地址
useryes可以运行docker命令的用户
roleyes分配给节点的Kubernetes角色列表
internal_addressno内部集群流量的私有DNS或IP地址
ssh_key_pathno用于对节点进行身份验证的SSH私钥的路径(默认为~/.ssh/id_rsa

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

配置 ssh_key 登录

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

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

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

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

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

配置后可以在 NODE1 测试:

$ ssh rancher@NODE2
# 连接成功后通过 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 后,执行下面的命令:

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

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

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

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

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

第一次执行完成后,输出了一行错误:
《Rancher HA 高可用安装步骤》

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

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

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

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

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

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

# 停止服务
systemctl  disable kubelet.service
systemctl  disable kube-scheduler.service
systemctl  disable kube-proxy.service
systemctl  disable kube-controller-manager.service
systemctl  disable kube-apiserver.service

systemctl  stop kubelet.service
systemctl  stop kube-scheduler.service
systemctl  stop kube-proxy.service
systemctl  stop kube-controller-manager.service
systemctl  stop kube-apiserver.service

# 删除所有容器
docker rm -f $(docker ps -qa)

# 删除所有容器卷
docker volume rm $(docker volume ls -q)

# 卸载mount目录
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done

# 备份目录
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")


# 删除残留路径
rm -rf /etc/ceph \
     /etc/cni \
     /opt/cni \
     /run/secrets/kubernetes.io \
     /run/calico \
     /run/flannel \
     /var/lib/calico \
     /var/lib/cni \
     /var/lib/kubelet \
     /var/log/containers \
     /var/log/pods \
     /var/run/calico

# 清理网络接口
network_interface=`ls /sys/class/net`
for net_inter in $network_interface;
do
  if ! echo $net_inter | grep -qiE 'lo|docker0|eth*|ens*';then
    ip link delete $net_inter
  fi
done

# 清理残留进程
port_list=`80 443 6443 2376 2379 2380 8472 9099 10250 10254`
for port in $port_list
do
  pid=`netstat -atlnup|grep $port |awk '{print $7}'|awk -F '/' '{print $1}'|grep -v -|sort -rnk2|uniq`
  if [[ -n $pid ]];then
    kill -9 $pid
  fi
done

pro_pid=`ps -ef |grep -v grep |grep kube|awk '{print $2}'`
if [[ -n $pro_pid ]];then
  kill -9 $pro_pid
fi

# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain

systemctl restart docker

经历一番风波后,终于完成了。
《Rancher HA 高可用安装步骤》

测试集群

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

-rw-r-----  1 root root     5382 Aug  1 16:17 kube_config_rancher-cluster.yml
-rw-r-----  1 root root   114422 Aug  1 16:18 rancher-cluster.rkestate
-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 来查看当前的节点状态:

$ kubectl get nodes
NAME          STATUS   ROLES                      AGE   VERSION
10.10.1.238   Ready    controlplane,etcd,worker   16m   v1.14.3
10.10.1.241   Ready    controlplane,etcd,worker   16m   v1.14.3
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。
    $ kubectl -n kube-system create serviceaccount tiller
    
  2. 创建ClusterRoleBinding以授予tiller帐户对群集的访问权限。
    $ kubectl create clusterrolebinding tiller \
      --clusterrole=cluster-admin \
      --serviceaccount=kube-system:tiller
    
  3. 最后用helm安装tiller服务
    这里特别提到中国。我们需要靠aliyun了。
    # 查看版本号
    $ helm version
    # Client: &version.Version{SemVer:"v2.14.3", GitCommit:"...", GitTreeState:"clean"}
    # 使用版本号替换下面命令的版本号
    $ helm init --service-account tiller --skip-refresh \
       --tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:v2.14.3
    
  4. 查看 tiller 状态
    $ kubectl get pods --all-namespaces
    # 省略其他
    NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE
    kube-system     tiller-deploy-7464dff9-7msvc              0/1     Running     0          18s
    

测试 Tiller

运行下面的命令验证:

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

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

$ helm version
Client: &version.Version{ SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
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

$ 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/
使用方式

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

选择您的SSL配置

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

需要安装 cert-manager:

$ helm install stable/cert-manager --name cert-manager --namespace kube-system --version v0.5.2
# 等了很久才有反应
NAME:   cert-manager
LAST DEPLOYED: Thu Aug  1 18:04:45 2019
NAMESPACE: kube-system
STATUS: DEPLOYED

RESOURCES:
==> v1/ServiceAccount
NAME          SECRETS  AGE
cert-manager  1        0s

==> v1beta1/ClusterRole
NAME          AGE
cert-manager  0s

==> v1beta1/ClusterRoleBinding
NAME          AGE
cert-manager  0s

==> v1beta1/Deployment
NAME          READY  UP-TO-DATE  AVAILABLE  AGE
cert-manager  0/1    0           0          0s


NOTES:
cert-manager has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

More information on the different types of issuers and how to configure them
can be found in our documentation:

https://cert-manager.readthedocs.io/en/latest/reference/issuers.html

For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:

https://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html

查看 cert-manager rollout 状态:

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

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

$ helm install rancher-stable/rancher \
  --name rancher \
  --namespace cattle-system \
  --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 状态如下:

$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                      READY   STATUS             RESTARTS   AGE
cattle-system   cattle-cluster-agent-9c57fb57f-p2sj5      0/1     CrashLoopBackOff   12         44h
cattle-system   cattle-node-agent-hggd9                   0/1     CrashLoopBackOff   12         44h
cattle-system   cattle-node-agent-phf2s                   0/1     CrashLoopBackOff   12         44h
cattle-system   cattle-node-agent-rs6rz                   0/1     CrashLoopBackOff   12         44h
cattle-system   rancher-5ff9669886-dfcbl                  1/1     Running            2          44h
cattle-system   rancher-5ff9669886-jvnvm                  1/1     Running            1          44h
cattle-system   rancher-5ff9669886-s7st9                  1/1     Running            2          44h
ingress-nginx   default-http-backend-5954bd5d8c-6r5k8     1/1     Running            1          44h
ingress-nginx   nginx-ingress-controller-8rxv7            1/1     Running            1          44h
ingress-nginx   nginx-ingress-controller-p4qt7            1/1     Running            1          44h
ingress-nginx   nginx-ingress-controller-qxgg4            1/1     Running            1          44h
kube-system     canal-67hxd                               2/2     Running            2          44h
kube-system     canal-fj6kg                               2/2     Running            2          44h
kube-system     canal-wxc72                               2/2     Running            2          44h
kube-system     cert-manager-54d94bb6fc-qf9ff             1/1     Running            1          44h
kube-system     coredns-86bc4b7c96-w67th                  1/1     Running            1          44h
kube-system     coredns-autoscaler-5d5d49b8ff-tphhh       1/1     Running            1          44h
kube-system     metrics-server-7f6bd4c888-cz556           1/1     Running            1          44h
kube-system     rke-coredns-addon-deploy-job-vzxs4        0/1     Completed          0          44h
kube-system     rke-ingress-controller-deploy-job-ffzzj   0/1     Completed          0          44h
kube-system     rke-metrics-addon-deploy-job-mzsgt        0/1     Completed          0          44h
kube-system     rke-network-plugin-deploy-job-f94cs       0/1     Completed          0          44h
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,增加下面的映射:

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

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

修改 cattle-cluster-agent

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

修改 cattle-node-agent

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

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

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

未完待续

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

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

    原文作者:isea533
    原文地址: https://blog.csdn.net/isea533/article/details/98032443
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞