使用rancher基于rke搭建高可用kubenetes集群

配置清单

hostnameip配置
rancher-lb192.168.0.802核2G
rancher-node1192.168.0.812核4G
rancher-node2192.168.0.822核4G
rancher-node3192.168.0.832核4G

以上配置为最低要求配置,实际情况可按需求添加配置或伸缩节点,rancher-node最少可为1个节点,其中安装etcd节点最好为奇数节点,否则会出现脑裂。

简介

最近想基于rancher2.4.x搭建一个高可用的kubebetes集群,网上找了很多资料基本上都是一知半解,特别是关于证书这一块官方说的更是含糊其辞,于是乎自己一点点琢磨官方文档,从试错中找到了一个可以完整搭建的方式,下面我们就来进入正题。

注意:
在rancher中我们搭建的kubenetes集群是通过rke来安装,当然也可以基于已有的kubenetes集群来安装rancher,这种情况我们就不做阐述,下面我们就来说说如何通过rke来安装。然而容易让人那以理解的是,通过rke来安装kubenetes集群和rancher,官方其实是给出的2种安装方式,但是官方文档中并没有明确说明,只是给出了一个简单的的快速入门示例和rke的安装教程,起初我也在这里郁闷了很久,为什么快速入门示例通过简单的docker安装就能轻轻松松搭建一套kubenetes集群,官方还要给出了一个rke的安装教程的呢?后来通过慢慢的学习才了解到,其实快速入门示例他的默认安装方式也是通过rke来安装的,只是这层操作被简化掉了,但这种安装方式有一个弊端就是,它无法做到rancher-server的高可用,官方建议在测试环境通过这种方式安装,而生产环境还是要使用手动rke来安装,rancher的安装则是通过rke搭建起的kubenetes集群并使用helm方式来做到高可用,到这里我想很多人的疑惑也就自然而然的解开了。

环境初始化

所有机器都要执行

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

# 关闭swap
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名
hostnamectl set-hostname k8s-master1

yum install wget vim -y

# 修改yum源
cd /etc/yum.repos.d/ 

wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

mv CentOS-Base.repo CentOS-Base.repo.bak

mv CentOS7-Base-163.repo CentOS-Base.repo

# 配置kubernetes源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum clean all 

yum makecache 

yum update -y

# 安装docker
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast

yum -y install docker-ce-18.06.3.ce
# Step 4: 开启Docker服务
systemctl start docker
systemctl enable docker

# 修改docker镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://q8tek117.mirror.aliyuncs.com"]
}
EOF

# 启动docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
授权lb节点免密登陆其他节点

Lb 节点执行

# 生成私钥和公钥,一路回车
ssh-keygen -t rsa -b 4096

# 分发公钥到其他节点
ssh-copy-id -i root@192.168.100.81
ssh-copy-id -i root@192.168.100.82
ssh-copy-id -i root@192.168.100.83

添加用户

非lb的其他节点执行

# 添加docker用户并添加至docker用户组
useradd -g docker docker
cp -r /root/.ssh /home/docker/
chown -R docker:docker /home/docker/.ssh

注意: 这个步骤一定不能与上个步骤顺序执行相反,否则docker用户无法免密登陆

配置lb节点

该节点不是必须节点,云厂商可以使用负载均衡器

预先准备

上传安装文件(rke、helm、cert-manager)

链接: https://pan.baidu.com/s/1N_tJ9aNsr-O6jd5OtlnvUw 密码: q68u

下载后并上传

[root@rke-lb rke-install]# pwd
/root/rke-install
[root@rke-lb rke-install]# ls
cert-manager  helm-v3.3.0-linux-amd64.tar.gz  rke_linux-amd64
# 将镜像分发到其他镜像,待其他节点安装
cd cert-manager
scp cert-manager*.gz root@192.168.100.81:
scp cert-manager*.gz root@192.168.100.82:
scp cert-manager*.gz root@192.168.100.83:

安装nginx

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum install nginx -y

# 编辑配置文件
rm -rf /etc/nginx/nginx.conf
vi /etc/nginx/nginx.conf


worker_processes 4;
worker_rlimit_nofile 40000;
 
