วิธีการติดตั้ง Kubernetes Add-on DNS และ DashBoard

Kubernetes มี DNS กับ GUI ให้ใช้งานบ้างไหม             หลังจากติดตั้ง Kubernetes แล้วการสร้าง containner โดยในที่นี้เรียกว่า pod (ใช้เรียก 1 containner หรือกลุ่มของ containner ก็ได้) ซึ่งสามารถสร้างด้วยคำสั่ง Kubectl ได้เลย (สร้างจากที่ไหนก็ได้) สำหรับผู้ที่ยังไม่ได้ติดตั้ง ต้องติดตั้งก่อนตามวิธีติดตั้ง Kubernetes บน CoreOS ตอนที่ 1[1] และ ตอนที่ 2[2]  สำหรับ Add-on ที่แนะนำจะเป็น DNS และ Dashboard ซึ่งเรียกได้ว่าจำเป็นต้องมี ไม่งั้นชีวิตจะยุ่งยากขึ้นเยอะครับ คงไม่มีใครอยากดูรายการ pod เยอะ ๆ ด้วย command line กันนะครับ  วิธีการติดตั้ง DNS-Addon[3] เข้าไปยังเครื่องที่ติดตั้ง Kubectl ไว้แล้ว ทำการสร้าง yaml file ดังนี้ (ถ้า vim วางแล้วเพี้ยนให้ใช้ nano แทน) nano dns-addon.yaml เนื้อหาในไฟล์ดังนี้ (อย่าลืมเปลี่ยน &gt; เป็น > เวลา Copy & Paste ด้วยครับ) apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: “true” kubernetes.io/name: “KubeDNS” spec: selector: k8s-app: kube-dns clusterIP: <DNS Cluster-IP> ports: – name: dns port: 53 protocol: UDP – name: dns-tcp port: 53 protocol: TCP — apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v20 namespace: kube-system labels: k8s-app: kube-dns version: v20 kubernetes.io/cluster-service: “true” spec: replicas: 1 selector: k8s-app: kube-dns version: v20 template: metadata: labels: k8s-app: kube-dns version: v20 annotations: scheduler.alpha.kubernetes.io/critical-pod: ” scheduler.alpha.kubernetes.io/tolerations: ‘[{“key”:”CriticalAddonsOnly”, “operator”:”Exists”}]’ spec: containers: – name: kubedns image: gcr.io/google_containers/kubedns-amd64:1.9 resources: limits: memory: 170Mi requests: cpu: 100m memory: 70Mi livenessProbe: httpGet: path: /healthz-kubedns port: 8080 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /readiness port: 8081 scheme: HTTP initialDelaySeconds: 3 timeoutSeconds: 5 args:

Read More »

วิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 2 Worker Node)

