写点什么

Step by Step!Rancher 2.2+K3s 集成部署实践教程

  • 2020-05-16
  • 本文字数:6059 字

    阅读完需:约 20 分钟

Step by Step!Rancher 2.2+K3s集成部署实践教程

在生产环境中,很多时候我们都会有这样的需求:


  • 业务弹性需求较大,反复安装卸载修改配置文件会对环境造成极大破坏,甚至需要重装系统以清理环境

  • 将业务迁移到 Docker 架构,但使用传统的 Docker CLI (Docker 命令行) 方式进行管理,效率低下还容易误操作

  • 将业务迁移到 K8s 架构,但因为 K8s 过于占用系统资源,往往在开发环境或者小型的生产环境,K8s 刚跑起来系统就没可用性能资源了

  • K8s 手动部署起来一路尽是无底深坑,历尽千辛终于配好了,稍稍改动下配置文件整个集群开始出现问题

  • 需要个简单直观管理工具,能够简单快速的管理各个 K8s 集群,灵活创建 Pod


在我接触 K8S 架构之初,也遇到了类似的问题:使用 Rancher2.x+K8s 这样的架构,在一台 1C2G 的阿里云上面部署,部署完成后发现系统内存早就被吃得一干二净,业务部署更是无从谈起;使用传统的 Docker Swarm,感觉用起来没有 K8S 那样顺手舒服。


2019 年 2 月 26 日,业界领先的容器管理软件提供商 Rancher Labs 推出了轻量级Kubernetes发行版 K3s ,这款产品专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计。这对于一些小型的开发/生产环境、边缘计算节点甚至性能极其有限的设备(比如树莓派 3)来讲无疑是福音。


但问题来了,K3s 相对于 K8s,精简了不少功能。那么如何正确的对接 Rancher 2.x 和 K3s 呢?思考了许久,也在自己的时间环境埋头研究了一周,终于做出来一套完整的部署教程。好东西当然要共享,也为那些部署 Rancher+K3s 架构的同好们提供一些常见问题的解决思路。


那么,教程,现在开始。

Step 0: 配置环境要求

虽然 K3S 是 K8S 的轻量版,但也不能无视配置要求。官方配置要求如下:


  • 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)

  • K3S Server 端最低内存要求:512 MB

  • K3S Agent 端内存最低要求:75MB

  • 磁盘空间最低要求:200 MB

  • 支持的硬件架构:x86_64, ARMv7, ARM64


相对于 K8S 那种性能杀手,K3S 可以轻量到部署在大多数虚拟机上(比如常见的 1C512M,不过如果部署在生产环境,建议 1C2G 及以上以保证稳定性)。如果你还要再同一台 Server 上同时跑 Rancher 2.x Server 的话,我建议最低配置要求如下:


  • 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)

  • CPU 最低核心数:1 核心

  • Rancher 2.x Server + K3S Server + K3S Agent 端最低内存要求:2 GB

  • 磁盘空间最低要求:5 GB

  • 建议使用的硬件架构:x86_64


虽然 K3S 足够轻量,但也请不要忘记,Rancher Server 本身也是需要占用掉大量内存的。所以如果是为了做成 AIO (All In One)的效果,建议按照上述的配置要求准备 Server。

Step 1: 安装 Docker 环境

虽然 K3S 默认集成的是 Containerd,但出于多方面原因,为了后续部署方便起见,这里我们将 Containerd 换成 Docker。具体的原因我会在下文解释。


本文以 Debian 9 x64 系统作为示例,Ubuntu 可以直接照搬 Debian 的安装过程,CentOS 用户我会特殊标注操作步骤。


如果你的服务器在中国大陆境内:


curl -fsSL "https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg" | apt-key add -echo "deb [arch=amd64] https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/ stretch stable" < /etc/apt/sources.list.d/docker.listapt-get update && apt-get install -y docker-ce
复制代码


如果你的服务器在海外:


curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -echo "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.listapt-get update && apt-get install -y docker-ce
复制代码


CentOS 系统或者以上方法无法安装的,请使用官方安装脚本:


curl -fsSL get.docker.com | sh
复制代码


也许会有人问,安装的时候为什么去掉了 --no-install-recommends 参数?


因为需要用到里面的 cgroup 支持,当然,你也可以加上这个参数,来只安装基础的 Docker 组件,同样能够支持运行。


