iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
0

Docker Swarm
本篇主要參考

  • 用30天來介紹和使用Docker Day25:介紹和操作Docker Swarm
    https://ithelp.ithome.com.tw/articles/10194385
    本來今天範例引用此篇,再加一些說明,但為了避免爭議還是刪掉了
    想快速上手 Docker Swarm 看 yangj26952 大大的文章就對了

今天就輕鬆一下,做一個小比較

參考:k8s vs docker swarm
https://www.spec-india.com/blog/kubernetes-vs-docker-swarm-a-complete-comparison-guide/

專有名詞(docker swarm VS k8s)

Controller: Manager, Master
Slave: Worker, Nodes
Sotrage: Volumes, Persistent and Ephermal
Deployment unit: Task, Pod
Port: Published Port, EndPoint

適用情境

  • 使用Kubernetes(安裝難度高,要有很多網管知識)
    完整的部署和監控
    可靠性高(容錯率高)、反應快
    開發環境複雜、資源需求變化大
    Cluster很大很複雜

  • 使用Docker Swarm
    安裝、設定簡單
    你想要的image,docker hub上都找的到,而且不會差太多
    小型、簡單
    你很熟docker API,或你的環境都吃docker
    不想燒太多時間在搞架構的
    ===========

udemy購課建議

大家在udemy可找「LIMITED TIME!」就會有幾門免費的Docker課程

如有其他好康,請留言推薦喔!

除了免費課程,其他的課我沒買,不過大家可以找Docker SWARM,例如:

  • Docker Advanced - SWARM - Hands-on - DevOps
  • Docker Swarm Mastery: DevOps Style Cluster Orchestration
  • Docker from A to Z™: Swarm + Jenkins

如果工作上有用到就可以入手
除了等「300$時再買」、「看評等高的」、「上課時數高的」,
最重要的是看「此課程的課程大綱」

例如:
我想練習在local端架k8s,並且是多個Node(不是minikube)
那如果課綱都在AWS、GCP玩的,或環境安裝是minikube的,基本上就不適合你買了
(300$也是錢呀)

本來今天想這樣就過渡過去,但實在有點不好意思

如開頭所述,想快速起步,看 yangj26952 大大的文章就好囉
這裡補充在udemy的docker課程中,2門有提到Docker Swarm的,那時是免費的。

  • FREE - Docker Course Made for Developers - LIMITED TIME!
    第11章 Docker Swarm Mode
  • FREE! - FOR LIMITED TIME! Docker Swarm: BEGINNER + ADVANCED

首先來看
直到10/18,這個課程還是免費的,裡面有較完整的每個Node的IP、Domain Name的練習檔
趕快去取得吧~

FREE! - FOR LIMITED TIME! Docker Swarm: BEGINNER + ADVANCED

跟docker-machine、docker-compose不同,
Docker Swarm不用另外安裝程式,例如:

# Manager
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise 10.1.3.228:4000 consul://10.1.3.228:8500
# Worker加入swarm,--advertise類似傳達(佈告欄),consul是用來通訊
$ docker run -d swarm join --advertise=10.1.3.229:2375 consul://10.1.3.228:8500
# 2375(Docker Engin Port 沒加密的)
# 2376(Docker Engin Port 有ssh加密的)
# 2377(Docker Swarm Port)
# 只要有docker指令就好了

此課程的網路規劃
Node:6個(manager1,2,3、node1,2,3)
management subnets:3個
prod subnets:3個
不過只能在AWS的eu-west-1 Region建置,而且也只屬實驗性質,不適合用於production
我們看一下指令就好了

如果要使用2376(Docker Engin Port 有ssh加密的)

就要有憑證,我們私底下實驗,就自己當CA來作自簽憑證,也順便練習,才不會在正式環境出包

$ openssl genrsa -out ca-key.pem 2048 # 長度,現在2048是標配了,愈長愈安全,簽愈慢、愈費電
$ openssl req 
    -config /usr/lib/ssl/openssl.cnf # 設定檔
    -new -key ca-key.pem 
    -x509 # 最常用的格式
    -days 1825 # 有效天數
    -out ca-cert.pem # ca憑證
  • 產生manager1 node的key
$ openssl genrsa -out manager1-key.pem 2048
# (1)
$ openssl req -subj "/CN=manager1" # common name
    -new -key manager1-key.pem -out manager1.csr # 用manager1-key.pem 產生csr檔給ca簽發憑證
