Rancher v1入门

Rancher是什么

Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。

官网: https://www.rancher.cn/

为什么需要Rancher

在原来, 如果我们需要做一个分布式集群我们需要学习一全套的框架并编码实现如 服务发现, 负载均衡, 多主机组网等逻辑, 在复杂的同时还对我们的业务应用有极大的入侵, 如何解决呢? 如果你了解Docker的话, 一定就知道Kubernetes, kubernetes就能在基础层解决这些问题, 让上层应用该怎么开发就怎么开发.

于是你去学习大名鼎鼎的kubernetes, 发现好像有点复杂啊, 有没有更傻瓜化一点的? 那就是rancher了.

使用Rancher (v1)

本文基于Rancher V1.x版本编写, 没有更新Rancher2.0的用法, 因为Rancher V2变化很大, 笔者还没来得及升级.

rancher-server

rancher-server 主要负责图形化管理主机容器, 并且储存用户的数据(账号, 主机信息, 应用(task)等).

他是一个管理者, 管理工作机(rancher-agent)应该启动什么容器.

启动

启动一个单节点server, 并将数据库数据挂载到宿主机, 保证容器删除后数据还在.

sudo docker run -d -v /workspace/rancher/mysql:/var/lib/mysql --restart=unless-stopped -p 8081:8080 rancher/server

稍等片刻就能通过访问8081端口进入到Rancher UI

因为rancher前端使用ws和后端通讯, 所以如果使用nginx作为代理访问这个服务器需要这样设置:

server {
        listen 80;
        server_name rancher.bysir.store;

        location / {
                proxy_set_header Host $http_host;
                proxy_pass http://127.0.0.1:8081;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

        }
}

配置

添加登陆账号

在"ADMIN->Access Contor"添加一个管理员用于登陆, 我使用的是本地认证方式, 没遇到什么问题就不赘述了.

添加新环境

在rancher-server中默认内置了一个Cattle Template的环境, 我也不知道Cattle是个啥, 我们还是用Kubernetes吧, 眼熟.

点击Add Environment按钮

这段话我们用中文版本来看:

Rancher 支持将资源分组归属到多个环境。 每个环境具有自己独立的基础架构资源及服务,并由一个或多个用户、团队或组织所管理。
例如,您可以创建独立的“开发”、“测试”及“生产”环境以确保环境之间的安全隔离,将“开发”环境的访问权限赋予全部人员,但限制“生产”环境的访问权限给一个小的团队。

先建一个Test试一试


在这个页面点击添加一个主机


rancher-agent

rancher-agent 是用来执行具体工作的机器, 容器运行在这些机器上.

按照提示来添加主机:


在第四步的输入框中填写上主机的ip地址, 在这里我填写的是10.117.195.190, 这个ip使用来给ipsec组网的, 所以需要暴露UDP的500和4500端口.

rancher在这里叫你添加的是公网ip, 但在实际生产环境中, 不可能每个主机都有公网ip并且也不应该使用公网建立网络, 所以我们在这里填写内网(私网)ip地址, 只要保证当你添加多个主机的时候他们之间的UDP500和4500能互相访问.

PS: 可以通过以下代码测试端口连通性:

$ nc -u -z -v 10.25.170.125 4500
Connection to 10.25.170.125 4500 port [udp/ipsec-nat-t] succeeded!

PPS: 阿里的只需要主机在同一个安全组就能实现内网所有端口互通

复制第五步的代码到主机上执行, 执行之后可以通过以下代码看它的运行情况:

docker logs rancher-agent

稍等片刻你就能在rancher的web页面"INFRASTRUCTURE->Hosts"下找到你刚刚添加的主机.

这时候能看到这个主机的很多服务(容器)正在启动, 不出意外的话能看到这个样子的主机:


图太长了, 没截完, 反正全绿就可以了

疑难杂症

如果遇到红色无法启动的容器, 首先查看日志, 找找有用信息, 然后尝试以下操作:

  • 按照错误日志排错, 通过: 经验(玄学), google, github issue
  • 手动点击重启这个错误容器
  • 看一下列出的我遇到的错误(特别是 重新部署某个主机)

重新部署某个主机

当我们在测试或者某个主机出现某些难以解决的错误的时候, 会经常使用重启大法, 注意在重新将这个主机加入到rancher集群之前需要清理到原来运行的container以及挂载出来的volume, 否则的话, 当再次启动rancher/agent之后你会发现很多服务启动不了, 如etcd, kubernetes; 一般来说, 只需要清理 kubernetes留下来的东西就好了.

参考这篇官方文章: 清理主机

一般如下操作

  1. docker volume rm etcd, 如果提示它被某个容器使用了就停止掉这个容器后再操作
  2. rm -rf /var/etcd/backups, 删除etcd挂载出来的数据

ipsec unhealthy