在安装完成后,如果你的服务器位于中国大陆境内,你很有可能需要一个 Docker 镜像加速器。国内提供 Docker 镜像加速器的服务商很多,这里我们以阿里云的镜像加速服务为例:


  • 打开 https://cr.console.aliyun.com ,并登录你的阿里云账户

  • 点击左方的【镜像中心 - 镜像加速器】,然后在下方会有一个操作文档,复制其中的命令,粘贴到你的 SSH 窗口中即可完成镜像源的更换。


如果报错误 sudo: command not found ,只需要去掉每行命令中的 sudo 即可 (前提是你的当前登录用户为 root)

Step 2: 安装 Rancher Server

此部分可以参考教程:

https://www.cnrancher.com/quick-start


Rancher Server 名字听起来感觉像是又要装很多东西,其实并非如此。Rancher Server 只是一个 Docker 镜像,整个 Rancher 的程序都使用 Docker 打包起来了。所以相对来讲配置很简单,只需要一条命令:


docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 80:80 -p 443:443 rancher/rancher:stable
复制代码


然后等待几分钟,之后访问你的 Server IP 即可进入 Rancher Server 的首次配置界面。


如果你不想让 Rancher 占用你的 80/443 端口(比如前端要放个 Caddy 反代),只需要按照以下步骤操作:


  • 修改启动命令行:

  • 将里面的 80 和 443,替换为你需要的端口(注意:请不要占用 Kubernetes 的 6443 端口,这一步很容易翻车!),换完的效果大概是这样:

  • 启动 Rancher Server 容器

  • 执行命令,确认 Rancher Server 容器的 Container ID,本例中的容器 ID 为 31aa94998b75:

  • 执行命令,切入到 Rancher Server 容器的 Bash Shell 中(TTY):

  • 此时你会发现你的提示符变成了这个样子:

  • 这时候你控制的就是 Rancher Server 的容器,如果你能够成功切入 Shell,那么请继续下一步,如果未能切入,请使用 docker logs 31aa94998b75 来确认容器是否出现故障。

  • 我们先看下要改的文件长什么样子:

  • 执行命令,替换默认的端口:

  • 执行后看下变成了什么样子


#!/bin/bashset -e
exec tini -- rancher --http-listen-port=9080 --https-listen-port=9443 --audit-log-path=${AUDIT_LOG_PATH} --audit-level=${AUDIT_LEVEL} --audit-log-maxage=${AUDIT_LOG_MAXAGE} --audit-log-maxbackup=${AUDIT_LOG_MAXBACKUP} --audit-log-maxsize=${AUDIT_LOG_MAXSIZE} "${@}""
复制代码


  • 确认修改成功后,使用 exit 命令退出容器的 Bash Shell,之后执行命令重新启动 Rancher Server 容器:

  • 之后使用新的端口访问 Rancher Server 的 UI(下面的连接为例子):

  • 访问会提示 SSL 证书无效,无视错误继续即可

  • https://rancher.example.com:9443/


  • 此时我们会来到 Rancher 的初始化部署页面,在此页面输入默认的全局管理员密码,创建全局管理员账户。


  • 这一步输入我们的 Rancher API Endpoint,注意这里输入的 URL 一定要保证整个集群内的所有节点都可以正常连接。


  • 之后我们会来到主界面,如果对英文操作看着头疼的话,右下角可以切换语言。

  • 具体方法是点击右下角的 English ,然后下拉选择 简体中文(zh-hans) 即可。

  • 汉化设置会跟随你的 Cookies 走,所以不换电脑或者不重装系统的话应该不会自动换回英语。


  • 我们接下来在 Rancher 中创建一个新的集群,点击页面上的【创建集群】按钮,开始创建一个新的 K8S/K3S 集群。


注意:在这里请选择 导入现有的 Kubernetes 集群 (Import) ,而不是其他的新建选项!


