ตั้งศูนย์บัญชาการ Kubernetes ด้วย Kubefed (Multi-Region Kubernetes Cluster Federation)

ในบทความนี้จะมี marketing keywords คำหลักๆ อยู่ 3 คำคือ Kubernetes Cluster, Multi-Region Kubernetes, Federation ครับ

แล้ว Kubernetes Cluster คืออะไร?

คือชุดของ Host container ของเราสำหรับรัน Application ซึ่งทำงานใน container เหล่านี้ครับ
และ Host เหล่านี้เรียกว่า Node ของ Kubernetes คลัสเตอร์ ทุกคลัสเตอร์ Kubernetes จะมีอย่างน้อย 1 Master node และ 1 Worker node โดยหน้าที่หลักของ Master node จะมีหน้าที่กำหนดกฏเกณฑ์ตั้งค่าต่างๆ ส่วน Worker node ทำหน้าที่เป็นโปรแกรมเรียกใช้ Application ใน container.

Multi-Region Kubernetes กับ Federation

หากคุณมี Kubernetes Cluster อยู่ Region ที่แตกต่างกันและต้องการเรียกใช้ Application เดียวกันในกลุ่ม Cluster ทั้งหมด Concept โครงสร้างพื้นฐานสิ่งนี้เรียกว่า Kubernetes Cluster Federation หรือ KubeFed ครับ

KubeFed เป็น Control plane ศูนย์บัญชาการ Kubernetes ที่ประกอบด้วย Operator หนึ่งเดียวที่ทำงานคอยสั่งการ Application ใน Federated cluster ยกตัวอย่าง เช่น หากบริการหยุดลงใน Containers ตัวใดตัวหนึ่ง Master node จะเป็นตัวดำเนินการสร้าง Container ขึ้นมาใหม่ และจากนั้นก็จะเริ่มสตาร์ท Application ใน Container ใหม่นี้

ทำนองเดียวกันครับ หาก Node ใด Node หนึ่งหยุดทำงาน เจ้า Master ก็จะ pitch ให้เพิ่ม Node ใหม่ให้กับ Cluster จากนั้นมันก็จะสร้าง Container ตามจำนวนที่ต้องการและเริ่มต้นสตาร์ท Application ใน Container.

อ่านมาถึงตรงนี้ผู้เขียนหวังว่าตอนนี้เราพอจะเข้าใจภาพรวมของ Kubernetes Cluster บ้างแล้วนะครับ
งั้นไปต่อกันเลย…ค่อยๆ ปูพื้นไปด้วยกัน

ตั้งศูนย์บัญชาการ Kubernetes ด้วย Kubefed ไปทำไม?

  • ถ้าเกิดการล่มของระบบขึ้นมา สามารถ DR ได้ (disaster recovery)
  • ทำ Dynamically adjust replicas ใน Clusters รองรับ workload
  • Application ไม่ได้ผูกติดอยู่กับแต่ละเครื่อง
  • High availability ลดเวลา Downtime ทำให้ระบบพร้อมใช้งาน
  • กระจายโหลดข้าม Cluster
  • รองรับการสเกล Nodes บน Multiple Clusters
  • Low latency
  • ให้บริการ Application กับผู้ใช้จากศูย์ข้อมูลที่ใก้ลลูกค้าที่สุด

สิ่งที่จะเป็นประโยชน์และเกิดขึ้นได้ก็ต่อเมื่อเรามี Cluster หลายแห่งอยู่บน Region ต่างๆ
และออกแบบโครงสร้างพื้นฐาน Kubernetes cluster federation บน Hybrid cloud ที่เป็น Multiple cluster บน Cloud provider ที่แตกต่างกันหรือ Datacenter หรือ On-premise ที่แตกต่างกัน มันเจ๋งมากที่ Federation สามารถจัดการได้ครับ

ก่อนที่เราจะไปเริ่มเซตอัพ Kubernetes Cluster ผู้เขียนขอเกริ่นสักนิดเกี่ยวกับ Introduction และ Concept ของ Kubernetes ซักเล็กน้อยก่อนนะครับ (สำหรับผู้ที่มีพื้นฐานอยู่แล้วข้ามไปได้เลย)