# (2)
# extfile.cnf:也把這些ip納進去,以防惡意第3者拿著manager1的憑證在公司內部亂騙
$ echo subjectAltName = IP:10.0.1.5,IP:127.0.0.1 > extfile.cnf

# (3)CA用上面的(1)、(2)來產生manager1的憑證
$ openssl x509 -req -days 365 
    -in manager1.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial 
    -out manager1-cert.pem -extfile extfile.cnf
  • 產生node1 worker node的key
# 同manager1的產生方式,就不再說明囉,一回生、二回熟
# 等手打到瘋掉,再導入ansible用script產生
$ openssl genrsa -out node1-key.pem 2048
$ openssl req -subj "/CN=node1" -new -key node1-key.pem -out node1.csr
$ echo subjectAltName = IP:10.0.4.5,IP:127.0.0.1 > extfile.cnf
$ openssl x509 -req -days 365 -in node1.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out node1-cert.pem -extfile extfile.cnf
  • 產生client的key(模擬的使用者)
# 同manager1的產生方式,就不再說明囉
$ openssl genrsa -out client-key.pem 2048
$ openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr
$ echo extendedKeyUsage = clientAuth > extfile.cnf
$ openssl x509 -req -days 365 -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf
  • 用scp把憑證copy到各node
# 只列1個,scp指令很重要喔,順便學一下
$ scp -i 用來ssh的PrivateKey.pem # 遠端的 ~/.ssh/authorized_keys 要先設定好喔
        ./ca-cert.pem # local端的檔案
        ubuntu@manager1:/home/ubuntu/.docker/ca.pem # copy到目的主機
$ scp -i 用來ssh的PrivateKey.pem ./manager1-cert.pem ubuntu@manager1:/home/ubuntu/.docker/cert.pem
$ scp -i 用來ssh的PrivateKey.pem ./manager1-key.pem ubuntu@manager1:/home/ubuntu/.docker/key.pem
  • 餵manager1 Node上的Docker,吃ca.pem、cert.pem、key.pem
$ vim /etc/default/docker
加入
-H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/home/ubuntu/.docker/ca.pem --tlscert=/home/ubuntu/.docker/cert.pem --tlskey=/home/ubuntu/.docker/key.pem

$ service docker start	# 重啟 docker service
$ service docker status # 看有沒有吃成功

建Docker Swarm主要有下列3步驟:

1、建立discovery service

功能:

  • Key-value Store
  • 儲存cluster的state跟configuration

組成元件:

  • Consul
  • etcd
  • Zoo keeper

/etc/default/docker # 設定檔,binary目錄、daemon startup options、HTTP proxy、暫存檔目錄
docker ps && docker images

課程指令解析:

  • 跑consul server container
    課程裡規劃3個manager,manager1~3都要建consul service(consul server),但是還要選1位當大哥
NODE1
	docker run --restart=unless-stopped -d -h consul1 --name consul1 -v /mnt:/data \
    -p 10.0.1.5:8300:8300 \
    -p 10.0.1.5:8301:8301 \
    -p 10.0.1.5:8301:8301/udp \
    -p 10.0.1.5:8302:8302 \
    -p 10.0.1.5:8302:8302/udp \
    -p 10.0.1.5:8400:8400 \
    -p 10.0.1.5:8500:8500 \
    -p 172.17.0.1:53:53/udp \
    progrium/consul -server -advertise 10.0.1.5 -bootstrap-expect 3

NODE2
	docker run --restart=unless-stopped -d -h consul2 --name consul2 -v /mnt:/data  \
    -p 10.0.2.5:8300:8300 \
    ...略
    progrium/consul -server # 3年前更新的image檔,可以docker hub看
    -advertise 10.0.2.5 # 有自己的佈告欄
    -join 10.0.1.5 # 指到大哥manager1
  • 跑consul cliet container
NODE1
	docker run --restart=unless-stopped -d -h consul-agt1 --name consul-agt1 \
	-p 8300:8300 \
	-p 8301:8301 -p 8301:8301/udp \
	-p 8302:8302 -p 8302:8302/udp \
	-p 8400:8400 \
	-p 8500:8500 \
	-p 8600:8600/udp \
	progrium/consul -rejoin # 一樣的image
    -advertise 10.0.4.5 # 這個我看不懂
    -join 10.0.1.5 # 加到manager1的consul service

加好後,可以在其他NODE去驗證

$ docker exec -it consul<1/2/3> bash # 進到別的NODE的consul的bash裡面
$ consul members

