วิธีสร้าง 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 วิธีคือ  Static เป็นวิธีที่ระบุลงไปเลยในแต่ละเครื่องว่ามีเครื่องไหนบ้างที่อยู่ใน Cluster วิธีการนี้ข้อเสียคือถ้าเพิ่มต้องเพิ่มทุกเครื่อง etcd Discovery เป็นวิธีที่จะให้ Discovery Service เป็นคนทำหน้าที่เก็บข้อมูล (เหมือน tracker torrent) เมื่อเพิ่มเครื่องใหม่ ก็แค่ชี้ไป Discovery URL ก็เสร็จ 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

Read More »

มารู้จักกับ 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 ตั้งรหัสผ่านได้เลย

Read More »

วิธีการติดตั้ง Docker บน Ubuntu 16.04

“อยากติดตั้ง Docker บน Ubuntu 16.04 ทำอย่างไร”          นอกจาก containner ที่เป็น lxd ของ Ubuntu แล้ว ก็ยังสามารถใช้ในรูปแบบ Docker เช่นเดียวกัน แต่ค่อนข้างยุ่งยากกว่าเล็กน้อย โดยถ้าเทียบประสิทธิภาพแล้วในส่วนของ lxd จะดีกว่าแต่ในแง่ของ Image ทาง Docker ยังมีมากกว่า (แต่อนาคตอะไรก็ไม่แน่นอน ขึ้นอยู่กับจะเอามาใช้ทำอะไรมากกว่า และมีคนทำมาให้ใช้อันไหนมากกว่า หรือถนัด Image เองแบบไหนมากกว่า สรุปชอบอันไหนใช้อันนั้นแล้วกันครับ) วิธีการติดตั้ง (Ubuntu 16.04) *Ref : https://docs.docker.com/engine/installation/linux/ubuntulinux/ เนื่องจากไม่มี docker ใน Ubuntu Package โดยตรง จึงต้องเพิ่ม source.list ก่อนดังนี้ sudo apt-get update sudo apt-get install apt-transport-https ca-certificates sudo apt-key adv –keyserver hkp://ha.pool.sks-keyservers.net:80 –recv-keys 58118E89F3A912897C070ADBF76221572C52609D echo “deb https://apt.dockerproject.org/repo ubuntu-xenial maindeb https://apt.dockerproject.org/repo ubuntu-xenial main” | sudo tee /etc/apt/sources.list.d/docket.list deb https://apt.dockerproject.org/repo ubuntu-xenial maindeb https://apt.dockerproject.org/repo ubuntu-xenial main จากนั้น Update Package ให้ล่าสุดอีกครั้ง sudo apt-get update จากนั้นทำการติดตั้ง Linux Kernel Extra sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual ทำการติดตั้ง Docker Engine ดังนี้ sudo apt-get install docker-engine จากนั้นทำการ Start Docker Service sudo service docker start ทำการทดสอบติดตั้ง Image Hello-World ดังนี้ sudo docker run hello-world จากนั้นสามารถใช้คำสั่งตรวจสอบ Version Docker ได้ดังนี้ sudo docker version จะเห็นว่าเพียงแค่นี้ก็ได้ Docker มาใช้งานแล้วครับ แถมอัพเดต Version ให้ตลอดด้วยครับ

Read More »

Juju #06 – เชื่อม MySQL Master-Master เข้ากับ HAProxy

ต่อจาก Juju #05 – วิธีกระจายงานไปยัง MySQL แบบ Master-Master เมื่อสร้าง MySQL แบบ Master-Master Replication ได้แล้ว ก็มาเชื่อมกับ HAProxy เพื่อให้ Application ที่เขียน มองเห็นทั้งระบบเป็นชิ้นเดียว IP Address ของระบบต่างๆเป็นดังนี้ haproxy : 10.107.107.71 mysql-master1: 10.107.107.35 mysql-master1: 10.107.107.83 ขั้นตอนการติดตั้ง ที่ mysql-master1 ต้องสร้าง 2 Users ขึ้นมา ชื่อ haproxy_check และ haproxy_root ด้วยคำสั่งต่อไปนี้ mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e “INSERT INTO mysql.user (Host,User) values (‘10.107.107.71′,’haproxy_check’); FLUSH PRIVILEGES;” mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e “GRANT ALL PRIVILEGES ON *.* TO ‘haproxy_root’@’10.107.107.71’ IDENTIFIED BY ‘password’ WITH GRANT OPTION; FLUSH PRIVILEGES;” ที่ haproxy ติดตั้ง mysql-client ด้วยคำสั่ง sudo apt-get install mysql-client ทดสอบด้วยคำสั่ง mysql -h 10.107.107.35 -u haproxy_root -ppassword -e “SHOW DATABASES;” mysql -h 10.107.107.83 -u haproxy_root -ppassword -e “SHOW DATABASES;” แก้ไขไฟล์ /etc/haproxy/haproxy.cfg โดยเพิ่มบรรทัดต่อไปนี้ท้ายไฟล์ [3] frontend mysql-cluster bind *:3306 mode tcp default_backend mysql-backend backend mysql-backend mode tcp balance roundrobin server mysql-master1 10.107.107.35:3306 check server mysql-master2 10.107.107.83:3306 check และสุดท้าย ทดสอบด้วยคำสั่งต่อไปนี้ for i in `seq 1 6`; do mysql -h 127.0.0.1 -u haproxy_root -ppassword -e “show variables like ‘server_id'”; done ควรจะได้ผลประมาณนี้ จากนั้นก็สามารถพัฒนา Application โดยใช้ IP Address ของ haproxy ซึ่งในที่นี้คือ 10.107.107.71 และ Port 3306 ได้แล้ว ซึ่งเบื้องหลัระบบจะทำการ Replication กันเองทั้งหมด Reference: [1] https://www.digitalocean.com/community/tutorials/how-to-set-up-mysql-master-master-replication [2] https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing–3 [3] https://serversforhackers.com/load-balancing-with-haproxy  

