使用Portainer集中管理多地域內網執行的Docker例項

流水理魚發表於2019-12-19

1. 單機執行的Docker

容器化部署是現在進行時,開源應用大多數支援容器化部署在少量機器的場景下往往採用docker cli 和 docker-compose管理,進行“單機式管理”機器稍多點會採用Docker Swarm群集的方式,畢竟k8s稍重如果有更多的機器情況下一般會採用k8s的方式在個人、創業公司、小團隊的場景下我們往往在多個雲、家裡、vps上擁有少量虛擬機器伺服器,這些伺服器上都執行了docker例項雖然我們也可以用公網vpn、zerotier等方式打通各個地域的機器形成一個內網,從而構建“群集”,但實際情況是沒那麼多頻寬,從而無法“負載均衡”,所以實際的實際還是獨立使用受限制於公網頻寬很小,只能獨立使用我們也擁有一些4G移動流量接入這種EDGE邊緣場景的情況,這些IoT上也執行著Docker例項那麼這些NAT內網環境下的Docker例項,公網IP環境下的Docker例項,是否能集中管理?當然可以,用Portainer就挺方便

2. 用Portainer作為Docker例項管理平臺實戰步驟

2.1 主節點-Portainer server主控安裝

選一個7x24小時且有公網IP的節點執行Portainer server主控

docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /data/appdata/portainer:/data portainer/portainer複製程式碼

9000埠為web管理介面埠8000埠為Agent接入埠這2個埠公網IP防火牆都必須放行

瀏覽器開啟web管理介面http://Portainer server主控公網IP:9000

初次訪問設定一個密碼,設定密碼後需要選擇連線docker的方式選第一個Local 然後點選Connect預設進入Home選單,點選這個Local本地docker例項進入其他管理

Portainer官方安裝手冊參考

2.2 配置https nginx代理(可選)

如果不配置https可跳過本節http://你的公網IP:9000 預設沒有https不安全規劃一個域名用於https訪問例如https://portainer.iamle.com用nginx作為接入反向代理到 http://portainerip:9000下面為示例nginx portainer配置(其中包含需要的websocket proxy)

# portainer.iamle.com.conf
map $http_upgrade $connection_upgrade {
    default Upgrade;
    ''      close;
}
upstream portainer {
    server 127.0.0.1:9000;
}
server {
        listen       80;
        server_name portainer.iamle.com;
        return      301 https://$server_name$request_uri;
}
server {

                listen 443 ssl http2;
        server_name portainer.iamle.com;

                ssl_certificate         ssl/iamle.com.cer;
                ssl_certificate_key     ssl/iamle.com.key;
                #ssl_session_cache           shared:SSL:10m;
                #ssl_session_timeout         10m;
                #ssl_session_tickets         off;

                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_ciphers         HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
                ssl_prefer_server_ciphers on;

        location / {
                    proxy_set_header Host              $host;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header X-Forwarded-Port  $server_port;
                    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP         $remote_addr;
                    proxy_set_header X-Request-Id $request_id;
                    proxy_set_header Upgrade           $http_upgrade;
                    proxy_set_header Connection        $connection_upgrade;
                    proxy_read_timeout 60m;
                    proxy_send_timeout 60m;
                    proxy_http_version 1.1;
                    proxy_pass http://portainer;
                    break;
        }


        error_log   /data/logs/portainer.iamle.com-error.log;
        access_log  /data/logs/portainer.iamle.com.log access;

}複製程式碼

2.3 主節點-配置一個在NAT內網Agent客戶端

前面我們已經配置好一個具有公網IP的Portainer管理控制節點那麼現在把內網(NAT、IoT)、公有云、vps等執行的Docker例項來接入控制節點管理

一圖勝千言,官方介紹圖圖中這個Portainer管理了2個內網的Agent其中一個是個Swarm群集,另外一個是個單機

Portainer server上增加一個Edge AgentEndpoints選單 》 Add endpoint 》 Edge Agent

Name:為自定義Portainer server URL:預設為當前Portainer server ip (如果用nginx配置了https可以使用https不加埠號)》 Add endpoint

增加端點後出現

部署客戶端agent 有2種選擇 Standalone 和 Swarm如果已經組過Swarm那麼選Swarm,預設就是Standalone先點選 “Copy command” 複製命令,在Agent客戶端去執行Public IP: 如果有可以設定,這樣在以後部署了docker容器暴露的埠可以自動生成url

2.4 被管理節點-需要被管理的Docker例項客戶端機

在被管理的客戶端終端上執行(內網(NAT、IOT)、公網環境都可以,只要能連線上我們的Portainer server)本例內網1臺ip為 192.168.0.8的機器

docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes -v /:/host --restart always -e EDGE=1 -e EDGE_ID=6ad0f1ff-6fea-4710-97e2-513ef1066fd8 -e CAP_HOST_MANAGEMENT=1 -p 8000:80 -v portainer_agent_data:/data --name portainer_edge_agent portainer/agent:1.5.1複製程式碼

訪問 http://192.168.0.8:8000(如果有公網ip用公網ip)開啟後會有個輸入框輸入上一步獲得的Join token點選Submit 出現 Agent setup OK. You can close this page. 代表完成agent接入

回到 Portainer server管理介面等待上線

點選 iamle-lan-01 等待幾秒鐘

這樣我們就可以管理多個docker例項了

3. 貼士

  • 如果agent執行不起來,無限重啟
    需要根據docker logs portaineredgeagent 獲取到的錯誤資訊排查, 官方github issue是個好去處
    另外發現2019年10月19日16:55:01 pull 下來的portainer/agent:latest 也執行不起來 改為 portainer/agent:1.5.1正常
  • Stacks貼上docker-compose.yml進來後一直報version版本不對
    目前只支援version 2 改為2即可

4. 參考

Portainer Edge Agent 官方釋出Portainer內網邊緣節點配置說明書PDF

流水理魚 釋出!

相關文章