Kubernetes เป็นแพลตฟอร์ม tools ที่ช่วยให้เหล่านักพัฒนาแอปพลิเคชั่นสามารที่จะ deploy software ได้สะดวก และ้วง่ายต่อการสเกล ขยับขยายระบบ

ปัจจุบัน Kubernetes หรือเรียกสั่นๆ K8s เป็นโปรเจคที่ดูแลโดย Cloud Native Computing Foundation หรือ CNCF เอาล่ะที่นี้เราไปดูว่าวิธีการ Deploy หรือติดตั้งรันแอปพลิเคชั่นซักตัวแบบดั่งเดิมกับแบบสมัยใหม่บน Kubernetes มันแตกต่างกันยังไง

การ Deploy แอปพลิเคชั่นแบบดั่งเดิม

สมมุตินะสมมุติ ถ้าเราต้องการติดตั้ง Web application ให้บริการซักตัวต้องเริ่มต้นยังไงบ้าง

  • สั่งซื้อเซิร์ฟเวอร์ /เซตอัพ หรือสมัครใช้บริการ Cloud เช่าเครื่อง VM
  • ติดตั้ง OS เสร็จก็ ssh เข้าไปติดตั้ง Web stack ซอฟต์แวร์ที่จำเป็น เช่น
    Web server (NGINX/Apache), MariaDB, PhpMyAdmin และนู่นนั่นนี่อื่นๆ
  • เสร็จเรื่องติดตั้ง Web server สำหรับรัน Web app ขนาดเล็กๆ หนึ่งแอพ

แล้วถ้าเป็น App ขนาดใหญ่ล่ะ?

  • ที่มีนักพัฒนาหลายสิบคน
  • ต้องการเปลี่ยน version แอพอยู่ตลอด
  • ต้องการสเกลเครื่องเพิ่ม ขยาย CPU, Memory, Disk ฯลฯ
  • ต้องการย้าย Datacenter
  • อยากได้ Environment แบบเดิมเป๊ะๆ บน Datacenter แห่งใหม่
  • ยังไม่หมด แล้วเครื่องดับ ฮาร์ดแวร์พัง ทำไง? 55+++

จากปัญหาและความต้องการที่กล่าวมาจึงเข้าสู่ยุคของ Containerized Application

การ Deploy แอปพลเคชั่นสมัยใหม่

ยุคนี้ซอฟต์แวร์แวดวง container ที่เป็นที่ยอดฮิตก็อย่าง Docker ครับ ที่เข้ามาช่วยแก้ปัญหาที่กล่าวมาจากข้างบนได้บางขั้น เช่น อยากได้ Enviroment เป๊ะๆ ก็เขียน Docker ไฟล์คอนฟิกที่มีลักษณะที่เรียกว่า Infratructure-as-Code ได้เลย อยากได้ version ซอฟต์แวร์ Web server อย่าง NGINX หรือ Apache ก็เขียนกำหนด version ได้เลย เวลา Deploy เสร็จก็ได้ทั้ง Web Stack ที่ต้องการเสร็จสรรพครับ จะเป็นว่าเราไม่ต้องไปยุ่งเกี่ยวกับการติดตั้ง OS, แล้ว ssh ไปติดตั้งแพคเกจที่ละตัวให้ยุ่งยาก

แต่ Docker ก็ยังไม่ได้ช่วยแก้ปัญหาได้หมดทุกอย่าง (เพราะมนุษน์มีความต้องการเรื่อยๆ 555+++)

  • อยากจะสเกล ขยาย container
  • อยากแบ่งแยก Networking แต่ละ service แต่ละ container
  • อยากมี tools จัดการ container

เข้าสู่ยุค Container Orchestration

จากความต้องการลิตส์ข้างบน Orchestration ก็เข้ามาช่วย เช่น อยากสเกลขยาย container ก็มีโครงสร้างของระบบที่โคลนได้ (Replica) เช่น App abc รันอยู่บน ContainerA 2 ชุด และ ContainerB 3 ชุด เท่าที่ดูก็ค่อนข้างตอบโจยท์ให้ไหมครับ เพราะเราไม่ต้องไปยุ่งวายกับเครื่องเซิฟเวอร์เครื่อง Physical (node) เลย