![](https://static001.infoq.cn/resource/image/7a/f0/7ae60b34a03665856b3dcd87bedda2f0.png)
复制代码


  • 下方的集群名称随意输入一个即可,反正以后可以随意改。


成员角色目前无需改动,直接点击【创建】完成向导。


![](https://static001.infoq.cn/resource/image/bb/19/bba01a6115171d14fc0419f4fd5e4819.png)
复制代码


  • 完成后我们会得到导入 K3S 集群所需的命令,请保存好第三条命令以备后用。

  • 为什么不是第二条?因为目前访问 HTTPS API 使用的是自签证书,直接用第二条会产生证书不信任的报错。


  • 如果你一不小心关掉了窗口,可以在首页点击右侧的三个点,然后点击升级,就可以看到上面的集群导入命令。


  • 到这一步,我们已经完成了 Rancher Server 端的准备工作。接下来,我们将着手准备部署 K3S 集群。

Step 3: 安装 K3S 集群 - 国内服务器的准备工作

如果你的服务器中国大陆境内,请参考下面的步骤执行;如果你的服务器在海外,请直接跳到 Step 4。


鉴于国内拉取 AWS S3 Bucket 的速度,以及 k8s.gcr.io 被墙的无奈,我在这里额外增加了针对中国大陆境内服务器的步骤。如果你使用的是海外的服务器,这一步你无需操作,请继续下面的教程。


首先,我们下载 K3S 所需的 Binary 到本地服务器(或者在服务器端挂 VPN 进行下载):


https://github.com/rancher/k3s/releases/download/v0.5.0/k3s-arm64


之后上传此 Binary 到服务器端的 /usr/local/bin/k3s,并赋予可执行属性:


chmod +x /usr/local/bin/k3s
复制代码


这一步完成后,我们来着手解决最头疼的问题:pause 镜像被墙无法拉取。


这个镜像对于很多刚接触 K8S 的用户来讲非常头疼,我也是在这里卡了好久最后才算弄出来个解决方案。


出于大家的部署方便考虑,我将这份镜像制成了多份副本并分发出来,大家可以根据自己的需求选择最佳的解决方案。


阿里云北京镜像分流:


docker pull registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1docker tag registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
复制代码


阿里云上海镜像分流:


docker pull registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1docker tag registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
复制代码


阿里云广州镜像分流:


docker pull registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1docker tag registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
复制代码


Google Mirror 分流 (Docker Hub):


docker pull mirrorgooglecontainers/pause:3.1docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
复制代码


本地镜像分流 (tar 包格式):


wget -qO- https://download.ilemonrain.com/Kubernetes/pause-amd64/pause.tar | docker load
复制代码


完成镜像导入后确认是否导入成功:


docker images | grep "k8s.gcr.io/pause"
复制代码


如果出现类似于这样的结果:


k8s.gcr.io/pause 3.1     da86e6ba6ca1  17 months ago  742kB
复制代码


则说明导入成功,可以继续接下来的步骤。

Step 4: 安装 K3S 集群

接下来,我们开始 K3S 集群的部署。


官方提供了很好用的一键安装脚本,我们只需要使用一键脚本即可完成 K3S 环境的安装:


curl -sfL https://get.k3s.io | sh -
复制代码


安装完成后,我们需要调整下 K3S 的服务配置文件,以将 K3S 的默认容器引擎从 Containerd 切换到 Docker。


修改 K3S 服务的配置文件:


vim /etc/systemd/system/multi-user.target.wants/k3s.service
复制代码


文件内容如下:


[Unit]Description=Lightweight KubernetesDocumentation=https://k3s.ioAfter=network-online.target
[Service]Type=notifyEnvironmentFile=/etc/systemd/system/k3s.service.envExecStartPre=-/sbin/modprobe br_netfilterExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/k3s serverKillMode=processDelegate=yesLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityTimeoutStartSec=0Restart=always
[Install]WantedBy=multi-user.targe
复制代码


在这里我们需要修改 ExecStart 的值,将其修改为:


/usr/local/bin/k3s server --docker --no-deploy traefik
复制代码


之后保存退出,执行命令重新加载新的服务配置文件:


systemctl daemon-reload
复制代码


完成后重启 K3S 服务:


service k3s restart
复制代码


稍等数十秒,之后通过命令确认 K3S 集群是否就绪:


k3s kubectl get node
复制代码


如果得到类似如下的结果:


NAME                  STATUS   ROLES    AGE     VERSIONk3s01.ilemonrain.io   Ready    <none>   3m34s   v1.14.1-k3s.4
复制代码


则说明 K3S 集群启动成功。

Step 5: 导入 K3S 集群到 Rancher

还记得在 Step 2 中保存好的导入命令么?是时候该派上用场了。


现在的 Rancher Server 上,显示集群状态为 Pending,就像这样:



这是因为我们还未导入集群,这一步我们将导入集群,并建立 Rancher Server 与 K3S 集群的联系。


在 K3S 的主控节点(一般情况下,第一个节点都是主控制器,也叫 Server 节点)上,执行命令,导入集群:


curl --insecure -sfL https://10.248.21.2/v3/import/jr42wvdhk4w94htxxtf5hv424rsjjz6hzq9vl2lj8q9dnb8dgcwgzn.yaml | kubectl apply -f -
复制代码


注意:每个集群的导入命令都不一样,请不要直接照搬教程中的导入命令!


之后 Shell 中会返回一下信息,说明集群导入配置成功:


namespace/cattle-system createdserviceaccount/cattle createdclusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding createdsecret/cattle-credentials-7c9ef0a createdclusterrole.rbac.authorization.k8s.io/cattle-admin createddeployment.extensions/cattle-cluster-agent createddaemonset.extensions/cattle-node-agent created
复制代码


回到 Rancher 界面,稍微等数十秒,我们会发现 Pending 状态变成了 Waiting 状态:



出现这个提示说明 Rancher 已经收到 K3S 的注册请求,正在完成 K3S 集群的注册工作,再等数十秒种的时间即可完成 K3S 集群的导入工作:



到这里,我们成功完成了 Rancher 2.x 和 K3S 的对接工作,可以像操作 K8S 集群那样操作 K3S 集群了。

Step X: 一点小小的总结

为什么我会用 K3S 来取代 K8S,主要是因为自己手里的服务器配置不太够,如果贸然上 K8S 的话,会导致系统资源全被 K8S 吃光,从而没有资源再去跑其他的业务。谨以此文,希望能够做各位运维、开发、Geeker 前行路上的指路明灯,为大家扫清前进的障碍,加速业务容器化的迁移进程。


作者:iLemonrain


来源:https://blog.ilemonrain.com/docker/rancher-with-k3s.html


2020-05-16 17:174615

评论

发布
暂无评论
发现更多内容

esp8266~lwip突破MTU最大1500限制,apt编译时期自动生成代码&动态类加载

android 程序员 移动开发

Flutter 2,面试官问的那些Android原理你都懂吗

android 程序员 移动开发

Flutter _ 你真的会用 Slider 组件吗?(1),androidapp开发入门

android 程序员 移动开发

Flutter 扩展NestedScrollView (二)列表滚动同步解决(2)

android 程序员 移动开发

DialogFragment探索与实现,android高级工程师面试题

android 程序员 移动开发

Flutter 2(1),字节跳动高工面试

android 移动开发

压缩性能提升10-20倍,TDengine助力零跑科技实现性能和成本最优化

TDengine

数据库 大数据 tdengine 后端

FFmpeg之OpenGL绘制与Native Window绘制(五),安卓面试题及答案2020百度

android 程序员 移动开发

新一代云原生的微服务架构分享

鲸品堂

云原生

Flutter Dio二次封装,Android开发还不会这些

android 程序员 移动开发

Flutter App的启动流程,kotlin单例模式

android 程序员 移动开发

Flutter 与 原生交互(Android),含BATJM大厂

android 程序员 移动开发

上万规模数据湖如何在实验室测试

华为云开发者联盟

容器 数据湖 测试 MRS 集群

Flutter 扩展NestedScrollView (二)列表滚动同步解决(1)

android 程序员 移动开发

Dagger2入门系列一:基础使用,从基础到源码统统帮你搞定

android 程序员 移动开发

架构训练营模块七作业-王者荣耀商城异地多活架构设计

李焕之

Flutter 插件使用必知必会,我的阿里春招之路分享

android 程序员 移动开发

百度爱番番数据分析体系的架构与实践

百度Geek说

架构 数据分析 后端

模块七:王者荣耀商城异地多活架构设计

apple

Flutter GetX使用---简洁的魅力!,Android高级

android 程序员 移动开发

Flutter _ 你真的会用 Slider 组件吗?,kotlin中文文档pdf

android 程序员 移动开发

Flutter 中 Wrap 的使用详解(含对比图) _ Flutter Widgets

android 程序员 移动开发

DialogFragment探索与实现(1),2021年是做安卓开发人员的绝佳时机

android 程序员 移动开发

Flutter 1,基于h5框架的移动app开发

android 程序员 移动开发

Flutter 命令本质之 Flutter tools 机制源码深入分析,kotlin实战

android 程序员 移动开发

Flutter 性能优化 Tips,Android攒了一个月的面试题及解答

android 程序员 移动开发

Flutter 扩展NestedScrollView (二)列表滚动同步解决

android 程序员 移动开发

测试用例又双叒叕失败了,NLP帮你来分析

华为云开发者联盟

软件 测试 nlp 测试用例

Dalvik 和 ART 有什么区别?深扒 Android 虚拟机发展史,真相却出乎意料

android 程序员 移动开发

Python代码阅读(第53篇):字符串重复拼接

Felix

Python Code 字符串 阅读代码 Python初学者

Flutter 中获取屏幕以及 Widget 的宽高,flutter小程序开发

android 程序员 移动开发

Step by Step!Rancher 2.2+K3s集成部署实践教程_文化 & 方法_Rancher_InfoQ精选文章