2、建Swarm Manager

功能:

  • cluster的管理角色
  • 用來跑docker指令
  • 在Manager建立discover service
  • registrator,用來註冊Consul, etcd and SkyDNS等服務

課程指令解析:
MNAGER1:名稱mgr1

  • 建立CONSUL service
$ docker -H tcp://manager1:2376 
    --tlsverify 
    --tlscacert=/home/ubuntu/.docker/ca.pem 
    --tlscert=/home/ubuntu/.docker/cert.pem 
    --tlskey=/home/ubuntu/.docker/key.pem run 
    --restart=unless-stopped # 除了啟動時,其他錯誤狀態會自動restart
    -d -h consul1 --name consul1 
    -v /mnt:/data     
    -p 10.0.1.5:8300:8300     
    -p 10.0.1.5:8301:8301     
    -p 10.0.1.5:8301:8301/udp     
    -p 10.0.1.5:8302:8302     
    -p 10.0.1.5:8302:8302/udp     
    -p 10.0.1.5:8400:8400     
    -p 10.0.1.5:8500:8500     
    -p 172.17.0.1:53:53/udp     
    progrium/consul -server 
    -advertise 10.0.1.5 
    -join 10.0.2.5
  • 沒用憑證(指令明顯比有用憑證的短非常多)
# NODE1
$ docker run 
    # 主要差在這3行
    --restart=unless-stopped 
    -h mgr1 --name mgr1 -d -p 3375:2375 swarm manage 
    --replication 
    
    --advertise 10.0.1.5:3375 
    consul://10.0.1.5:8500/
    
# NODE1,swarm join指令,列在這裡比較好比較
	docker run -d swarm join 
    --advertise=10.0.4.5:2375 
    consul://10.0.4.5:8500/
  • 有用憑證(最大的差別就是用prot 2376)
$ docker -H tcp://manager1:2376 
# 2376:Swarm Manage的Port,用來操作Docker Cluster
# 2376(Docker Engin Port 有ssh加密的)
--tlsverify 
--tlscacert=/home/ubuntu/.docker/ca.pem # CA憑證(自簽的話,自己就是CA囉,常用於公司內部)
--tlscert=/home/ubuntu/.docker/cert.pem # 用戶自己的憑證(可用public key驗,cert.pem裡面會附)
--tlskey=/home/ubuntu/.docker/key.pem # private key(私鑰)
run --restart=unless-stopped 
-h mgr1 --name mgr1 -d -p 3376:2376 
-v /home/ubuntu/.docker:/certs:ro 
swarm manage # 驗明正身
--tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/cert.pem --tlskey=/certs/key.pem 
--host=0.0.0.0:2376 
--replication 
--advertise 10.0.1.5:2376 
consul://10.0.1.5:8500/

-在每個node執行,這樣各node才知道有哪些服務可用(例如:Consul、etcd、dns)

$ docker run -d --name registrator -h registrator 
-v /var/run/docker.sock:/tmp/docker.sock 
gliderlabs/registrator:latest # https://github.com/gliderlabs/registrator
consul://10.0.1.5:8500

有用憑證的CONSUL SERVERS、CONSUL CLIENTS就略過囉
差別就是給那3個pem檔
還有用-rejoin

3、把worker node加到cluster

課程指令解析:
MNAGER1:名稱mgr1

  • 沒用憑證
    略@@~
  • 有用憑證(最大的差別就是用prot 2376)
    NODE1
$ docker -H tcp://node1:2376 
    --tlsverify 
    --tlscacert=/home/ubuntu/.docker/ca.pem 
    --tlscert=/home/ubuntu/.docker/cert.pem 
    --tlskey=/home/ubuntu/.docker/key.pem 
    run -d -h join --name join 
    swarm join 
    --advertise=10.0.4.5:2376 
    consul://10.0.4.5:8500/

今天大概就是這樣囉,
可惜沒有實作
但希望指令的部分有幫助到大家,尤其是憑證的部分,畢竟在container之間傳訊息沒用ssh也是粉危險der
而且,沒有憑證怎麼知道對方是不是假冒的?

至於,想進一步實作的朋友,不好意思啦
還是請參考專業課程喔
但記得先看清楚課程大綱,很有可能該課程並不適合你

如果有空再來研究官網文件
https://docs.docker.com/engine/swarm/


上一篇
day03_docker02_基礎工具
下一篇
day05_docker04_Jenkins
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言