Month: May 2017

  • COMODO Certificates บรรทัดที่หายไปใน Google Chrome บน Ubuntu

    ผมทำ Zeroshell Firewall สำหรับเป็น network authentication หลังจากผม setup ส่วนที่เกี่ยวกับ Certificate ที่จะใช้กับ https ผมได้ import COMODO Certificates (ที่มหาวิทยาลัยใช้บริการ)

    เมื่อทดสอบการใช้งาน เข้าโปรแกรม Firefox บน Ubuntu เมื่อผู้ใช้ใส่ URL เพื่อไปเว็บไซต์ใด ๆ จะพบกับหน้า network authentication และ https ถูกต้อง (เป็นสีเขียว) แต่เมื่อเปิดด้วย Google Chrome จะพบว่า https จะไม่ถูกต้อง (เป็นขีด / สีแดง) ทำไมจึงเป็นเช่นนั้น

    เปิดเข้าไปดูรายการ Certificates ที่อยู่ใน Browser Firefox เทียบกับ Google Chrome ก็พบว่ามีความแตกต่างต่างกันที่บรรทัด คือ COMODO RSA Domain Validation Secure Server CA ดังนี้

    รูปข้างล่างนี้เป็นรายการ Certificates ของ COMODO ใน Firefox บน Ubuntu 16.04 ซึ่ง มี บรรทัดที่ว่านี้

    รูปข้างล่างนี้เป็นรายการ Certificates ของ Comodo ใน Google Chrome บน Ubuntu 16.04 ซึ่ง ไม่มี

    รูปข้างล่างนี้เป็นรายการ Certificates ของ COMODO ใน Google Chrome for Windows 10 ซึ่ง มี บรรทัดดังกล่าวอยู่ในแท็บ Intermediate Certification Authorities ซึ่งผมพบว่ารายการมันจะเกิดขึ้นหลังจากเคยไปเว็บไซต์ใด ๆ ที่ติดตั้ง COMODO Certs ไว้

    ผมก็ไป export “COMODO RSA Domain Validation Secure Server CA” จาก Firefox แล้วนำไป import ใน Google Chrome บน Ubuntu 16.04 เพื่อทดสอบว่ามันเกี่ยวกันมั้ย มันเกี่ยวกันจริง ๆ ด้วย แต่ผมไม่รู้ว่าทำไมจึงเป็นเช่นนั้น จึงต้องการจะบันทึกไว้ เผื่อใครที่รู้จะมาช่วยอธิบาย

    ในหน้า Login นั้น สัญลักษณ์ https แสดงเป็นสีเขียว ถูกต้องได้ ตามรูป

    ใครรู้มาเฉลยที

    เพิ่มเติมท่อนข้างล่างนี้เมื่อ 11 พ.ค. 60 ครับ

    ตอนนี้ผมได้คำตอบมาอัปเดตแล้วครับ จากที่ได้ความช่วยเหลือจากคุณพรพิทักษ์ สันติภาพถาวร ผู้ดูแล PSU CERTS เราพบว่าในหน้าคอนฟิกของ Zeroshell นั้น ในเมนู Captive Portal X.509 Authentication นั้นหลังจากเรา import #1 Trusted CA จากไฟล์ STAR_psu_ac_th.ca-bundle ดังรูป

    แล้วเราจะได้บรรทัด COMODO RSA Domain Validation Secure Server CA เพิ่มขึ้นมา ดังรูป

    และ #2 Imported Certificates and Keys ด้วยไฟล์ STAR_psu_ac_th.crt และ STAR_psu_ac_th_nopass.key ดังรูป

    แล้วเราจะได้บรรทัด OU=Domain Control Validated, OU=PositiveSSL Wildcard, CN=*.psu.ac.th มาดังรูป

    จากนั้น เราจะต้องไปคลิกตัวเลือก Authentication เพื่อ เลือก Allow the X.509 login with the certificates signed by the following Trusted CAs: ด้วย COMODO RSA Domain Validation Secure Server CA ดังรูป

    สรุปว่าผมยังตั้งค่าไม่ครบถ้วนนั่นเอง คือ ขาดการตั้งค่าเรื่อง Authentication นี่เองว่าให้อนุญาตการ login ด้วย certificate ที่ signed โดย Trusted CAs ที่เรา import เข้าไปนั่นเอง

    ขอให้บทความนี้มีประโยชน์ สร้างความเข้าใจ และ เป็นการบันทึกไว้ว่า หากเรานำ PSU CERTs ไปติดตั้งทำเป็น Captive Portal ในระดับคณะ ก็สามารถทำได้โดยอาจจะนำบทความนี้ไปเป็นตัวอย่างประกอบครับ

  • เรียนรู้เกี่ยวกับ GlusterFS และวิธีติดตั้ง GlusterFS บน Ubuntu 16.04

    อยากเอา Storage จากหลาย ๆ เครื่องมารวมกัน เครื่องพังไฟล์ไม่หาย แถมเข้าจากที่ไหนก็ได้ต้องทำอย่างไร

                GlusterFS[1] คือ filesystem รูปแบบหนึ่งสามารถรวม Storage จากหลาย ๆ เครื่อง และทำการกระจายข้อมูลเก็บโดยมีระบบคล้าย ๆ RAID ที่ช่วยป้องกันเวลาเครื่องใดเครื่องหนึ่งพัง โดย Access ได้หลาย Protocol แล้วแต่ว่าการทำไปใช้งานกับอะไร
    Gluster FS มีโครงสร้างระบบไฟล์ 2 ส่วน[2]คือ

    • Brick คือ Directory ที่อยู่บนแต่ละเครื่อง โดยจะสร้าง Partition เพิ่มจาก Partition ปกติ (จะ Disk ใหม่ Disk เดิมก็ได้) หรือจะใช้เป็น Directory ที่อยู่บน Partition เดิมก็ได้ โดย recommend เวลาสร้าง partition ให้เป็น xfs (รองรับ inode หรือจำนวนไฟล์ได้สูงกว่า ext4 ถ้าใช้ ext4 อาจจะเจอว่าเนื้อที่ยังไม่หมดแต่สร้างไฟล์ไม่ได้แล้วเนื่องจาก inode หมด) 
    • Volume คือชุดของข้อมูลที่ให้บริการ กล่าวง่าย ๆ คือ การเอา Brick จากแต่ละเครื่องมาให้บริการภายใต้ Volume นั้น ๆ (อาจจะเทียบได้ประมาณ เอา HDD หลาย ๆ ก้อนมารวมกันแล้วทำ RAID 5 ตั้งชื่อ Volume แล้วผู้ใช้ก็มีหน้าที่ใช้งานอย่างเดียว)

    ประเภทของ Volume[3]         

    1. Distributed Glusterfs Volume : เป็น default volume ของ glusterfs คือการเมื่อสร้างไฟล์ลงใน volume นั้น ๆ ก็จะกระจายไปเก็บยัง Brick ต่าง ๆ ถ้าเครื่องไหน Brick พังไฟล์ในเครื่องนั้นก็จะพังไปด้วยเพราะไม่มีสำรอง ข้อดีที่คือประหยัดที่ ข้อเสียคือการป้องกันไฟล์เสียหายขึ้นอยู่กับ Hardware RAID เครื่องอย่างเดียว
    2. Replicated Glusterfs Volume : รูปแบบนี้จะมีการทำสำเนาข้อมูลไฟล์นั้น ๆ ไปยังอีกเครื่อง ซึ่งจะตั้งให้เก็บกี่สำเนาก็ได้แล้วแต่จะกำหนด ถ้า Brick ใดเสียก็สามารถ Access ไฟล์นั้นจากอีก Brick แทน


    3. Distributed Replicated Glusterfs Volume : รูปแบบนี้จะซับซ้อนขึ้นแต่ก็ประมาณ ไฟล์หนึ่งจะกำหนดให้เก็บกี่สำเนา ส่วนจะไปอยู่เครื่องใดบ้าง ระบบจัดการให้เอง แต่จำนวนสำเนาต้องสอดคล้องกับจำนวน Brick นั่นเอง (ผมไม่อธิบายมากนะครับ เพราะยังไม่ค่อยเข้าใจมากนั้น เพราะไม่ได้ลอง)


    4. Striped Glusterfs Volume : คือการใช้หลักการในข้อ 1 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจาย


    5. Distributed Striped Glusterfs Volume : คือการใช้หลักการในข้อ 2 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจายเช่นเดียวกัน


    6. Distributed Replicated and Striped Glusterfs Volume : เป็นรูปแบบทีทั้งหั่นไฟล์ และสำเนาไฟล์ ซึ่งจะดีที่สุด แต่จะเปลืองเนื้อที่ที่สุด (ไม่มีรูปตัวอย่าง)
      ถ้าสรุปง่าย ๆ Strip เพื่อให้ได้เนื้อที่เยอะ ๆ โดยเอามาจากหลาย ๆ node ในส่วนของ Replicate เพื่อป้องกันข้อมูลหาย ตัวอย่างวิธีการคิดขนาดในแต่ละ Volume Type[3]


    ตัวอย่างการออกแบบผังการเชื่อมต่อเครือข่าย[4]         

     

    ซึ่งที่แนะนำปกติจะให้มี Storage Network เพื่อใช้ในการคุยกันระหว่าง Block(ชื่อ Node) และมี Data Network สำหรับใช้ในการดึงข้อมูล และมี Management Network ไว้เผื่อในกรณีฉุกเฉิน Data Network ข้อมูลเต็ม จะได้เข้าไป Config อะไรได้

    วิธีการติดตั้ง GlusterFS บน Ubuntu 16.04[5]

    1. ติดตั้ง ubuntu 16.04 ให้เรียบร้อย
    2. เพิ่ม ppa เข้าไปใน apt ดังนี้
      sudo apt install software-properties-common
      sudo add-apt-repository ppa:gluster/glusterfs-3.8
    3. จากนั้นทำการ Update และ ติดตั้ง Glusterfs Server
      sudo apt update
      sudo apt install glusterfs-server
    4. Start Glusterfs Server
      sudo service glusterfs-server start
    5. สุดท้ายต้องทำการเปิด Firewall ให้เครื่องที่จะให้ใช้งานเข้าถึงดังนี้ (ถ้าจะระบุ Port ให้ระบุ TCP 24007-24008 และ TCP 49152-49156)
      sudo ufw allow from 10.x.x.x
      sudo ufw allow from 192.x.x.x
      sudo ufw allow ssh
      sudo ufw default deny incoming
      sudo ufw default alllow outgoing
      sudo ufw enable

    วิธีการสร้าง xfs partition บน Ubuntu 16.04[6]

    1. ทำการจัดการ Partition ด้วย fdisk (ในกรณีขนาดเกิน 2TB ต้องใช้ parted ซึ่งไม่ขออธิบายครับ) ในตัวอย่างเป็น sdb
      sudo fdisk /dev/sdb
      
    2. กด n (New Partition) ตามด้วย p (Primary Partition) จากนั้นกด Enter ไป 3 ครั้ง จบด้วยกด w (Write Partition)
    3. จากนั้นทำการสร้าง Partition ด้วย mk.xfs
      sudo mkfs.xfs /dev/sdb1
      
    4. จากนั้นทำการสร้าง path ที่ต้องการ mount ยกตัวอย่างดังนี้
      sudo mkdir /cluster
      
    5. ทำการแก้ fstab เพื่อให้ automount ทุกครั้งที่ boot ดังนี้
      sudo vim /etc/fstab
      
    6. เพิ่มข้อความท้ายไฟล์ประมาณนี้
      /dev/sdb1      /cluster      xfs     defaults     0      0
      
    7. สั่ง mount (ในกรณีที่ไม่ได้รีเครื่อง)
      sudo mount -a
      
    8. สามารถใช้งาน path ที่ mount ได้แล้ว

    วิธี config glusterfs cluster node บน ubuntu 16.04

                โดยขั้นต้นในการสื่อสารระหว่าง node ต้องมีชื่อ node ซึ่งเครื่องแต่ละเครื่องจะจด domain ก็ได้ แต่ในที่นี้ใช้วิธีกำหนดไปใน host ไฟล์ (ป้องกัน dns หรือ data network มีปัญหา server ก็จะยังคุยกันได้ แต่ถ้าต้องการให้ client ใช้งานได้ต้องจดชื่อจริงทั้งหมด เพราะเมื่อ client ต่อก็จะมีการไล่ check ไปตาม node อื่น ๆ ด้วย ถ้าไม่จดชื่อจะ mount ไม่สำเร็จ) ทำได้ดังนี้

    • ทำการแก้ไขไฟล์ /etc/hosts
      sudo vim /etc/hosts
    • เพิ่มข้อความในส่วนของ ipv4 ประมาณนี้ครับ
      10.x.x.10 gluster-cluster1.x.y.z gluster-cluster1
      10.x.x.11 gluster-cluster2.x.y.z gluster-cluster2
      10.x.x.12 gluster-cluster3.x.y.z gluster-cluster3
      10.x.x.13 gluster-cluster4.x.y.z gluster-cluster4
      
    • ทำการค้นหา node อื่น ๆ ให้เข้ามาอยู่ใน cluster เดียวกันดังนี้ (เข้าทีหลังเครื่อง และค้นหาเฉพาะที่ไม่ใช่ node ตัวเอง) ยกตัวอย่างคำสั่งที่ใช้ใน gluster-cluster1 (ทำแค่ node เดียว)
      sudo gluster peer probe gluster-cluster2.x.y.z
      sudo gluster peer probe gluster-cluster3.x.y.z
      sudo gluster peer probe gluster-cluster4.x.y.z
    • คำสั่งที่ใช้ในการดูสถานะของ node ใน cluster ซึ่งเมื่อดูจาก node ที่ไม่ได้เพิ่มก็จะขึ้นสถานะเหมือนกัน
      sudo gluster peer status

    • คำสั่งสำหรับดู pool list (อีกมุมมอง) ใช้คำสั่งดังนี้
      sudo gluster pool list

    • ในกรณีที่ต้องการเอาเครื่องออก สั่งดังนี้
      sudo gluster peer detach <node> force

    วิธีการสร้าง glusterfs volume บน ubuntu 16.04[2]

    ยกตัวอย่างจากหัวข้อก่อนหน้า กำหนดให้ใช้ Volume Type แบบ Distributed Replicated and Striped Glusterfs Volume มี 4 node (4 brick) โดย Stripe ข้อมูล 2 node และกำหนดให้ Replicate จำนวน 2 ชุดข้อมูล (พังได้ 1 node ที่เป็นคู่กัน)

    • ทำการสร้าง Volume ตามเงื่อนไขข้างต้น
      sudo gluster volume create cluster1_volume replica 2 strip 2 \
      transport tcp \
      gluster-cluster1.x.y.z:/cluster \
      gluster-cluster2.x.y.z:/cluster \
      gluster-cluster3.x.y.z:/cluster \
      gluster-cluster4.x.y.z:/cluster \
      force

    • จากนั้นทำการ Start volume
      sudo gluster volume start cluster1_volume

    • ทำการตรวจสอบ volume ดังนี้
      sudo gluster volume list
    • อีกคำสั่งในการตรวจสอบทำได้ดังนี้
      sudo gluster volume status

    • ในกรณีที่ต้องการ Stop volume ใช้คำสั่งดังนี้
      sudo gluster volume stop cluster1_volume
    • คำสั่งในการลบ volume ดังนี้
      sudo gluster volume delete cluster1_volume

    วิธีการ mount glusterfs จาก client บน ubuntu 16.04[7]

    • ให้สร้างเครื่อง client ubuntu 16.04 เพื่อเชื่อมต่อ glusterfs
    • ทำการติดตั้ง glusterfs-client
      sudo apt install glusterfs-client attr
    • ทำการทดสอบ mount ไปยัง glusterfs-server ตามที่ตั้งไว้ในหัวข้อข้างต้น (ต้องจดชื่อที่แล้ว ถ้าไม่ได้จดต้องบันทึก list server ทั้งหมดใน /etc/hosts เช่นเดียวกัน)
      sudo mkdir /glusterfs
      sudo mount -t glusterfs gluster-cluster1.x.y.z:/cluster1_volume /glusterfs
    • หลังจากนั้นจะได้ mount volume ซึ่งสามารถใช้งานได้เลยดังรูป
    • ในกรณีที่ต้องการสร้างเป็น fstab สามารถทำได้โดยแก้ไข /etc/fstab ดังนี้
      sudo vim /etc/fstab
    • ทำการเพิ่มท้ายไฟล์ประมาณนี้ครับ
      gluster-cluster1.x.y.z:/cluster1_volume /glusterfs glusterfs defaults,_netdev 0 0

    ทดสอบใช้งาน GlusterFS

    • ทดสอบให้ gluster volume เป็นแบบ 2 stripe และ 2 replica และให้ client ต่อไปยัง cluster1 ด้วยการ mount
    • จากนั้นทำการทดสอบสร้าง image ขนาด 5.2 GB ด้วยคำสั่ง dd ที่ client ดังนี้

      sudo dd if=/dev/zero of=test.img bs=512K count=10000

      ผลลัพธ์ได้ดังรูป

                  จะเห็นได้ว่า ระบบจะแบ่งไฟล์ออกเป็น 2.5G และทำการ replicate กระจายไปยังอีกคู่ node (1:2->3:4)

    • จากนั้นทดสอบปิด glusterfs server node 1 ที่ client กำลังต่ออยู่ดูว่ายังเข้าถึงไฟล์จาก node อื่นได้ไหม

                    จากการทดสอบพบว่ายังสามารถเข้าถึงไฟล์ได้อยู่ ซึ่งเมื่อสั่ง netstat ดูจะพบว่าเครื่องยังต่อไปยัง cluster ที่เหลืออยู่

    • การทดสอบสุดท้าย ทดสอบสร้างไฟล์ขณะที่ glusterfs server node 1 ปิดอยู่ แล้วลองเปิด node 1 กลับเข้ามา active ดูว่าไฟล์จะมาไหม ผลที่ได้คือไฟล์ถูก sync หลังจาก เปิด node 1 ขึ้นมา

                    ซี่งปกติแล้ว Port TCP 24007-24008 ใช้สำหรับตรวจสอบข้อมูลของ GlusterFS Server node ต่าง ๆ (เดาว่าถ้าเราปิด node 1 ถ้ามีการเพิ่ม node อาจจะไม่เห็น node ใหม่ ใครว่างลองทดสอบดูครับ) และ TCP 49152-49156 ใช้สำหรับโอนถ่ายข้อมูล

    • จากการทดสอบสร้างไฟล์บน server พบว่าไม่มีการกระจายไฟล์ (เนื่องจากสร้างโดยไม่ผ่าน glusterfs-client) เพราะฉนั้นควรสร้างผ่านการ mount เป็น glusterfs เท่านั้น

                    หวังว่าไม่ยาวไปนะครับ ไม่อยากแยกหลายบทความเดี๋ยวจะงง เอาเป็นบทความเดียวจบเลยนะครับ ตอนหน้าน่าจะพูดถึง docker management tools อย่าง kubernetes หรือไม่ก็ rancher ครับ……

    ==================================
    Reference :

    [1] Gluster : https://www.gluster.org/

    [2] How to install and use GlusterFS : https://www.rmuti.ac.th/user/prakai/w/images/9/9c/How-to-install-and-use-GlusterFS-ARIT-Net-3.pdf

    [3] GlusterFS Storage Cluster on CentOS 7 : https://wiki.centos.org/HowTos/GlusterFSonCentOS

    [4] Gluster Docs – Architecture : http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Architecture/

    [5] Gluster Docs – Install Gluster : https://gluster.readthedocs.io/en/latest/Install-Guide/Install/

    [6] Format a Volume as XFS in Debian and Ubuntu : https://linhost.info/2012/08/format-a-volume-as-xfs-in-debian-and-ubuntu/

    [7] Install and Configure GlusterFS on Ubuntu 16.04 / Debian 8 : http://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/install-and-configure-glusterfs-on-ubuntu-16-04-debian-8.html

  • วิธีสร้าง CoreOS Cluster

    จะสร้าง CoreOS ให้กลายเป็น Cluster Docker Container ได้อย่างไร

                 จากบทความที่แล้วที่แนะนำเกี่ยวกับ CoreOS และการติดตั้งบน Vmware[1] ไปแล้วนั้น เราก็สามารถสร้างให้เป็นในรูปแบบ Cluster ได้ โดยมองว่าเครื่องแต่ละเครื่องที่สร้างนั้นเป็น Node หนึ่ง ๆ ใน Cluster โดยใช้ etcd เป็นตัวเก็บข้อมูลของ Node และ Fleet เป็นตัว Deploy docker ให้กระจายไปยัง Node ต่าง ๆ อย่างเหมาะสม โดยที่จะสามารถย้ายตัวเองได้เมื่อมีเครื่องใดเครื่องหนึ่งมีปัญหา (Recommend จำนวนเลขคี่ และอย่างต่ำต้อง 3 node ขึ้นไป ยิ่งเยอะ โอกาสล่มก็ยิ่งต่ำ)


                etcd ในปัจจุบันเป็น Version 3 ซึ่งจะมีประสิทธิภาพเพิ่มขึ้นจาก Version 2 (แต่ใน document web ยังเป็น etcd2 เป็นส่วนมาก) โดยใช้สำหรับเก็บข้อมูลแต่ละ Node ทำให้รู้ว่าในแต่ละ Cluster มีเครื่องใด IP อะไรบ้าง มีทั้งหมด 3 วิธีคือ 

    1. Static เป็นวิธีที่ระบุลงไปเลยในแต่ละเครื่องว่ามีเครื่องไหนบ้างที่อยู่ใน Cluster วิธีการนี้ข้อเสียคือถ้าเพิ่มต้องเพิ่มทุกเครื่อง
    2. etcd Discovery เป็นวิธีที่จะให้ Discovery Service เป็นคนทำหน้าที่เก็บข้อมูล (เหมือน tracker torrent) เมื่อเพิ่มเครื่องใหม่ ก็แค่ชี้ไป Discovery URL ก็เสร็จ
    3. DNS Discovery เป็นวิธีการใช้วิธีการจด DNS ในรูปแบบ SRV record เพื่อบอกว่า บริการนี้มีเครื่องอะไรอยู่บ้าง ซึ่งจะมีการอ้างอิงอยู่กับ Domain Name โดยวิธีนี้จำเป็นต้องจดชื่อ Domain ทุกเครื่อง

                ในบทความนี้จะอธิบายวิธีที่ 1 ซึ่งแม้ยุ่งยาก แต่เหมาะกับระบบที่ Internet Public ไม่ค่อยเสถียร และ ถ้าใครต้องการลองวิธีอื่นสามารถตามอ่านได้ใน Web CoreOS[2] ครับ

      วิธีการตั้งค่า etcd2

    • ทำการสร้าง service etcd2 service ด้วย systemd ดังนี้
      sudo vim /etc/systemd/system/etcd2.service
    • ข้อความในไฟล์มีดังนี้ (ถ้าต้องการความปลอดภัยสามารถใช้ https ได้ครับ แต่ต้องมีการทำ certificate เพิ่มเติม ซึ่งไม่ขออธิบายครับ)
      [Unit]
      Description=etcd2
      Conflicts=etcd.service
      
      [Service]
      User=etcd
      Type=notify
      Environment=ETCD_DATA_DIR=/var/lib/etcd
      ExecStart=/usr/bin/etcd2 --name node01 --initial-advertise-peer-urls http://[IP]:2380 \
       --listen-peer-urls http://[IP]:2380 \
       --listen-client-urls http://[IP]:2379,http://127.0.0.1:2379 \
       --advertise-client-urls http://[IP]:2379 \
       --initial-cluster-token etcd-cluster-1 \
       --initial-cluster node01=http://[IP_node01]:2380,node02=http://[IP_node02]:2380,node03=http://[IP_node03]:2380 \
       --initial-cluster-state new
      
      Restart=always
      RestartSec=10s
      LimitNOFILE=40000
      TimeoutStartSec=0
      
      [Install]
      WantedBy=multi-user.target
      
    • Enable etcd2 service เพื่อให้รันทุกครั้งที่เปิดเครื่อง
      sudo systemctl enable etcd2
    • Start etcd2 service
      sudo systemctl start etcd2
    • ตรวจดูสถานะการทำงานของ etcd2 service
      sudo systemctl status etcd2
    • เราสามารถดูข้อมูลสมาชิกได้ดังนี้
      etcdctl member list

     วิธีการตั้งค่า Fleet

    • ทำการสร้าง service fleet โดยการตั้งค่าใน systemd ดังนี้
      sudo vim /etc/systemd/system/fleet.service
    • ข้อความในไฟล์มีดังนี้ (จะเห็นว่า config ตั้งค่าให้ Start หลัง etcd2)
      [Unit]
      Description=fleet daemon
      
      After=etcd2.service
      
      Wants=fleet.socket
      After=fleet.socket
      
      [Service]
      User=fleet
      Environment=GOMAXPROCS=1
      Environment="FLEET_PUBLIC_IP=[IP]"
      ExecStart=/usr/bin/fleetd
      Restart=always
      RestartSec=10s
      
      [Install]
      WantedBy=multi-user.target
    • Enable fleet service เพื่อให้รันทุกครั้งที่เปิดเครื่อง
      sudo systemctl enable fleet
    • Start fleet service
      sudo systemctl start fleet
    • ตรวจดูสถานะการทำงานของ fleet service
      sudo systemctl status fleet
    • วิธีตรวจดูสถานะแต่ละ Node ทำได้ดังนี้
      fleetctl list-machines
    • จะได้ผลลัพธ์หน้าตาประมาณนี้ครับ

           ให้ทำการติดตั้งไปเรื่อย ๆ ทั้ง CoreOS->Etcd2->Fleet จนครบ 3 เครื่อง หรือ 5,7,9 เครื่องแล้วแต่จะต้องการว่าจะสร้างกี่ Node ครับ ยกตัวอย่างถ้าครบ 3 เครื่องก็จะได้ประมาณนี้ครับ

    ทดสอบการสร้าง WordPress ผ่าน Fleet[3]

    • วิธีการทำแน่นอนครับ หนีไม่พ้นไฟล์รูปแบบ systemd (อีกแล้ว) แต่ไม่ต้องรันด้วย systemctl นะครับ ทำที่เครื่องใดเครื่องหนึ่ง สร้างที่ /home/core ก็ได้ดังนี้
    • ก่อนอื่นต้องติดตั้ง docker mysql โดยสร้างไฟล์ mysql.service ดังนี้
      vim mysql.service
    • ข้อความในไฟล์ประมาณนี้ครับ
      [Unit]
      Description=MySQL DataBase
      After=etcd.service
      After=docker.service
      
      [Service]
      TimeoutStartSec=0
      ExecStartPre=-/usr/bin/docker kill mysql
      ExecStartPre=-/usr/bin/docker rm mysql
      ExecStartPre=/usr/bin/docker pull mysql:5.7
      ExecStart=/usr/bin/docker run --name mysql -e MYSQL_ROOT_PASSWORD="wordpress" -e MYSQL_DATABASE="wordpress" -e MYSQL_USER="wordpress" -e MYSQL_PASSWORD="wordpress" mysql:5.7
      ExecStop=/usr/bin/docker stop mysql
    • สร้างไฟล์ wordpress.service ดังนี้
      vim wordpress.service
    • ข้อความในไฟล์ประมาณนี้ครับ
      [Unit]
      Description=WordPress
      After=mysql.service
      
      [Service]
      TimeoutStartSec=0
      ExecStartPre=-/usr/bin/docker kill wordpress
      ExecStartPre=-/usr/bin/docker rm wordpress
      ExecStartPre=/usr/bin/docker pull wordpress
      ExecStart=/usr/bin/docker run --name wordpress --link mysql -p 8880:80 -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=wordpress wordpress
      ExecStop=/usr/bin/docker stop wordpress
      
      [X-Fleet]
      X-ConditionMachineOf=mysql.service
    • สั่ง Start mysql service ด้วย fleetctl ดังนี้
      fleetctl start mysql.service

    • สั่ง Start wordpress service ด้วย fleetctl ดังนี้
      fleetctl start wordpress.service

    • สั่งคำสั่งเพื่อตรวจสอบสถานะดังนี้ (ซึ่งจะบอกว่าติดตั้งที่ Node ใด และสถานะการใช้งาน หรือการติดตั้งเป็นอย่างไร)
      fleetctl list-units

    • เสร็จแล้วลองสั่ง fleetctl list-units ที่ Node อื่น ๆ ดูครับก็จะได้ผลลัพธ์เหมือน ๆ กัน
    • ก็จะได้ web wordpress เอาไว้ใช้งานแล้ว
    • จากนั้นทดสอบลองปิด Node ดูครับ สำหรับระบบที่มี 3 Node พังได้แค่ Node เดียวครับ ถ้าอยากได้มากกว่านั้นต้องเพิ่มจำนวน Node ขึ้นไป 
    • จะพบว่าเครื่องจะย้ายไป Start อีก Node ทันที (มันจะสั่ง start ใหม่นะครับ ไม่ได้ย้ายไปแบบ vmware) เท่าที่ทดสอบข้อมูลไม่ได้มาด้วยครับ อีกทั้งยังได้ ip ที่เครื่องใหม่ เพราะฉะนั้นต้องหาวิธีทำ map volume และ proxy web เอาเองครับ

    (Optional) วิธีการ Fix IP แทน DHCP

    • ในกรณีที่ต้องการ Fix IP แทน DHCP ให้เข้าไปสร้าง systemd network config โดยสร้างไฟล์ดังนี้
      sudo vim /etc/systemd/network/static.network
    • ข้อความในไฟล์ประมาณนี้ครับ
      [Match]
      Name=[Interface Name]
      
      [Network]
      Address=[IP/Mask]
      Gateway=[IP Gateway]
      DNS=[DNS IP มีหลาย IP ให้เว้นวรรค เช่น 10.0.0.1 10.0.0.2]
    • จากนั้นให้ทำการ Restart เครื่อง (จริง ๆ restart service ก็น่าจะได้ แต่ลองแล้วไม่ได้ครับ)

                 สำหรับ CoreOS Cluster ก็มีเท่านี้ครับ แต่จะเห็นว่ายังขาด Docker Management ที่เป็น GUI รวมถึง Docker Gateway และระบบ Storage ติดตามในตอนต่อ ๆ ไปแล้วกันครับ

    ==================================

    Reference :

    [1] มารู้จักกับ CoreOS Linux และวิธีติดตั้ง CoreOS Linux บน Vmware : https://sysadmin.psu.ac.th/2017/05/03/coreos-linux-install-vmware/

    [2] CoreOS Clustering Guide : https://coreos.com/etcd/docs/latest/op-guide/clustering.html#etcd-discovery

    [3] Deploy WordPress in CoreOS Cluster using Fleet : https://wenfeng-gao.github.io/2016/06/03/deploy-wordpress-in-coreos-cluster-using-fleet.html

  • 3 ขั้นตอนง่ายๆ ในการ Block Email ที่ไม่ต้องการใน PSU Webmail

    1. เปิด Email ฉบับที่ไม่ต้องการรับ แล้วคลิกที่ From ในบรรทัด Create Filter
    2. เลือกว่าจะ Block แบบไหน
      2.1 Reject คือโยนทิ้งทันที และแจ้งผู้ส่งด้วย
      2.2 Discard คือโยนทิ้งทันที แบบเงียบๆ
      *** ในช่อง Additional Actions คลิก STOP ด้วย ***
      จากนั้นคลิก Add New Rule
    3. รออะไร คลิก Close สิครับ
  • มารู้จักกับ CoreOS Linux และวิธีติดตั้ง CoreOS Linux บน Vmware

    CoreOS Linux คืออะไร เอาไปใช้ทำอะไร

                 ในโลกของ Containner ในปัจจุบันมีหลายตัวเลือกให้ใช้งาน แต่การใช้งานที่สมบูรณ์จำเป็นต้องมี 3 อย่างรวมกันคือ Containner (ยกตัวอย่าง Docker,Rocket,Lxd), OS ขนาดเล็ก (ยกตัวอย่าง CoreOS, RancherOS, PhotonOS, Snappy Ubuntu Core, Redhat Project Atomic), และสุดท้ายคือโปรแกรมบริหารจัดการ Containner (ยกตัวอย่าง Kubernete, Admiral, Rancher, Kitematic)

                 สำหรับ CoreOS[1] เองรองรับการงานทั้งใน Cloud(AWS,Digital Ocean,Azure,Google Cloud Platform) หรือใน Virtualization Platform (ยกตัวอย่าง OpenStack, VMWare, Vagrant) และยังสามารถติดตั้งลงบนเครื่อง Physical (Bare Metal) ได้อีกด้วย
                 CoreOS มีจุดเด่นอีกอย่างคือระบบ CoreOS Cluster[2] ที่สามารถออกแบบเป็น Cluster ช่วยให้สามารถบริการ Docker Containner กระจายไปยัง Node ต่าง ๆ โดยใช้ etcd ในการจัดการระบบและใช้ fleet ในการสร้าง Docker ที่อยู่บน CoreOS Cluster ซึ่งจะกล่าวต่อไปในบทความต่อไปครับ


                 การติดตั้ง ติดตั้งได้หลากหลายช่องทาง เขียนแผ่นติดตั้งก็ได้ ผ่าน iso ก็ได้ แต่ถ้าเป็น Image จะไม่มี User (จริง ๆ มีแต่ไม่มี Password) ต้องสร้างด้วยสิ่งที่เรียกว่า cloud-config ซึ่งจำเป็นต้องตั้งค่าก่อนติดตั้ง หรืออีกแบบที่จะขอแนะนำ เป็นวิธีที่ใช้สำหรับ Image ที่เป็น ova ของ Vmware ซึ่งใช้วิธี Bypass เข้า Auto Login Mode[1] แล้วเข้าไป Add User เอาเองภายหลัง (สามารถนำไปประยุกต์กับวิธีติดตั้ง Image แบบอื่นได้เช่นเดียวกัน) 

    การติดตั้ง CoreOS ด้วย OVA Image ผ่าน vSphere Client 6.0[3]

    • โหลดไฟล์ติดตั้งจาก https://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova
      (ุถ้า Link เปลี่ยนไปหาดูเอาเองนะครับ)
    • เปิด vSphere Client เลือก deploy OVF Template จากนั้นทำการ Browse File เลือกเครื่อง เลือก DataStore ตามปกติ

     

    • เมื่อถึงหน้าตั้งค่าใส่ Hostname และการตั้งค่า Network เบื้องต้น (ในที่นี้ผมใส่แค่ Hostname และ ชื่อ Network Interface โดยรับ IP จาก DHCP)


    • จากนั้นเมื่อสร้างเสร็จและเปิดเครื่องขึ้นมารีบกดปุ่มลูกศรลงในหน้า Grub ป้องกัน Auto Boot (เร็วมาก ถ้าไม่ทันก็ให้รีเครื่องใหม่)

    • จากนั้นให้เลือก CoreOS default แล้วกด e และพิมพ์ coreos.autologin (ไม่ต้องพิมพ์ \ ก่อนขึ้นบรรทัดใหม่ ระบบจะใส่ให้เอง)

    • จากนั้นกด F10 ก็จะทำการ Boot และ ได้ Prompt สำหรับ adduser ตั้งรหัสผ่านได้เลย ซึ่งจริง ๆ แล้วจะมี User ตั้งต้นอยู่แล้วชื่อ core จะตั้งเฉพาะรหัสผ่าน core ก็ได้เช่นเดียวกัน)
    • ทดสอบ Login จาก ssh เครื่องอื่น ก็จะสามารถใช้งานได้แล้ว

               ตอนต่อไปจะมาดูกันว่าเราจะสร้าง CoreOS Cluster ได้อย่างไร….

    ==================================

    Reference :

    [1] มาเล่น CoreOS กัน : http://thaiopensource.org/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%99-coreos-%E0%B8%81%E0%B8%B1%E0%B8%99/

    [2] CoreOS Cluster บน DigitalOcean : http://thaiopensource.org/tag/coreos/

    [3] How-To Install and Configure CoreOS OVA Image on ESXi : https://www.vladan.fr/how-to-install-and-configure-coreos-ova-image-on-esxi/