เดี๋ยวววๆๆๆ

  • แล้วถ้าเครื่อง Physical หรือเครื่องที่เป็น Node พังล่ะ
  • ถ้าต้องการ Kubernetes แบบ Multi-Region
  • และต้องการโครงสร้างระบบแบบ Kubernetes Cluster ล่ะ?

ปกติ K8s จะติดตั้งอยู่บน Physical ที่อยู่ใน Datacenter เพียงแห่งเดียว แต่มีหลาย Nodes.

แล้ว Kubernetes คืออะไร

เขียนจั่วหัวไว้แล้วข้างบน ถ้าจะให้กลับขึ้นไปอ่าน ดูใจร้ายไป copy มาวาง ให้อีกรอบก็ได้ 555+

Kubernetes เป็นแพลตฟอร์ม tools ที่ช่วยให้เหล่านักพัฒนาแอปพลิเคชั่นสามารที่จะ deploy software ได้สะดวก และ้วง่ายต่อการสเกล ขยับขยายระบบ

Production-Grade Container Orchestration: Automated container deployment, scaling, and management

ส่วนข้อดีของ Kubernetes (K8s) หาใน Google เอาล่ะกันครับ ขอข้าม ^^ แต่ถ้าจะให้สั้นๆ ก็ K8s มีความยืดหยุ่นสูง, มี API, รันได้ทั้งบน Cloud และ Physical server หรือแม้แต่จะเอามันไปขี่บนพวก PaaS ก็ยังได้ครับ

องค์ประกอบ Kubernetes ต้องมีอะไรบ้าง?

1. Cluster

  • Cluster Physical server สำหรับทำเป็น Cluster ขั้นต่ำจำนวน 3 เครื่อง เอาไว้รัน containers นั้นเองครับ และส่วนที่ On-top บน Cluster ก็จะเป็น K8s ที่จะเป็นตัวจัดการเองว่าเครื่อง container จะไปรันอยู่บน Physical server เครื่องไหนเองครับ
  • ใน Cluster จะประกอบไปด้วย Master และ Node
    • Master ทำหน้าที่จัดการ node เวลานักพัฒนาแอปจะ deploy หรือแก้ไขอะไรก็ต้องสั่งงานผ่าน master
    • และ Node (มี process ชื่อ kubelet) ทำหน้าที่ไว้คุยกับ Master และมี Containers service ไว้รัน container

2. Deployment

Credit image: kubernetes.io
  • เวลา​ deploy แอปพลิเคชั่นไปรันบน K8s ตัวแอปจะรันอยู่ในสิ่งที่เรียกว่า Deployment
  • Deployment จะเป็นส่วนที่เป็น configuration ที่ใช้สร้างแอปหรืออัพเดทแอป หรือกำหนดพวก desired state ของแอปพลิเคชั่นเรา
  • หลังจากสร้าง Deployment ของแอป เพื่อกำหนด config ให้แอปเราแล้ว จากนั้นมันจะเอาแอปเราไปรันในสิ่งที่เรียกว่า Pod

3. Pod

Credit image: kubernetes.io
  • Pod สิ่งที่แทนกลุ่มของ container และ resource ต่างๆ ที่จำเป็นสำหรับ container นั้นๆ เช่น พวก Storage, Network IP address และที่เก็บ config ต่างๆ เช่น แต่ละเซอร์วิสรันพอร์ตไหน เป็นต้น และแต่ล่ะ container ต้องสื่อสารคุยผ่าน Port
  • ใน 1 Pod จะเปรียบเสมือน 1 host ที่เราติดตั้งพวก Web server ที่ต้องลงซอฟต์แวร์ Apache, MySQL และ PHP ในเครื่องเดียวทั้งหมด ดังนั้นเซอร์วิส Apache เป็นหนึ่ง container ที่รันอยุ่ใน Pod และคุยผ่าน localhost เมื่อติดต่อกับ MySQL container เป็นต้น

