乐趣区

关于rancher:使用Rancher管理Kubernetes集群

前言

前文搭建了高可用的 Kubernetes 集群,原本布局持续摸索理论中的利用部署以及如何革新现有的技术架构使 Kubernetes 初步落地。不过在搭建完集群后,还是不可遏制的想找寻一款图形化管理工具,毕竟我的关注点更多在于如何把现有技术架构和流程向云原生做落地,过于繁琐和简单的命令行运维形式目前并不适宜我。

于是发现了 Rancher。通过初步的信息检索,不管从 Rancher 的技术方向、知名度、社区活跃度、以及平台技术能力都算得上优良和支流,所以交叉了这部分的内容的学习。

Rancher 次要的知识点起源自官网文档,官网文档还算八面玲珑和具体,英文好的也能够对照英文文档,轻微上还是有些小差异。

整体架构

那么对于应用 Rancher 自身以及被治理集群架构,我画了一张架构图

Rancher 高可用装置

首先咱们须要做的是 Rancher 的装置,Rancher 反对多种装置形式,最简略的就是单机装置,应用 docker 跑个镜像就行。我应用的是高可用装置形式。最新版本的 2.5 曾经反对了将 Rancher 装置在各种 Kubernetes 集群上,比方现有的 Kubernetes 集群,或者 RKE、K3s、Amazon EKS 等等。并且官网倡议为了性能,最好将该 Kubernetes 集群专门用于运行 Rancher。

通过简略的比照,最终决定应用 Rancher 自家推出的 K3s 来部署 Rancher 利用。Kubernetes 和 K3S 是什么关系呢,官网原话:

k3s 旨在成为齐全兼容的 Kubernetes 发行版,相比 k8s 次要更改如下:

  1. 旧的、Alpha 版本的、非默认性能都曾经删除。
  2. 删除了大多数外部云提供商和存储插件,能够用插件替换。
  3. 新增 SQLite3 作为默认存储机制,etcd3 依然无效,然而不再是默认项。
  4. 封装在简略的启动器中,能够解决大量 LTS 复杂性和选项。
  5. 最小化到没有操作系统依赖,只须要一个内核和 cgroup 挂载。

并且 K3s 是一个符合标准的、已获 CNCF官网 认证的 Kubernetes 发行版,在开发环境或者轻量级需要时劣势显著。

筹备工作

  • Mysql 内部数据库

    K3s 应用 etcd 以外的数据存储运行 Kubernetes,使得某种意义上更加灵便,咱们能够应用现成的数据库,例如 Mysql,这里须要创立一个 Mysql 数据库。

  • 负载平衡

    当咱们的 Rancher 节点运行在 K3s 上时,须要一个负载均衡器将流量疏导到多个节点上。官网示例应用 nginx 做 L4 负载平衡,配置文件如下:

    worker_processes 4;
    worker_rlimit_nofile 40000;
    
    events {worker_connections 8192;}
    
    stream {
        upstream rancher_servers_http {
            least_conn;
            server 10.128.2.53:80 max_fails=3 fail_timeout=5s;   ##rancher 节点
            server 10.128.2.52:80 max_fails=3 fail_timeout=5s;
        }
        server {
            listen 80;
            proxy_pass rancher_servers_http;
        }
    
        upstream rancher_servers_https {
            least_conn;
            server 10.128.2.53:443 max_fails=3 fail_timeout=5s;
            server 10.128.2.52:443 max_fails=3 fail_timeout=5s;
        }
        server {
            listen     443;
            proxy_pass rancher_servers_https;
        }
    
    }

启动 nginx 时须要开启 stream 模块。

  • 装置 kubectl

    K3s 节点机器上须要装置 kubectl,不便通过命令行来治理集群。至于后续通过 Rancher 装置的 Kubernetes 集群节点上如果须要通过命令行治理,也须要装置 kubectl。至于如何装置就不赘述了,前文有。

K3s 治理

  • 装置

    K3s 的装置相当简略,并且因为引入了内部 mysql 数据库做存储,K3s 的节点曾经变成无状态,对于节点数的要求并不需要肯定 3 个起步,官网给的例子就是 2 个节点。装置 k3s 命令如下

    curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \
    --datastore-endpoint="mysql://k3s:k3s123456@tcp(10.11.0.194:3306)/k3s" 
    
    #若要装置指定版本
    curl -sfL https://get.k3s.io |  INSTALL_K3S_VERSION=vX.Y.Z sh -s - server \
    --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"

期待后启动胜利

此时能够通过

k3s kubectl get nodes