Read More »

Juju #04 – วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB

ต่อจาก Juju #03 – วิธีสร้าง Load Balance MySQL เมื่อมี MySQL Server มากกว่า 1 ตัว ซึ่งทำการ Replication กัน (ในตอนนี้ 2 ตัว คือ Master กับ Slave) ซึ่งให้ความสามารถในเรื่อง [1] Data-Security : เมื่อข้อมูลถูก Replicate ไปที่ Slave แล้ว เราสามารถหยุดการทำงานของ Slave เพื่อทำการสำรองข้อมูลได้ โดยไม่กระทบประสิทธิภาพการทำงานของ Master Analytics: ทำการวิเคราะห์ข้อมูลต่างๆได้ที่ Slave โดยไม่กระทบประสิทธิภาพการทำงานของ Master Scale-Out Solutions: เมื่อมี Slaves หลายตัว ทำให้สามารถกระจายงานในด้าน Read เพื่อเพิ่มประสิทธิภาพ โดยการแก้ไขข้อมูล จะทำที่ Master เท่านั้น ในบทความนี้ จะกล่าวถึงวิธีการ Scale-Out Solutions ของ WordPress เท่านั้น โดยใช้ Plugin ชื่อ HyperDB HyperDB [2] เป็น Database Class ที่ใช้แทนที WordPress built-in database functions โดยจะทำให้ WordPress สามารถติดต่อกับ MySQL ได้หลายเครื่อง โดยที่สามารถกำหนดได้ว่าจะ Write ไปยัง Master และ Read จากทั้ง Master และ Slaves อีกทั้งยังสามารถ Failover ได้อีกด้วย วิธีการติดตั้ง HyperDB ที่ WordPress ใช้คำสั่ง wget https://downloads.wordpress.org/plugin/hyperdb.1.2.zip sudo apt-get install unzip sudo unzip hyperdb.1.2.zip ย้ายไฟล์ hyperdb/db-config.php ไปยังที่ Directory เดียวกันกับ wp-config.php (ในที่นี้คื่อ /var/www/) sudo cp hyperdb/db-config.php /var/www ย้ายไฟล์ hyperdb/db.php ไปยังที่ Directory wp-content (ในที่นี้คื่อ /var/www/wp-content) sudo cp hyperdb/db.php /var/www/wp-content/ แก้ไขไฟล์ db-config.php (ในที่นี้คื่อ /var/www/db-config.php) [3] โดยค้นหาคำว่า DB_HOST ซึ่งควรจะปรากฏอยู่แค่ 2 แห่งในไฟล์ ให้ไปที่ชุดที่ 2 ซึ่งมีเนื้อหาประมาณนี้ จากนั้นแก้ไข DB_HOST ให้เป็น DB_SLAVE_1 ต่อไปก็ไปเพิ่ม define(‘DB_SLAVE_1′,’xxx.xxx.xxx.xxx’) ซึ่งไฟล์ wp-config.php หรือไม่ก็ wp-info.php (ในที่นี้อยู่ที่ /var/www/wp-info.php) เมื่อทดสอบใช้งาน พบว่า มี Query มาทั้งที่ master และ slave ในภาวะว่าง ในภาวะมีงานเข้ามา ทดสอบเพิ่มบทความใหม่ ชื่อ “This is my first article” พบว่า ระบบสามารถเขียนไปยัง Master แล้วสามารถส่งต่อไปให้ Slave ได้ ต่อไป เพิ่ม mysql-slave2 เข้าไปใน Juju และสร้าง Relation เป็น master -> Slave เช่นกัน แล้วทำการเพิ่ม DB_SLAVE_2 เข้าไปใน db-config.php และ wp-info.php ก็จะพบว่าข้อมูลได้ Replicate ไปหา Slave2 แล้ว และ เมื่อทำการ

Read More »