4. Replica Set

  • เป็นส่วนที่อยู่ใน Deployment เพื่อกำหนดว่าจะสร้าง Pod แล้วให้มัน Replica Set ขึ้นมาเท่าไหร่
  • เช่น หากแอปพลิเคชั่น ทำงาน overload หากต้องการขยาย container ก็ให้กำหนด Peplica Set สร้าง Pod อีก 3 replica เมื่อ CUPS usage เกิน 85% เป็นต้น
  • การสเกลขยายสร้าง Pod เรียกอย่างหล่อว่า Horizontal Pod Autoscalers (HPA)

สรุปสั้นๆ Deployment = Replica Set + Pod และใน 1 Deployment จะมี 1 Replica Set และมี Pod ได้ 1 แบบ แต่มีหลายๆ Pod ได้

Credit image: kubernetes.io

Multi-Region Kubernetes Cluster Federation บน Ruk-com PaaS

โดย concept การ design architecture แบบ Multi-Region Kubernetes Cluster ก็คือการออกแบบโครงสร้างพื้นฐานบนคลาว์ดที่ทำให้ Application ทำงานอยู่คนล่ะ Zone ได้อย่าง Region สิงค์โปร์บน Datacenter ของ OVH และใน Region ไทยอยู่ที่ Datacenter ของ Proen เมื่อเป็นระบบ Cluster แล้วเราก็สามารถย้าย Appliction กระโดดไปอยู่คนล่ะ Region ได้ ส่วนของ File System บน Environment ก็ใช้ Shared Storage NFS services ซึ่งเข้าถึงกันได้หมด ตอบโจทย์การทำ HA และ DR และใช้บริการ Kubernetes Managed Services ได้อีกด้วย.

Multi-Region Kubernetes Cluster Federation บน Ruk-com PaaS

การที่จะเรียกใช้แอปพลิเคชันเดียวกันในคลัสเตอร์ทั้งหมดในภูมิภาคต่างๆ การใช้งานลักษณะนี้เรียกว่า Kubernetes Cluster Federation หรือ KubeFed

โดยคอนเซปต์ Kubernetes Federation คือเป็นการรวมหลาย Cloud หรือ Datacenter ในภูมิภาคต่างๆ ที่เราติดตั้ง Kubernetes ไว้เอามาจัดการแบบรวมศูนย์และการจัดการแอปพลิเคชันพร้อมให้บริการ Kubernetes แบบ Multi-Region Cluster

Managed Kubernetes Hosting with Multi-Cloud Availability

บทบาทของ KubeFed

*สำหรับในบทความนี้ผู้เขียนใช้แพลตฟอร์ม Ruk-Com Cloud PaaS สำหรับทดสอบ Rulti-Region Kubernetes Cluster

สมมุติว่าภายใน Ruk-Com PaaS เรามี 4 Clusters ที่ต่าง Region และเราต้องการปรับใช้แอปพลิเคชันกับ Cluster เหล่านี้ สิ่งแรกที่ต้องมีคือ Host Cluster ที่ทำหน้าที่เป็น Federation Control Plane ที่จะเป็นตัวส่งการกำหนดค่าสั่งการไปยัง Member ในกลุ่มคลัสเตอร์ หรือเรียกว่า Member Clusters

ไปตั้งศูนย์บัญชาการ Kubernetes ในแพลตฟอร์ของ Ruk-Com PaaS กันเลยดีกว่าครับ ปายๆๆๆ…

เริ่มต้น (มือใหม่) สมัครใช้งาน Ruk-Com Paas คลิกที่นี่ https://www.ruk-com.cloud/register
สำหรับผู้ที่ใช้งานแพลตฟอร์ม Ruk-com cloud อยู่แล้วก็ Login เข้าสู่ระบบ จากนั้นสร้าง Kubernetes คลัสเตอร์ใน Region ที่แตกต่างกันขึ้นมา 2 คลัสเตอร์* เช่น Proen-TH กับ OVH-SG