events {
  worker_connections 8192;
}
 
stream {
  upstream rancher_servers_http {
    least_conn;
    server 192.168.100.81:80 max_fails=3 fail_timeout=5s;
    server 192.168.100.82:80 max_fails=3 fail_timeout=5s;
    server 192.168.100.83:80 max_fails=3 fail_timeout=5s;
  }
  server {
    listen     80;
    proxy_pass rancher_servers_http;
  }
 
  upstream rancher_servers_https {
    least_conn;
    server 192.168.100.81:443 max_fails=3 fail_timeout=5s;
    server 192.168.100.82:443 max_fails=3 fail_timeout=5s;
    server 192.168.100.83:443 max_fails=3 fail_timeout=5s;
  }
  server {
    listen     443;
    proxy_pass rancher_servers_https;
  }
}

# 启动nginx
sudo systemctl daemon-reload
sudo systemctl restart nginx

安装kukectl

yum install kubectl -y

安装helm

cd /root/rke-install

tar -zxvf  helm-v3.2.4-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin

# 添加 Helm Chart 仓库
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

开始安装k8s集群

以下操作均在lb节点上执行

编辑配置文件,并保存命名为rancher-cluster.yml

nodes列表中的addressinternal_address 替换为您创建的 3 个节点的 IP 地址或 DNS 名称

nodes:
  - address: 192.168.100.81
    internal_address: 192.168.100.81
    user: docker
    role: [controlplane, worker, etcd]
  - address: 192.168.100.82
    internal_address: 192.168.100.82
    user: docker
    role: [controlplane, worker, etcd]
  - address: 192.168.100.83
    internal_address: 192.168.100.83
    user: docker
    role: [controlplane, worker, etcd]

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

TIPS:

如果在执行上面的命令之前检查过命令的话会发现三台node都创建了一个名为docker的用户,并且用户组为docker,这是因为centos的docker是以root用户运行的,但rke的安装不能用root用户来执行命令。所以需要建立一个用户,并将其加入docker组,而这个用户可以实其他名字而不一定为docker

注意事项: 如果您的节点具有公网和内网地址,建议在internal_address一栏输入内网地址,以便 Kubernetes 将其用于集群内部通信。如果使用自身安全组或防火墙,则某些云服务供应商强制要求设置 internal_address:

RKE 节点通用选项

选项是否必选描述
address公共 DNS 或 IP 地址
user可以执行 docker 命令的用户
role给节点分配的 Kubernetes 角色列表
internal_address给集群内部流量使用的私有 DNS 或者 IP 地址
ssh_key_path用来登录节点的 SSH 私钥路径 ,默认值为 ~/.ssh/id_rsa
运行 RKE

输入以下命令,运行 RKE 节点。

cd /root/rke-install
mv rke_linux-amd64 rke
chmod +x rke
./rke up --config ./rancher-cluster.yml

运行结束后返回 Finished building Kubernetes cluster successfully,表示正常运行。

存放kubectl配置文件

接下来要将kube_config_rancher-cluster.yml放置到指定位置,使kubectl能够正常访问kubenetes集群

mkdir $HOME/.kube && cp kube_config_rancher-cluster.yml $HOME/.kube/config

验证并检查所有Pods的情况

kubectl get pods --all-namespaces

安装Rancher

安装方式选择

Rancher安装默认需要 SSL/TLS 配置来保证访问的安全性,因此在安装前需要确定你使用哪一种证书安装方式,一般由以下2种证书安装方式,两种方式2选1即可。

  • 方案一: 由Rancher生成证书安装
  • 方案二: 用自己已有的证书安装

方案对比:

设置Chart 选项描述是否需要 cert-manager
Rancher 自签名证书ingress.tls.source=rancher使用 Rancher 生成的 CA 签发的自签名证书 此项为默认选项
Let’s Encryptingress.tls.source=letsEncrypt使用Let’s Encrypt颁发的证书
您已有的证书ingress.tls.source=secret使用您的已有证书(Kubernetes 密文)

