前言

前文搭建了高可用的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 -ehelp (){    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;;esacif [[ $1 == '' ]];then    help;    exit;fiCMDOPTS="$*"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 ;;    esacdone# 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.keySSL_CSR=$SSL_DOMAIN.csrSSL_CERT=$SSL_DOMAIN.crtecho -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}fiif [[ -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}"fiecho -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"cat > ${SSL_CONFIG} <<EOM[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentextendedKeyUsage = clientAuth, serverAuthEOMif [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} ]]; then    cat >> ${SSL_CONFIG} <<EOMsubjectAltName = @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    fifiecho -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"echoecho -e "\033[32m ====> 8. 以YAML格局输入后果 \033[0m"echo "----------------------------------------------------------"echo "ca_key: |"cat $CA_KEY | sed 's/^/  /'echoecho "ca_cert: |"cat $CA_CERT | sed 's/^/  /'echoecho "ssl_key: |"cat $SSL_KEY | sed 's/^/  /'echoecho "ssl_csr: |"cat $SSL_CSR | sed 's/^/  /'echoecho "ssl_cert: |"cat $SSL_CERT | sed 's/^/  /'echoecho -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"cat ${CA_CERT} >> ${SSL_CERT}echo "ssl_cert: |"cat $SSL_CERT | sed 's/^/  /'echoecho -e "\033[32m ====> 10. 重命名服务证书 \033[0m"echo "cp ${SSL_DOMAIN}.key tls.key"cp ${SSL_DOMAIN}.key tls.keyecho "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# 创立secretkubectl create secret generic tls-ca -n cattle-system --from-file=cacerts.pemkubectl create secret tls tls-rancher-ingress -n cattle-system --cert=./tls.crt --key=./tls.key

装置Rancher

# helm装置rancherhelm install rancher rancher-stable/rancher \  --namespace cattle-system \  --set hostname=rancher.xxx.com \  --set ingress.tls.source=secret \  --set privateCA=true# helm更新rancherhelm 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-systemkubectl -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-agentkubectl -n cattle-system patch  daemonsets cattle-node-agent --patch '{ "spec": {     "template": {         "spec": {             "hostAliases": [                 {                     "hostnames":                        [                            "rancher.xxx.com"                        ],                            "ip": "10.11.0.220"                 }             ]         }     } }}'

配置后一切正常。

清理节点

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

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