*เราสามารถสร้าง Kubernetes คลัสเตอร์ได้เท่าที่ตามต้องการ แต่สำหรับในบทความนี้ผู้เขียนสร้างเพียง Host Cluster และ Member Cluster 1 เท่านั้นครับ

credit image: Ruk-Com PaaS Kubernetes cluster

ขั้นตอนการ Deploy สร้าง Kubernetes Cluster

1. Deploy สร้าง Federation Host Cluster

2. Deploy สร้าง Federation Member Cluster

ซึ่งหลังจากเราสร้าง Kubernetes เสร็จ เราจะได้ Stack ดังนี้ โดยแพลตฟอร์ม Ruk-com cloud ได้จัดเตรียม Kubernetes Cluster ไว้ให้ใน Maketplace สามารถคลิกติดตั้งได้ทันที ง่ายสุดๆ ครับ ^^

Pre‑Installed Kubernetes Components

เริ่มต้นให้ Login เข้าแพลตฟอร์ม Ruk-com cloud และทำการสร้าง Federation Host Cluster โดยคลิก “Deploy Soltuion from Marketplace” ดังรูป

Deploy Soltuion from Marketplace

คลิกเลือก Kubernetes cluster

Kubernetes cluster

เลือก Topology และเลือก Region สำหรับ Host Cluster ที่ประเทศไทย Datacenter (CSLox-TH) หรือเลือกเป็น Proen-TH ก็ได้เช่นกัน

สำหรับในบทความนี้ผู้เขียนจะเลือกเป็น Development ซึ่งจะประกอบด้วย 1 Control-plane และ 1 Worker และเราสามารถเลือกติดตั้ง Modules ได้ตามต้องการเช่น Prometheus & Grafana

Dedicated Kubernetes cluster

ระบบกำลัง Deploy สร้าง Environment ติดตั้งแอปพลิเคชั่นระบบต่างๆ ตามที่เราได้เลือก เช่น Nginx

Deploying Kubernetes Cluster
Deploying Kubernetes Cluster

หลังจากสร้าง Federation Host Cluster เสร็จแล้ว ก็ให้สร้าง Federation Member Cluster ด้วยขั้นตอนเดียวกัน และเลือก Region เป็นสิงค์โปร์ (OVH-SG) กำหนดชื่อ Environment เป็น member1sg

บนแพลตฟอร์ม Ruk-Com Cloud เราสามารถที่จะ Deploy สร้าง Environment พร้อมกันได้เลย
คือสามารถสร้าง Federation Host Cluster และ Federation Member Cluster ได้แล้วนั่งจิบกาแฟรอ 20-30 นาที คุณก็จะได้ Kubernetes Cluster ครับ

Federation Member Cluster

หลังจากสร้าง Host Cluster และ Member Cluster สำเร็จ* จะขึั้นหน้าต่างนี้

*รายละเอียดการ Login เข้า Dashboard ดูได้จากในเมลเลยนะครับ
Access Token ไม่จำเป็นต้อง note อะไร

เป็นอันสำเร็จการสร้าง Host Cluster และ Member Cluster ครับ

Host Cluster และ Member Cluster

จากนั้นก็ Login เข้าสู่ Kubenetes dashboad ด้วย Access Token

Kubernetes Dashboard

Remote Access to the Clusters

ขั้นตอนถัดไป เข้าสู่ระบบ Host Cluster ผ่าน SSH* เพื่อเริ่มต้นการกำหนดค่า

*SSH ต้องไปเพิ่ม Public keys เข้าไปก่อนนะครับ ที่ Account settings (SSH Keys > SSH Connect)

SSH to Ruk-Com Cloud

เลือก Kubernetes Cluster เพื่อเข้าสู่ Container (Control Plane)

SSH to Host Clouster

1. ลำดับแรก ให้ติดตั้ง KubeFed chart ด้วย helm ใน kube-federation-system namespace.

Initialize a Helm Chart Repository:

root@node15053-fedhost ~ $ helm repo add kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts

ติดตั้ง KubeFed เวอร์ล่าสุด (ตรวจสอบเวอร์ชั่นล่าสุดจาก Github) กำหนดเวอร์ชั่นที่ต้องการ เช่น version 0.8.0 เวอร์ชั่นปัจจุบัน

