ถ้าคุณต้องการใช้ CoreOS เป็น Infrastructure หลักในการจัดการ Docker Container ในหลายๆ Host การสร้าง CoreOS Cluster ขึ้นมาใช้งานก็จะเป็นทางเลือกที่ดีที่สุด CoreOS ออกแบบ Cluster ขึ้นมาไม่เหมือนใคร การทำงานจะทำงานผ่าน service หลายตัวประกอบเข้าด้วยกัน เช่น etcd, fleet เป็นต้น CoreOS จะใช้การอ่านข้อมูล Node ของ Cluster จาก etcd เป็นหลัก ไม่ได้เกิดจากการเอาสายเชื่อมต่อกันแต่เกิด Cluster จากการทำงานซอฟต์แวร์เป็นหลัก
มาลองสร้าง CoreOS Cluster บน DigitalOcean กัน สำหรับท่านที่ติดตั้ง CoreOS เองก็สามรถใช้ How-To นี้อ้างอิงได้ CoreOS จะต้องใช้ etcd ซึ่งเป็น Discovery URL เพื่อเก็บข้อมูลของ Node ใน Cluster ซึ่งคุณใช้ etcd service ของคุณเองก็ได้ หรือจะใช้ service กลางจาก discovery.etcd.io ได้เช่นกัน การขอ Discovery URL ทำได้ง่ายๆ ผ่าน cURL ดังนี้
curl -w "\n" https://discovery.etcd.io/new
คุณจะได้รหัส token มาพร้อมกับ Discovery URL ดังนี้
https://discovery.etcd.io/2ff216654df841f09b76715109594100
เมื่อได้ Discovery URL แล้วเราก็มาเริ่มสร้าง CoreOS Cluster กันได้ ทุกๆ เครื่องที่จะผูกเป็น Cluster จะต้องใช้ Discovery URL อันเดียวกัน ถึงจะอยู่ใน Cluster เดียวกัน ซึ่งการตั้งค่านี้จะต้องทำผ่าน cloud-config ในแต่ละ Node ในกรณีที่คุณติดตั้ง CoreOS เองคุณจำเป็นต้องเขียน cloud-config อยู่แล้ว ดังนั้นคุณสามารถเพิ่มข้อมูลในส่วนนี้เข้าไปได้เลย แต่ใน DigitalOcean ต้องใช้เทคนิคเล็กน้อยตอนที่เราสร้าง Droplet
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/2ff216654df841f09b76715109594100
addr: $private_ipv4:4001
peer-addr: $private_ipv4:7001
fleet:
public-ip: $private_ipv4
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
view rawcloud-config-fleet hosted with ❤ by GitHub
เราจะใส่ cloud-config ข้างต้นลงในส่วน User Data ตั้งค่าตรง Available Settings ดังภาพ
ทำซ้ำจนครบตามจำนวน Droplet ที่คุณต้องการ เมื่อ Droplet Start ครบหมดแล้ว ใช้คำสั่ง
fleetctl list-machines
จะพบว่าเครื่องทั้ง 3 ผูกเป็น Cluster เรียบร้อยแล้ว
จากนี้เราสามารถใช้ fleet จัดการ CoreOS Cluster ได้แล้ว มาลอง Deploy Service ง่ายๆ กัน สร้างไฟล์ wordpress.service ดังนี้
[Unit]
Description=WordPress
After=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill wordpress
ExecStartPre=-/usr/bin/docker rm wordpress
ExecStartPre=/usr/bin/docker pull tutum/wordpress
ExecStart=/usr/bin/docker run -P -d --name wordpress tutum/wordpress
ExecStop=/usr/bin/docker stop wordpress
view rawwordpress.service hosted with ❤ by GitHub
จากนั้น load service นี้ให้ fleet
fleetctl load wordpress.service
คุณจะพบว่า fleet เลือก Node แรกสำหรับ Deploy Service นี้
ใช้คำสั่ง fleetctl list-unit-files อีกครั้งจะพบว่า unite file ถูกใช้สำหรับ Node แรก
fleetctl list-unit-files
ลองดูสถานะของ unite file นี้ด้วยคำสั่ง
fleetctl list-units
จะพบว่า WordPress Service นี้ยังไม่มีการเรียกใช้หรือตายอยู่
มาลอง start service กัน โดยใช้คำสั่ง
fleetctl start wordpress.service
คุณจะพบว่า fleet สั่งให้ Node แรกของเรา deploy service แล้ว
รอจน Service Deploy เสร็จ ตรวจสอบสถานะการ Deploy ได้ดังนี้
fleetctl list-units
และ
fleetctl status wordpress.service