Rancher是什么
Rancher是一個開源的企業級容器管理平臺。通過Rancher,企業再也不必自己使用一系列的開源軟件去從頭搭建容器服務平臺。Rancher提供了在生產環境中使用的管理Docker和Kubernetes的全棧化容器部署與管理平臺。
為什么需要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留下來的東西就好了.
參考這篇官方文章: 清理主機
一般如下操作
-
docker volume rm etcd
, 如果提示它被某個容器使用了就停止掉這個容器后再操作 -
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
容器的日志
會發現有這樣的報錯:
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>