root@node15053-fedhost ~ $ helm install kubefed kubefed-charts/kubefed --version 0.8.0 --namespace kube-federation-system --create-namespace
NAME: kubefed
LAST DEPLOYED: Tue Jun 22 15:22:40 2021
NAMESPACE: kube-federation-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

2. ดาวน์โหลดไบนารีไฟล์ kubefedctl command line tool เวอร์ชั่นปัจจุบันมาให้ (Github)

$ wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.8.0/kubefedctl-0.8.0-linux-amd64.tgz
$ tar xvf kubefedctl-0.8.0-linux-amd64.tgz

จากนั้นให้คัดลอกไฟล์ไปยังไดร์เรกทอรี /usr/bin

$ mv kubefedctl /usr/bin

3. สร้างไฟล์ RBAC config (Role-Based Access Control)

เพื่อให้ KubeFed federating ใช้งานได้เราจะต้องสามารถโต้ตอบกับ Member Clusters ที่เลือกทั้งหมด!

Login ด้วย SSH เข้า Member Cluster แล้วสร้าง configuration file ตัวอย่าง เช่น member1sg.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
 labels:
   name: member1sg
 name: member1sg
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
 labels:
   name: member1sg
 name: member1sg
rules:
 - apiGroups: ['*']
   resources: ['*']
   verbs: ['*']
 - nonResourceURLs: ['*']
   verbs: ['*']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
 labels:
   name: member1sg
 name: member1sg
roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: ClusterRole
 name: member1sg
subjects:
 - kind: ServiceAccount
   name: member1sg
   namespace: default

Apply ไฟล์คอนฟิก

root@node15056-member1sg ~ $ kubectl apply -f member1.yaml
\serviceaccount/member1sg created
clusterrole.rbac.authorization.k8s.io/member1sg created
clusterrolebinding.rbac.authorization.k8s.io/member1sg created

4. เซต gain access

เพื่อให้เข้าถึง members ทั้งหมดใน K8s cluster name จำเป็นต้องระบุ cluster endpoint, username และ credentials สำหรับ namespace ประกอบด้วย

  • RBAC token
  • certificate

จากนั้น Get token name สำหรับ service account member1sg ที่สร้างขึ้นใหม่

root@node15056-member1sg ~ $ kubectl get secret | grep member1sg
member1sg-token-f2rvf                                   kubernetes.io/service-account-token   3      4m15s
root@node15056-member1sg ~ $ kubectl describe secret member1sg-token-f2rvf
kubectl describe

5. สร้าง user “kubefed-member1sg”

$ kubectl config set-credentials kubefed-member1sg --token='eyJhbGciOiJSUzI1NiIsImtpZCI6IjJOUEh4S25FdlB2YTlOeHVfa25BMU94N0F5RmlxOEs3Rlk2cWZFWF8zV1UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im1lbWJlcjFzZy10b2tlbi1mMnJ2ZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJtZW1iZXIxc2ciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0MGExNWJmZS05YTY1LTRiYWUtYjE0YS02ZmJlN2Y2MmM2NTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDptZW1iZXIxc2cifQ.w2GWbHhJPobXJUrQMAi_5MsmPJIX2-JYCxb9sajn5-GZ03mNbyqOLoOyi18rUBfmS258ypEXbbxgiUpWaAjkkKonNiD13HwpanVf0xJPwMKtpxlZnfx0mNOZEwAc1MwuW-M4pLphQf8S2uEIHwFIgnPhv5qkZlnTdVsaaXKaeUw5y5LNLeP9H88dfi5KsQqp9Wf6MtJ7M0gSSAWmkh6eHqie8Yl6dJimJsLr3TXy-UiQEQLSxF6iOlo8i7IW4tpQYiOpapLBsDbwzpxNpMQJyUv1raZXFJfquyiElIT9nqNHVnmLXjvwuuFRiYUf6deFhu84cW9HRmDvthBBePKB1Q'

6. Retrieve Member Cluster endpoint เชื่อมต่อกับ Host Cluster