来确认 k3s 节点状态。若想通过 kubectl 工具拜访的话,须要配置 kubeconfig 文件

cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

~/.kube/config文件中默认 server 地址是 127.0.0.1,须要改成前端负载均衡器的 DNS,更改 nginx 配置就行了。这里因为后面依据 Kubeadm 部署的集群我应用的是 haproxy + keepalived,所以这里我就持续应用了,此处 server 地址配置的是 keepalived 的 VIP。

  • 卸载

    K3s 会在本地搁置卸载文件,如果须要删除 K3s,能够执行

    /usr/local/bin/k3s-uninstall.sh

Helm 装置

先贴上 Helm 文档地址。

  • Helm 是什么?

    Helm 是一个 Kubernetes 利用的包管理工具,用来治理 chart——事后配置好的安装包资源,有点相似于 Ubuntu 的 APT 和 CentOS 中的 YUM

  • Helm 装置

    对于装置,官网装置局部说的很具体,两种形式自取。

  • 增加 Rancher 源

    后续应用 Helm 形式装置 Rancher,须要新增 Rancher 的源,稳固版本和最新版本任选

    # 稳固版本
    helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
    # 最新版本
    helm repo add rancher-latest http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/latest

证书生成

Rancher Server 默认须要 SSL/TLS 配置来保障拜访的安全性。

提醒: 如果您想要将 SSL/TLS 拜访在内部终止,请查看应用内部 TLS 负载均衡器。

有三种对于证书起源的举荐选项,证书将用来在 Rancher Server 中终止 TLS:

  • Rancher 生成的自签名证书: 在这种状况下,您须要在集群中装置 cert-manager。Rancher 利用cert-manager 签发并保护证书。Rancher 将生成本人的 CA 证书,并应用该 CA 签订证书。而后,cert-manager负责管理该证书。
  • Let’s Encrypt: Let’s Encrypt 选项也须要应用 cert-manager。然而,在这种状况下,cert-manager 与非凡的 Issuer 联合应用,cert-manager将执行获取 Let’s Encrypt 发行的证书所需的所有操作(包含申请和验证)。此配置应用 HTTP 验证(HTTP-01),因而负载均衡器必须具备能够从公网拜访的公共 DNS 记录。
  • 应用您本人的证书: 此选项使您能够应用本人的权威 CA 颁发的证书或自签名 CA 证书。Rancher 将应用该证书来爱护 WebSocket 和 HTTPS 流量。在这种状况下,您必须上传名称别离为 tls.crttls.key的 PEM 格局的证书以及相干的密钥。如果应用公有 CA,则还必须上传该证书。这是因为您的节点可能不信赖此公有 CA。Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将应用该校验和来验证其与 Rancher 的连贯。