仅由 Rancher 生成的 CA ingress.tls.source=rancher 和 Let’s Encrypt 颁发的证书 ingress.tls.source=letsEncrypt 才需要 cert-manager。如果您使用自己的证书文件 ingress.tls.source=secret 或者使用外部 TLS 负载均衡器可以不需要[安装cert-manager](#安装 cert-manager)。

方案一:由Rancher生成证书安装

安装 cert-manager
  • 单独安装 CustomResourceDefinition 资源

    kubectl apply -f cert-manager.crds.yaml
    
  • 为 cert-manager 创建命名空间

    kubectl create namespace cert-manager
    
  • 标记 cert-manager 命名空间,禁用资源验证

    kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
    
  • 添加 Jetstack Helm repository

    helm repo add jetstack https://charts.jetstack.io
    
  • 更新本地的 Helm chart repository 缓存

    helm repo update
    
  • 加载helm安装cert-manager时所需要的docker镜像

    在所有非lb节点执行以下命令,如果是科学上网可忽略此步骤

    docker load -i cert-manager-webhook.tar.gz
    
    docker load -i cert-manager-cainjector.tar.gz
    
    docker load -i cert-manager.tar.gz
    
  • 使用 Helm chart 安装 cert-manager

    helm install \
      cert-manager \
      jetstack/cert-manager \
      --namespace cert-manager \
      --version v0.13.0
    
  • 安装 cert-manager 以后,您可以通过检查 cert-manager 命名空间下的 pod 运行状态来验证部署是否正确:

    kubectl get pods --namespace cert-manager
    
    NAME                                            READY   STATUS      RESTARTS   AGE
    cert-manager-7cbdc48784-rpgnt                   1/1     Running     0          3m
    cert-manager-webhook-5b5dd6999-kst4x            1/1     Running     0          3m
    cert-manager-cainjector-3ba5cd2bcd-de332x       1/1     Running     0          3m
    
rancher安装
# 创建命名空间
kubectl create namespace cattle-system

# 安装
helm install \
  rancher \
  rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=rancher.my.org

TIPS:

将hostname替换成解析道lb节点的域名地址

方案二:用自己已有的证书安装

添加 Kubernetes TLS 密文

申请颁发证书

阿里云证书一般选择下载tomcat类型证书,下载解压后会得到xxx_domain.pfxpfx-password.txt

# 转换证书得到pem证书,执行该命令时需要输入pfx-password.tx中的密码
openssl pkcs12 -in xxx_domain.pfx -nodes -out cacerts.pem

openssl rsa -in cacerts.pem -out tls.key
openssl x509 -in cacerts.pem -out tls.crt

使用 kubectl 来创建 tls 类型的密文。

kubectl -n cattle-system create secret tls tls-rancher-ingress \
  --cert=tls.crt \
  --key=tls.key

提示: 如果您想要更换证书,您可以使用 kubectl -n cattle-system delete secret tls-rancher-ingress 来删除 tls-rancher-ingress 密文,之后使用上面的命令创建一个新的密文。如果您使用的是私有 CA 签发的证书,仅当新证书与当前证书是由同一个 CA 签发的,才可以替换。

提供 CA 证书的副本

如果您使用的是私有 CA,Rancher 需要您提供 CA 证书的副本,用来校验 Rancher Agent 与 Server 的连接。

拷贝 CA 证书到名为 cacerts.pem 的文件,使用 kubectl 命令在 cattle-system 命名空间中创建名为 tls-ca 的密文。

kubectl -n cattle-system create secret generic tls-ca \
  --from-file=cacerts.pem=./cacerts.pem
rancher安装

如果您使用的是私有CA证书,请在命令中增加 --set privateCA=true

helm install \
  rancher \
  rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=rancher.my.org \
  --set ingress.tls.source=secret \
  --set privateCA=true

运行

输入地址:https://rancher.my.org

修改密码:

kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password
New password for default administrator (user-xxxxx):
<new_password>

遇到的问题

问题一:

安装时报错:

FATA[0215] Failed to get job complete status for job rke-network-plugin-deploy-job in namespace kube-system

遇到这个问题,重新执行./rke up --config ./rancher-cluster.yml即可

运维

更新证书

./rke cert rotate --config ./rancher-cluster.yml
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值