root@node15056-member1sg ~ $ cat /root/.kube/config | grep server
    server: https://k8sm.member1sg.ovh.ruk-com.cloud:6443

จากนั้นเซตอัพ cluster name kubefed-remote-member1sg และเพิ่ม Member Cluster endpoint:

root@node15058-fedhost ~ $ kubectl config set-cluster kubefed-remote-member1sg --server='https://k8sm.member1sg.ovh.ruk-com.cloud:6443'
kubectl config set-cluster

7. Retrieve certificate และคัดลอกคอนเท้นต์

root@node15056-member1sg ~ $ cat /root/.kube/config | grep certificate-authority-data
certificate-authority-data

8. จากนั้นแทนที่ <certificate> ด้วย certificate-authority-data

root@node15058-fedhost ~ $ kubectl config set clusters.kubefed-remote-member1sg.certificate-authority-data 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1E
WXlNakV6TlRRME1sb1hEVE14TURZeU1ERXpOVFEwTWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkhNClZENHFLWktzY2J5S0IyRW1FR0FGQXY4
VE1oQVJpV0hGUHZFNEZ3dGpCZElUdFNVSERFSGN3c3d3U055VncwcXgKUXgwVWpkdUVSbDRyaTFhVUhBampzcStLZ2J2ZGNTMCtwQVJkbUNUSFJZYnhnRzdvTGswVHdxb0NaSUxRM2RNcgpzL2ZJRHh1Zkt1eEZ0NmgzRXFrR2JKbmFrc0Q3
VnVkQU9adTlpbnhZLy9TY1JYd2lSRWtHbGpNeEhtR2sxVk1RCkpvRXJHd2V1ZVB3YXVPaTQrRzIvaHpwN01GZ0FiUWdtRUp5Zkx1c21GUUpPbCtxeHRGclp2Qi9iVVkxK3dUR0wKRVpxRTBEcjlFSG9VaHJwMEwvTUp1RDR5WDJBL1I0cjhW
T04zemdscUQzS1F4bmlQVDB6YW9hMmJ2UDF4cmFsbgo3VGVhSis3Z2VwVGI5d0svR1BzQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZHdjJqYTUxV1ZPWWxo
UXc5dDNkYVppTGZDK3FNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCNFFhTm80NDluV3hpbzVOQVdaRmJNcmtGWVBEVmgzMGdSK2FGV0RBTk1KT0NTQitsVQpWeVk5SjdvRlZYZWlkZld0bzUwK2FwbG9QV1phNXZ2Yi9RanBNbmxCUUVO
VlJxTXd5T0RnSWY2bnhNSVVjYWZsCjZvQ1NoZXVhaFJNRUpTejRzY00yT2o2Rm9CRzJIM2RvbnFTajJUTnlwekd5SktVMTdwdlRZZDgrSnIzVnUxaTYKTFVtWUx1bEZKbEFXcXdLRno3b0dGSktuYWsyalB0N2QycllUU2lBdC9ManV2OXZi
ODU2WUptM2VEajR0M1dibgpQdXhWV241c3packQybzQ0Qk9ldkRVbFFXK1N0ZlZnMWw0M3Q2b1Y5ZmJCR2hRZ2YwaDJCMTYvallJdTRlRk5WCjllWDlqb0FIZ3pyY1U1a3czOEMzTyszS0VYYWV0VTdSSGMzOAotLS0tLUVORCBDRVJUSUZJ
Q0FURS0tLS0tCg=='

บรรทัดสุดท้ายจะขึ้นคำว่า Property “clusters.kubefed-remote-member1sg.certificate-authority-data” set. เป็นอันเสร็จ.

Note: กรณีที่ Member Cluster อยู่บนแพลตฟอร์มแตกต่างกัน (ไม่ได้อยู่บน Ruk-Com PaaS) ใบรับรอง certificate จะ invalid ใช้งานไม่ได้เนื่องจาก Shared Load Balancer มี own certificate ของตัวเองอยู่ด้านหน้า Cluster ดังนั้น certificate นี้ควรถูกละเว้นในระหว่างขั้นตอน negotiation phase ระหว่าง Host Cluster และ Member โดยใช้คำสั่ง เช่น: kubectl config set clusters.kubefed-remote-member1.insecure-skip-tls-verify true