以上是官网对于证书的形容,Rancher 提供了三种证书形式,国内的文档倡议选用本人证书的形式,理由是 cert-manager 须要额定的运维精力,听人劝吃饱饭。再次强调,以下操作都是基于应用自有证书的形式!!!

  • SSL 证书生成

    官网提供了生成证书的脚本,我在这里贴一下

    #!/bin/bash -e
    
    help ()
    {
        echo  '================================================================'
        echo  '--ssl-domain: 生成 ssl 证书须要的主域名,如不指定则默认为 www.rancher.local,如果是 ip 拜访服务,则可疏忽;'
        echo  '--ssl-trusted-ip: 个别 ssl 证书只信赖域名的拜访申请,有时候须要应用 ip 去拜访 server,那么须要给 ssl 证书增加扩大 IP,多个 IP 用逗号隔开;'
        echo  '--ssl-trusted-domain: 如果想多个域名拜访,则增加扩大域名(SSL_TRUSTED_DOMAIN), 多个扩大域名用逗号隔开;'
        echo  '--ssl-size: ssl 加密位数,默认 2048;'
        echo  '--ssl-cn: 国家代码(2 个字母的代号), 默认 CN;'
        echo  '应用示例:'
        echo  './create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \'
        echo  '--ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
        echo  '================================================================'
    }
    
    case "$1" in
        -h|--help) help; exit;;
    esac
    
    if [[$1 == '']];then
        help;
        exit;
    fi
    
    CMDOPTS="$*"
    for OPTS in $CMDOPTS;
    do
        key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
        value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
        case "$key" in
            --ssl-domain) SSL_DOMAIN=$value ;;
            --ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
            --ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
            --ssl-size) SSL_SIZE=$value ;;
            --ssl-date) SSL_DATE=$value ;;
            --ca-date) CA_DATE=$value ;;
            --ssl-cn) CN=$value ;;
        esac
    done
    
    # CA 相干配置
    CA_DATE=${CA_DATE:-3650}
    CA_KEY=${CA_KEY:-cakey.pem}
    CA_CERT=${CA_CERT:-cacerts.pem}
    CA_DOMAIN=cattle-ca
    
    # ssl 相干配置
    SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
    SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
    SSL_DATE=${SSL_DATE:-3650}
    SSL_SIZE=${SSL_SIZE:-2048}
    
    ## 国家代码(2 个字母的代号), 默认 CN;
    CN=${CN:-CN}
    
    SSL_KEY=$SSL_DOMAIN.key
    SSL_CSR=$SSL_DOMAIN.csr
    SSL_CERT=$SSL_DOMAIN.crt
    
    echo -e "\033[32m ---------------------------- \033[0m"
    echo -e "\033[32m       | 生成 SSL Cert |       \033[0m"
    echo -e "\033[32m ---------------------------- \033[0m"
    
    if [[-e ./${CA_KEY} ]]; then
        echo -e "\033[32m ====> 1. 发现已存在 CA 私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,而后从新创立 \033[0m"
        mv ${CA_KEY} "${CA_KEY}"-bak
        openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
    else
        echo -e "\033[32m ====> 1. 生成新的 CA 私钥 ${CA_KEY} \033[0m"
        openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
    fi
    
    if [[-e ./${CA_CERT} ]]; then
        echo -e "\033[32m ====> 2. 发现已存在 CA 证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,而后从新创立 \033[0m"
        mv ${CA_CERT} "${CA_CERT}"-bak
        openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
    else
        echo -e "\033[32m ====> 2. 生成新的 CA 证书 ${CA_CERT} \033[0m"
        openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
    fi
    
    echo -e "\033[32m ====> 3. 生成 Openssl 配置文件 ${SSL_CONFIG} \033[0m"
    cat > ${SSL_CONFIG} <<EOM
    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [v3_req]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth, serverAuth
    EOM
    
    if [[-n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} ]]; then
        cat >> ${SSL_CONFIG} <<EOM
    subjectAltName = @alt_names
    [alt_names]
    EOM
        IFS=","
        dns=(${SSL_TRUSTED_DOMAIN})
        dns+=(${SSL_DOMAIN})
        for i in "${!dns[@]}"; do
          echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
        done
    
        if [[-n ${SSL_TRUSTED_IP} ]]; then
            ip=(${SSL_TRUSTED_IP})
            for i in "${!ip[@]}"; do
              echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
            done
        fi
    fi
    
    echo -e "\033[32m ====> 4. 生成服务 SSL KEY ${SSL_KEY} \033[0m"
    openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
    
    echo -e "\033[32m ====> 5. 生成服务 SSL CSR ${SSL_CSR} \033[0m"
    openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
    
    echo -e "\033[32m ====> 6. 生成服务 SSL CERT ${SSL_CERT} \033[0m"
    openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
        -CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
        -days ${SSL_DATE} -extensions v3_req \
        -extfile ${SSL_CONFIG}
    
    echo -e "\033[32m ====> 7. 证书制作实现 \033[0m"
    echo
    echo -e "\033[32m ====> 8. 以 YAML 格局输入后果 \033[0m"
    echo "----------------------------------------------------------"
    echo "ca_key: |"
    cat $CA_KEY | sed 's/^/  /'
    echo
    echo "ca_cert: |"
    cat $CA_CERT | sed 's/^/  /'
    echo
    echo "ssl_key: |"
    cat $SSL_KEY | sed 's/^/  /'
    echo
    echo "ssl_csr: |"
    cat $SSL_CSR | sed 's/^/  /'
    echo
    echo "ssl_cert: |"
    cat $SSL_CERT | sed 's/^/  /'
    echo
    
    echo -e "\033[32m ====> 9. 附加 CA 证书到 Cert 文件 \033[0m"
    cat ${CA_CERT} >> ${SSL_CERT}
    echo "ssl_cert: |"
    cat $SSL_CERT | sed 's/^/  /'
    echo
    
    echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
    echo "cp ${SSL_DOMAIN}.key tls.key"
    cp ${SSL_DOMAIN}.key tls.key
    echo "cp ${SSL_DOMAIN}.crt tls.crt"
    cp ${SSL_DOMAIN}.crt tls.crt

应用阐明如下