ถ้าต้องการระบบจัดการ docker container สักตัวต้องทำอย่างไร (ตอนที่ 2)             จากตอนก่อนหน้านี้ รู้จักกับ Kubernetes และวิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 1 Master Node)[1] ก็มาต่อด้วยการติดตั้งบนเครื่อง Worker ต่อครับ  วิธีการติดตั้ง Kubernetes Worker Node[2] ทำการติดตั้ง CoreOS บน Worker Node สร้าง directory ดังนี้ sudo mkdir -p /etc/kubernetes/ssl ทำการ copy ที่สร้างไว้ก่อนหน้านี้มาไว้ใน folder ดังนี้ File: /etc/kubernetes/ssl/ca.pem File: /etc/kubernetes/ssl/${WORKER_FQDN}-worker.pem File: /etc/kubernetes/ssl/${WORKER_FQDN}-worker-key.pem เปลี่ยน permission และ owner file เฉพาะไฟล์ -key* ดังนี้ sudo chmod 600 /etc/kubernetes/ssl/*-key.pem sudo chown root:root /etc/kubernetes/ssl/*-key.pem ทำการทำ link เผื่อให้ config แต่ละ worker เหมือน ๆ กัน cd /etc/kubernetes/ssl/ sudo ln -s ${WORKER_FQDN}-worker.pem worker.pem sudo ln -s ${WORKER_FQDN}-worker-key.pem worker-key.pem จากนั้นตั้งค่า flannel network เป็น network ที่เอาไว้เชื่อมแต่ละ pod ให้สามารถคุยกันได้ข้ามเครื่อง เพื่อสร้างวง virtual ip ให้กับ pod ดังนี้ sudo mkdir /etc/flannel ทำการสร้างไฟล์ option.env sudo vim /etc/flannel/options.env เนื้อหาในไฟล์ดังนี้ FLANNELD_IFACE=<Worker IP> FLANNELD_ETCD_ENDPOINTS=http://<Master IP>:2379,http://<Node1 IP>:2379,http://<Node2 IP>:2379 จากนั้นทำการสร้าง flannel service ดังนี้ sudo mkdir -p /etc/systemd/system/flanneld.service.d/ sudo vim /etc/systemd/system/flanneld.service.d/40-ExecStartPre-symlink.conf เนื้อหาในไฟล์ดังนี้ [Service] ExecStartPre=/usr/bin/ln -sf /etc/flannel/options.env /run/flannel/options.env จากนั้นทำการตั้งค่า docker เพื่อกำหนดให้ใช้งานผ่าน flannel โดยสร้างไฟล์ config ดังนี้ sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/40-flannel.conf เนื้อหาในไฟล์ดังนี้ [Unit] Requires=flanneld.service After=flanneld.service [Service] EnvironmentFile=/etc/kubernetes/cni/docker_opts_cni.env โดยที่ทำสร้างไฟล์ docker_opts_cni.env ขึ้นมาประกอบดังนี้ sudo mkdir -p /etc/kubernetes/cni sudo vim /etc/kubernetes/cni/docker_opts_cni.env เนื้อหาในไฟล์ดังนี้ DOCKER_OPT_BIP=”” DOCKER_OPT_IPMASQ=”” จากนั้นทำการ restart docker service สักรอบดังนี้ sudo systemctl restart docker หนังจากนั้นทำการสร้าง config ไฟล์สุดท้ายสำหรับ flannel ดังนี้ sudo mkdir -p /etc/kubernetes/cni/net.d sudo vim /etc/kubernetes/cni/net.d/10-flannel.conf เนื้อหาในไฟล์ดังนี้ { “name”: “podnet”, “type”: “flannel”, “delegate”: { “isDefaultGateway”: true } } ทำการ start flannel service

Read More »

รู้จักกับ Kubernetes และวิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 1 Master Node)

ถ้าต้องการระบบจัดการ docker container สักตัวต้องทำอย่างไร             เมื่อกล่าวถึงระบบจัดการ docker container สักตัวหนึ่ง มักจะกล่าวถึง opensource ตัวหนึ่งชื่อ kubernetes ซึ่งเป็นเครื่องมือที่พัฒนาขึ้นมาด้วย Google[1] ซึ่งสามารถรองรับทั้งในส่วนของ Google Container Engine และ CoreOS จริง ๆ ลงได้บนอีกหลาย platform แต่สำหรับ CoreOS ได้ออกแบบมาให้รองรับ Kubernetes ทำให้การติดตั้งง่ายและสมบูรณ์มากขึ้น (อ่านไปเรื่อย ๆ จะสงสัยนี่ง่ายแล้วเหรอ แต่หลังจากเขียนบทความนี้เสร็จก็มีตัวติดตั้งตัวใหม่ชื่อ Tectonic[6] น่าจะเป็นตัวที่ทำให้การติดตั้งง่ายขึ้นครับ)             Kubernetes เป็นเครื่องมือที่ช่วย build, deploy และ scale ให้เป็นเรื่องง่าย ๆ และสามารถ replicate containner ได้ง่ายมาก การติดตั้ง Kubernetes บน Google Container Engine ง่ายมาก แต่การติดตั้งบน CoreOS จะยากกว่า ซึ่งสามารถติดตั้งแบบ Single Node และ Multi-Node ซึ่งถ้าจะทำ Multi-Node ต้องเชื่อมต่อไปยัง etcd service ที่ติดตั้งบน CoreOS Cluster ด้วยก็จะดีครับ (ไม่งั้นเป็น Cluster ที่ไม่สมบูรณ์) สามารถอ่านเพิ่มเติมได้ที่วิธีการติดตั้ง CoreOS Cluster[2] (ในบทความใช้ก่อนหน้านี้ CoreOS Cluster เขียนในส่วน ETCD Version 2 แต่การใช้งานกับ Kubernetes ต้องใช้ ETCD Version 3 ตอนนี้ยังไม่มีบทความเสริมในส่วนนี้ อาจจะต้องหาข้อมูลเองก่อนครับ จริง ๆ มีวิธีแต่ยังยากในการเขียนบทความ ไว้ค่อยเขียนเพิ่มให้อีกทีครับ) ซึ่งแน่นอนระหว่าง master node และ worker node มีการตรวจสอบเรื่อง certificate ระหว่าง service ด้วย             ตัวอย่าง Diagram ของระบบทั้งหมด[3] เรียนรู้การค่าเบื้องต้นก่อนการติดตั้ง[4] MASTER_HOST : คือ ชื่อ host ที่ node ลูกเอาไว้ติดต่อและให้เข้าถึงจาก external client  เช่นเวลาสั่งสร้างเครื่องก็จะสั่งผ่านตัวนี้ ในกรณที่ต้องการทำ HA MASTER_HOST จะถูกใช้เป็น load balance โดยใช้ร่วมกับ DNS name โดยการคุยกันระหว่าง MASTER_HOST และ worker (node ลูก) จะใช้ port 443 และมีการเข้ารหัสและยืนยันด้วย TLS Certificate ETCD_ENDPOINT : คือ บริการของ etcd service ซึ่งมีใน CoreOS Cluster ที่ติดตั้งไว้ ให้ใส่ไปให้หมดว่ามีเครื่องอะไรบ้าง คั่นด้วย , (ในที่นี้ไม่ได้ใช้ fleet สร้างเครื่อง หลังจากลงเสร็จจะใช้ kubectl สร้างแทน) POD_NETWORK : เช่น 10.2.0.0/16 ใช้สำหรับกำหนดวง IP ของ pod (pod คือ ชื่อเรียก container อาจจะแค่ 1 container เหรือเรียกเป็นกลุ่มของหลาย ๆ container ที่สร้างด้วย kubernetes) SERVICE_IP_RANGE : เช่น 10.3.0.0/24 ใช้สำหรับ service

Read More »

เรียนรู้เกี่ยวกับ 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]          Distributed Glusterfs Volume : เป็น default volume ของ glusterfs คือการเมื่อสร้างไฟล์ลงใน volume นั้น ๆ ก็จะกระจายไปเก็บยัง Brick ต่าง ๆ ถ้าเครื่องไหน Brick พังไฟล์ในเครื่องนั้นก็จะพังไปด้วยเพราะไม่มีสำรอง ข้อดีที่คือประหยัดที่ ข้อเสียคือการป้องกันไฟล์เสียหายขึ้นอยู่กับ Hardware RAID เครื่องอย่างเดียว Replicated Glusterfs Volume : รูปแบบนี้จะมีการทำสำเนาข้อมูลไฟล์นั้น ๆ ไปยังอีกเครื่อง ซึ่งจะตั้งให้เก็บกี่สำเนาก็ได้แล้วแต่จะกำหนด ถ้า Brick ใดเสียก็สามารถ Access ไฟล์นั้นจากอีก Brick แทน Distributed Replicated Glusterfs Volume : รูปแบบนี้จะซับซ้อนขึ้นแต่ก็ประมาณ ไฟล์หนึ่งจะกำหนดให้เก็บกี่สำเนา ส่วนจะไปอยู่เครื่องใดบ้าง ระบบจัดการให้เอง แต่จำนวนสำเนาต้องสอดคล้องกับจำนวน Brick นั่นเอง (ผมไม่อธิบายมากนะครับ เพราะยังไม่ค่อยเข้าใจมากนั้น เพราะไม่ได้ลอง) Striped Glusterfs Volume : คือการใช้หลักการในข้อ 1 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจาย Distributed Striped Glusterfs Volume : คือการใช้หลักการในข้อ 2 เพิ่มเติมคือหั่นไฟล์ย่อย ๆ และเก็บกระจายเช่นเดียวกัน Distributed Replicated and Striped Glusterfs Volume : เป็นรูปแบบทีทั้งหั่นไฟล์ และสำเนาไฟล์ ซึ่งจะดีที่สุด แต่จะเปลืองเนื้อที่ที่สุด (ไม่มีรูปตัวอย่าง) ถ้าสรุปง่าย ๆ Strip เพื่อให้ได้เนื้อที่เยอะ ๆ โดยเอามาจากหลาย ๆ node ในส่วนของ Replicate เพื่อป้องกันข้อมูลหาย ตัวอย่างวิธีการคิดขนาดในแต่ละ Volume Type[3] ตัวอย่างการออกแบบผังการเชื่อมต่อเครือข่าย[4]         

Read More »

วิธีสร้าง 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 »