root@node15058-fedhost ~ $ kubectl config set clusters.kubefed-remote-member1sg.insecure-skip-tls-verify true

จากนั้น Connect ด้วยข้อมูล cluster name, context name และ user name:

root@node15058-fedhost ~ $ kubectl config set-context member1sg --cluster=kubefed-remote-member1sg --user=kubefed-member1sg --namespace=default

จะขึ้นคำว่า Context “member1sg” created.

เป็นอันสำเร็จสำหรับ Cluster Member

Note: โดยปกติ default context name จะชื่อ: kubernetes-admin@kubernetes ซึ่งประกอบด้วย special character อาจทำให้ KubeFed เกิด error ระหว่าง join cluster ได้ จึงแนะนำให้เปลี่ยนและแทนที่ด้วย “fedhost” โดยใช้คำสั่ง

kubectl config rename-context kubernetes-admin@kubernetes fedhost
root@node15058-fedhost ~ $ kubectl config rename-context kubernetes-admin@kubernetes fedhost

สำหรับ Cluster Member อื่นๆ ก็ให้แบบเดียวกันนี้ทำตั้งแต่ step 3-8

Cluster Remote Access Testing

ในตอนนี้ Member Clusters ถูกเพิ่มเข้ามาใน Host Cluster เรียบร้อยแล้ว สามารถดู configuration file ได้ที่ /root/.kube/config

ดู nodes ต่างๆ บน clusters ชื่อ kubefed-remote-member1sg และ fedhost

root@node15058-fedhost ~ $ kubectl --context member1sg get nodes
root@node15058-fedhost ~ $ kubectl --context fedhost get nodes
get nodes

Note: หากมี error เช่น error: specifying a root certificates file with the insecure flag is not allowed ให้ให้คำสั่งนี้ kubectl config set clusters.kubefed-remote-member1sg.insecure-skip-tls-verify false

Joining the Federation

ตอนนี้เราจะเห็นได้ว่าการสื่อสารระหว่างสองคลัสเตอร์ที่อยู่ใน Region ต่างกันสามารถใช้งานได้แล้ว เราสามารถใช้เครื่องมือ kubefedctl เพื่อให้ทั้งสองกลุ่มเข้าไปยัง Federation ได้

เพิ่ม Host Cluster ไปยัง Federation:

root@node15058-fedhost ~ $ kubefedctl join fedhost --v=2 --host-cluster-context fedhost --kubefed-namespace=kube-federation-system

เพิ่ม Member Cluster ไปยัง Federation:

root@node15058-fedhost ~ $ kubefedctl join member1sg --v=2 --host-cluster-context fedhost --kubefed-namespace=kube-federation-system
Add Member Cluster to Federation

จากนั้นตรวจสอบสถานะของ Federation ด้วยคำสั่ง

root@node15058-fedhost ~ $ kubectl -n kube-federation-system get kubefedclusters
kube-federation-system get kubefedclusters

เป็นอันสำเร็จครับ! วิธีสร้าง Kubernetes Federation เชื่อมต่อ 2 Region เข้าด้วยกันและจัดการผ่าน Control Plane ที่เดียวบน Ruk-Com PaaS.

สุดท้าย ผู้เขียนหวังว่าโพสบทความนี้จะเป็นประโยชน์สำหรับผู้อ่านในการนำไปประยุกต์ใช้งานนะครับ. สำหรับบทความนี้จบไว้เพียงแค่นี้ก่อน ส่วนในเนื้อหาถัดไปจะเป็นในเรื่องของการ deploy แอปพลิเคชั่น (Federated Deployments) ว่างตอนไหนก็เขียนตอนนั้นครับ ฮ่าๆๆ ^^

สุดท้ายจริงๆ 55+++ สำหรับผู้ที่ต้องการสนับสนุน suseman สามารถหยิบจับ ebook ใหม่ๆ ใส่ตะกร้าโลด ขอบคุณครับ ^^

Scroll to top