--ssl-domain: 生成 ssl 证书须要的主域名,如不指定则默认为 www.rancher.local,如果是 ip 拜访服务,则可疏忽;--ssl-trusted-ip: 个别 ssl 证书只信赖域名的拜访申请,有时候须要应用 ip 去拜访 server,那么须要给 ssl 证书增加扩大 IP,多个 IP 用逗号隔开;--ssl-trusted-domain: 如果想多个域名拜访,则增加扩大域名(TRUSTED_DOMAIN), 多个 TRUSTED_DOMAIN 用逗号隔开;--ssl-size: ssl 加密位数,默认 2048;--ssl-cn: 国家代码(2 个字母的代号), 默认 CN;生成一个 10 年有效期的应用示例: 
./create_self-signed-cert.sh --ssl-domain=rancher.xxx.com \
--ssl-trusted-ip=10.11.0.220,10.128.2.52,10.128.2.53 --ssl-size=2048 --ssl-date=3650
  • 证书提交

    # rancher 命名空间新建
    kubectl create namespace cattle-system
    # 创立 secret
    kubectl create secret generic tls-ca -n cattle-system --from-file=cacerts.pem
    kubectl create secret tls tls-rancher-ingress -n cattle-system --cert=./tls.crt --key=./tls.key

装置 Rancher

# helm 装置 rancher
helm install rancher rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=rancher.xxx.com \
  --set ingress.tls.source=secret \
  --set privateCA=true

# helm 更新 rancher
helm upgrade --install rancher rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=rancher.xxx.com \
  --set ingress.tls.source=secret \
  --set privateCA=true

能够通过 kubectl 命令查看相干启动状况,这个过程会继续一会,整个 rancher 集群状态才会变为 active。

kubectl get ingress -n cattle-system
kubectl -n cattle-system rollout status deploy/rancher

应用 Rancher

在拜访 Rancher 页背后若应用的是内网 IP 域名映射,须要本机 host 配置映射域名和 IP。浏览器拜访域名

呈现以上页面,设置好明码后就能够失常应用 rancher 了。

设置阿里源

零碎设置里

设置为

registry.cn-hangzhou.aliyuncs.com

创立自定义集群

郑重忠告

先说说我掉的坑,我用来创立的集群的机器不是洁净的,下面既有 Java 过程,也有 Docker 部署的服务。集群创立后,Java 过程失常,然而 Docker 部署的服务全都拜访不通,我猜测是因为集群创立时设置了 CNI,从而影响到了 Docker 的网络设置。

所以我郑重倡议:在应用 Rancher 创立治理自定义集群时,最好应用洁净的无服务部署的机器,切忌下面有蕴含 Docker 部署的服务。

创立集群

Rancher 创立集群的过程我就不具体说了,不停下一步就行了,最初会呈现节点机器退出集群的命令,在相干机器上执行命令就行。整个集群创立的过程让我总结就是一个字:期待!可能会比拟漫长。。。

各个节点机器上会下载很多镜像,启动多个容器

Rancher 镜像上也会展现集群以后的信息

对我来说是很漫长的流程,至多比有的人说的 7,8 分钟要漫长多。

集群状态未胜利当前,能够下载 Kubeconfig 文件到本地的,便可通过 kubectl 操作集群。

对于仪表盘报错以及 kubectl 命令行 1006 的问题

Kubernetes 集群创立胜利后,发现 2 个问题:

  • 点击集群仪表盘报错,进去后空白页
  • 执行 kubectl 命令行 按钮点击后呈现 1006 报错

于是通过 kubectl 命令行查看 pod 状况

发现 cattle-cluster-agent2 个节点处于 CrashLoopBackOff 状态,并一直在重启。于是查看日志

发现 rancher.xxx.com 域名拜访不通,集群中节点不晓得 rancher.xxx.com 是谁,须要进行如下配置

kubectl -n cattle-system patch  deployments cattle-cluster-agent --patch '{"spec": {"template": {"spec": {"hostAliases": [
                    {
                        "hostnames":
                        ["rancher.xxx.com"],
                            "ip": "10.11.0.220"
                    }
                ]
            }
        }
    }
}'
# 配置 cattle-node-agent
kubectl -n cattle-system patch  daemonsets cattle-node-agent --patch '{"spec": {"template": {"spec": {"hostAliases": [
                 {
                     "hostnames":
                        ["rancher.xxx.com"],
                            "ip": "10.11.0.220"
                 }
             ]
         }
     }
 }
}'

配置后一切正常。

清理节点

装置过集群的节点,如果须要卸载,须要执行官网提供的清理脚本,否则官网说了不保障下次会胜利。

其实这个过程消耗了我不少工夫,官网文档很全,然而在程序上有待商讨,当然也有我本人的锅。这篇文章到此草草完结,后续在部署利用方面还会再波及,到时再见。

退出移动版