ipsec会将所有主机组网, 当其中有某个主机连接不上的时候其他ipsec节点也会unhealthy, 这时候就需要检查是那个主机的问题, 看其UDP的500和4500端口是否能与其他主机互相访问.

ipsec 无法启动

ipsec会向rancher-server机器请求得到其他主机的ip地址以实现组网.

但我通过查看ipsec的错误日志发现这个ipsec容器访问不到rancher-server机器的外网地址, 登陆容器执行命令发现curl http://www.baidu.com都报错, 这种情况下... 我选择重启docker(没办法了啊, 如果读者有解决方案感谢告诉我哦).

但请谨慎操作呀 service docker restart会重启所有的容器, 这将导致所有服务不可用.

etcd无法启动

好像etcd无法启动和ipsec没有正常运行有关, 所以先解决ipsec的问题

在上面说了记得删除volume etcd

更多的可以参考这篇官方文章: 灾难恢复

etcd节点无限重启

如果你在"INFRASTRUCTURE->Containers"中看到红色的etcd容器并且在不断重启, 不要惊讶.


灾难恢复中说到 Rancher在三个不同的主机上运行多达三个 etcd 实例, 猜测Rancher会一直在不同的主机上启动etcd直到满足三个节点, 不过etcd也支持低于三个节点的, 所以正常使用是没问题的. 如果实在看不顺眼就添加3个或以上的主机.

运行在Rancher的Nginx反代报错: no resolver defined to resolve xxxx

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass http://api;
        proxy_set_header   Authorization "";
    }
}

这是一个简单的反代功能, 但在Rancher环境中是无法工作的, nginx会报错: no resolver defined to resolve api.

这是因为在Docker环境中, 需要使用Docker自带的Dns服务器才能找对host对应的ip.

所以需要这样:

server {
    listen       80;
    server_name  localhost;
    // for Docker 
    // resolver 127.0.0.11 ipv6=off;
    // for Rancher
    resolver 169.254.169.250 ipv6=off;

    location / {
        proxy_pass http://api;
        proxy_set_header   Authorization "";
    }
}

在原生Docker中使用127.0.0.11作为Dns服务器, Rancher中使用169.254.169.250作为Dns服务器, 它们都是固定的, 可以写死.

参考:

更多信息请Google关键字: docker nginx resolve.

用nginx反代Rancher中的服务

由于nginx可能会缓存proxy_pass中的域名指向的IP, 如果proxy_pass的域名指向的ip是动态的, 那么可能需要这样写

server {
    listen       80;
    server_name  localhost;
    // for Docker 
    // resolver 127.0.0.11 ipv6=off;
    // for Rancher
    resolver 169.254.169.250 ipv6=off;
    # 通过变量设置的proxy_pass不会被缓存
    # 同时必须设置 resolver
    set $api "api";

    location / {
        proxy_pass http://$api;
        proxy_set_header   Authorization "";
    }
}

这样的写法并不优雅, 更好的办法是使用动态后端, 可是nginx平民版不支持, 但Tengine可以, 你可以试一试.

容器无法联网

最近又在自己家里搭建了一个Rancher平台, 使用的是之前淘汰的笔记本, 刷上Ubuntu 20 Desktop, 又踩上坑了.

用Go写的程序, 在发起http请求时报错: lookup xxx.org on 169.254.169.250:53: server misbehaving.

看得出来是dns服务器错误, 169.254.169.250是Rancher自建的DNS服务器, 用来实现服务发现.

打开network-services/metadata/dns容器的日志

image.png

会发现有这样的报错:

msg="Recurser error: dial udp: address fe80::1%3: too many colons in address fqdn=xxx.org. resolver=fe80::1%3"

继续进入到容器中打印resolv.conf

# cat /etc/resolv.conf
search network-services.rancher.internal metadata.network-services.rancher.internal
nameserver fe80::1%3

然后ping baidu.com都说unknown host,

猜测就是这个奇怪的fe80::1%3导致的问题.

本以为找到了错误就好解决这个问题, Google嘛, 但发现怎么也搜不到相关信息.

各种尝试:

  • 禁用掉ipv6 [×]
  • 禁用掉ipv6之后重装rancher-agent [×]
  • 指定服务器使用DNS解析: 8.8.8.8 [√]

终于再次打印resolv.conf发现nameserver 变为了8.8.8.8

# cat /etc/resolv.conf
search network-services.rancher.internal metadata.network-services.rancher.internal
nameserver 8.8.8.8

现在也可以其他容器也正常联网了.

猜测metadata/dns会自动读取网络配置中的DNS, 但我设置了手动配置IP(固定IP), metadata/dns读取DNS的逻辑可能就会有问题.

rancher-server节点无法启动

报错:

....liquibase.exception.LockException: Could not acquire change log lock. Currently locked by <container_ID>

参考官方文档解决: https://rancher.com/docs/rancher/v1.6/en/faqs/server/#why-is-rancher-server-frozen-or-why-could-my-upgrade-have-failed

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容