
Kubernetes เป็นซอฟต์แวร์โอเพนซอร์สสำหรับสร้าง ขยายขนาด และจัดการ container โดยอัตโนมัติ
Ansible เป็นซอฟต์แวร์โอเพนซอร์สสำหรับดำเนินการเกี่ยวกับเทคโนโลยีสารสนเทศโดยอัตโนมัติ ทำให้จัดการเครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือน เช่น สั่งการให้ restart, ปรับรุ่นซอฟต์แวร์, หรือเปิดให้ service ทำงาน ได้พร้อม ๆ กัน โดยที่ไม่ต้องเข้าไปจัดการทีละเครื่อง นอกจากนี้ ยังสามารถกำหนดบทบาทของเครื่องแม่ข่ายแต่ละเครื่อง ว่าจะให้ติดตั้ง/ตั้งค่าซอฟต์แวร์อย่างไร โดยการระบุ role ได้อีกด้วย ซึ่งผู้ดูแลระบบสามารถสร้าง เผยแพร่ และเลือกใช้งาน role ที่มีการเผยแพร่ตามแหล่งต่าง ๆ ได้ตามความเหมาะสม
lablabs.rke2 เป็น role ของ Ansible ที่พัฒนาขึ้นโดยบริษัท Labyrinth Labs เพื่ออำนวยความสะดวกในการติดตั้ง Kubernetes cluster ด้วยการใช้ซอฟต์แวร์ Rancher Kubernetes Engine 2 : RKE 2
สิ่งที่ต้องจัดเตรียม
- เครื่องแม่ข่าย หรือเครื่องแม่ข่ายเสมือนสำหรับติดตั้ง Kubernetes Cluster จำนวน 3 เครื่องขึ้นไป โดยเลือกใช้ระบบปฏิบัติการ Rocky Linux 8, Ubuntu 20.04 LTS, หรือ Ubuntu 22.04 LTS (หรือเลือกจากระบบปฏิบัติการที่ผ่านการทดสอบร่วมกับ RKE2 Ansible Role แล้ว) อนึ่ง หากประสงค์ที่จะใช้ Rook Ceph สำหรับจัดการเนื้อที่จัดเก็บข้อมูลในอนาคต ให้เตรียม block storage สำหรับจัดเก็บข้อมูลไว้ด้วย เช่น ใช้ /dev/sda เพื่อติดตั้งระบบปฏิบัติการ และใช้ /dev/sdb เพื่อจัดเก็บข้อมูล (หากจะใช้ LVM เป็น block storage ควรใช้ Rook รุ่น 1.9.8 และ Ceph รุ่น 16.2.6 ขึ้นไป)
- เครื่องแม่ข่ายที่ทำหน้าที่เป็น DNS Server โดยสร้าง A record ให้เครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือนที่จะใช้ในการติดตั้ง Kubernetes Cluster ทุกเครื่อง อย่างในตัวอย่างนี้จะใช้เป็น
master01.k8s.example.com
,master02.k8s.example.com
, และmaster03.k8s.example.com
- สถานีงาน (workstation) ที่ใช้ Linux kernel ในระบบปฏิบัติการ (เนื่องจากในขณะที่เขียนบทความ ระบบปฏิบัติการ Windows ยังไม่รองรับการทำงานของโปรแกรม Ansible โดยสมบูรณ์)
- Public IP
- การเชื่อมต่ออินเทอร์เน็ต
ขั้นตอน
- ในสถานีงาน ติดตั้งโปรแกรม Ansible รุ่น 2.10 หรือใหม่กว่า (ตรวจสอบรุ่นขั้นต่ำได้จากเอกสารของ RKE2 Ansible Role)
- ในสถานีงาน ติดตั้ง Ansible role lablabs.rke2 โดยใช้คำสั่ง
ansible-galaxy install lablabs.rke2
- ในสถานีงาน สร้างคู่กุญแจ SSH โดยใช้คำสั่ง
ssh-keygen
โดยไม่ต้องระบุ passphrase จะได้ไฟล์id_<ชื่ออัลกอริทึม>
(private key) และid_<ชื่ออัลกอริทึม>.pub
(public key) ในโฟลเดอร์~/.ssh/
- ในสถานีงาน คัดลอกข้อความใน public key ไปเพิ่มเป็นบรรทัดใหม่ในไฟล์
~/.ssh/authorized_keys
ของเครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือนทุกเครื่อง โดยใช้คำสั่งssh-copy-id <ชื่อผู้ใช้>@<เครื่องแม่ข่าย>
เช่นssh-copy-id [email protected]
- สร้างโฟลเดอร์ k8s สำหรับใช้เป็นพื้นที่ทำงาน โดยใช้คำสั่ง
mkdir ~/k8s && cd ~/k8s
- สร้างไฟล์
hosts
โดยระบุรายการเครื่องแม่ข่ายให้ครบถ้วน ตัวอย่าง:k8s_cluster: children: masters: hosts: master01.k8s.example.com: ansible_user: root rke2_type: server master02.k8s.example.com: ansible_user: root rke2_type: server master03.k8s.example.com: ansible_user: root rke2_type: server
- ทดสอบว่าสามารถใช้ Ansible เพื่อเชื่อมต่อไปยังเครื่องแม่ข่ายได้ โดยใช้คำสั่ง
ansible all -i hosts -m ping
ตัวอย่าง:$ ansible all -i hosts -m ping master01.k8s.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } master02.k8s.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } master03.k8s.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
- สร้างไฟล์
prepare.yaml
ตามตัวอย่างด้านล่าง เพื่อจัดเตรียมเครื่องแม่ข่าย ดังนี้- ติดตั้งโปรแกรม tar ซึ่งจำเป็นต่อกระบวนการติดตั้ง
- ปิดการใช้งาน swap (แม้ว่า Kubernetes รุ่น 1.22 เป็นต้นไปจะรองรับการใช้งานร่วมกับ swap แล้ว แต่ก็มีคำเตือนว่าการใช้งาน swap จะทำให้คาดเดาการทำงานของ cluster ได้ยากขึ้น)
- ปิดการทำงานของ firewalld (เนื่องจากในขณะที่เขียนบทความ RKE2 มีข้อจำกัดในการทำงานร่วมกับ firewalld)
ansible-playbook -i hosts prepare.yaml
--- - hosts: k8s_cluster tasks: - name: Install tar package: name: tar state: present - name: Disable swap for current session command: swapoff -a - name: Disable swap permanently replace: path: /etc/fstab regexp: '^(\s*)([^#\n]+\s+)(\w+\s+)swap(\s+.*)$' replace: '#\1\2\3swap\4' - name: Stop and disable firewalld systemd: name: firewalld state: stopped enabled: no
- สร้างไฟล์
deploy.yaml
ตามตัวอย่างด้านล่าง (อ้างอิงจาก lablabs.rke2 รุ่น 1.19.1 หากใช้รุ่นอื่นโปรดอ่านไฟล์ README.md ของรุ่นนั้น ๆ) เพื่อติดตั้ง Kubernetes บนเครื่องแม่ข่ายทั้งหมด โดยมีรายละเอียดการตั้งค่า ดังนี้- เปิดใช้งาน High Availability (HA)
- ใช้ kube-vip เพื่อจำลอง virtual IP สำหรับเครื่องแม่ข่ายที่ทำหน้าที่เป็น master (controller) ทั้ง 3 เครื่อง และจ่าย IP ให้แก่ service ที่มีชนิดเป็น LoadBalancer
- ปิด Keepalived (เนื่องจากเราใช้ kube-vip เพื่อจำลอง virtual IP แล้ว)
- กำหนดช่วง IP ที่จะจ่ายให้แก่ service เป็น 192.168.0.191 ถึง 192.168.0.199 (9 ไอพี)
- กำหนด virtual IP ของเครื่องแม่ข่ายที่ทำหน้าที่เป็น master เป็น 192.168.0.190
- ดาวน์โหลดไฟล์ kubeconf ซึ่งผู้ดูแลระบบจำเป็นต้องใช้ไฟล์นี้เพื่อเข้าจัดการ Kubernetes cluster
ansible-playbook -i hosts deploy.yaml
และรอจนกว่าจะติดตั้ง cluster สำเร็จ--- - name: Deploy RKE2 hosts: k8s_cluster vars: rke2_ha_mode: true rke2_ha_mode_keepalived: false rke2_ha_mode_kubevip: true rke2_loadbalancer_ip_range: 192.168.0.191-192.168.0.199 rke2_api_ip : 192.168.0.190 rke2_download_kubeconf: true roles: - role: lablabs.rke2
- เปลี่ยนชื่อไฟล์
rke2.yaml
เป็นconfig
จากนั้นคัดลอกไปไว้ใน<โฟลเดอร์ของผู้ใช้ปัจจุบัน>/.kube/
ของสถานีงาน หรือคอมพิวเตอร์ของผู้ดูแลระบบ เช่นC:\Users\myusername\.kube\
หรือ/home/myusername/.kube/
เป็นต้น - ในสถานีงาน หรือคอมพิวเตอร์ของผู้ดูแลระบบ ติดตั้งโปรแกรม kubectl
- ทดลองใช้คำสั่ง
kubectl get nodes
เพื่อเรียกดูโนด ตัวอย่าง:$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01.k8s.example.com Ready control-plane,etcd,master 1d v1.24.3+rke2r1 master02.k8s.example.com Ready control-plane,etcd,master 1d v1.24.3+rke2r1 master03.k8s.example.com Ready control-plane,etcd,master 1d v1.24.3+rke2r1
ภาคผนวก ก: ปรับค่าไฟล์ Kubernetes config ให้ใช้ Virtual IP
ไฟล์ rke2.yaml
ที่ดาวน์โหลดมาไว้ในสถานีงานอาจจะชี้ไปยังไอพีของโนดที่ทำหน้าที่เป็น master เฉพาะโนดแรก ตัวอย่างเช่น
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ...
server: https://192.168.0.180:6443
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
client-certificate-data: ...
client-key-data: ...
ในกรณีที่ต้องการให้มีการ load balance และ failover การเชื่อมต่อจากสถานีงานไปยัง Kubernetes cluster สามารถแก้ไขค่าใน clusters[0].cluster.server
จาก https://192.168.0.180:6443
(ไอพีของ master โนดที่ 1) ให้เป็น https://192.168.0.190:6443
(virtual IP ของ master ทุกโนด)
ภาคผนวก ข: กรณีที่ไม่ได้ใช้บัญชี root
กรณีที่ไม่ได้ใช้บัญชี root
ของเครื่องแม่ข่าย แต่ใช้บัญชีอื่นที่มีสิทธิ์ใช้ sudo
มีสิ่งที่ต้องเปลี่ยนแปลง ดังนี้
- ขณะที่ใช้คำสั่ง
ssh-copy-id
ให้ระบุบัญชีที่ต้องการใช้ เช่นssh-copy-id [email protected]
- ในไฟล์
prepare.yaml
และdeploy.yaml
ให้เพิ่มบรรทัดbecome: yes
ถัดจากค่าhosts
ตามตัวอย่างด้านล่าง
---
- name: Deploy RKE2
hosts: k8s_cluster
become: yes
vars:
rke2_ha_mode: true
rke2_ha_mode_keepalived: false
rke2_ha_mode_kubevip: true
rke2_loadbalancer_ip_range: 192.168.0.191-192.168.0.199
rke2_api_ip : 192.168.0.190
rke2_download_kubeconf: true
roles:
- role: lablabs.rke2
Pingback: การตั้งค่า Ingress Controller สำหรับ Kubernetes cluster (RKE 2) ที่ใช้ kube-vip - ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร
Pingback: การเพิ่มโนดใน Kubernetes cluster (RKE 2) โดยใช้ Ansible (role lablabs.rke2) - ศูนย์เทคโนโลยีสารสนเทศและการสื่อสาร