การติดตั้ง Kubernetes cluster โดยใช้ Ansible (role lablabs.rke2) 2


Kubernetes เป็นซอฟต์แวร์โอเพนซอร์สสำหรับสร้าง ขยายขนาด และจัดการ container โดยอัตโนมัติ

Ansible เป็นซอฟต์แวร์โอเพนซอร์สสำหรับดำเนินการเกี่ยวกับเทคโนโลยีสารสนเทศโดยอัตโนมัติ ทำให้จัดการเครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือน เช่น สั่งการให้ restart, ปรับรุ่นซอฟต์แวร์, หรือเปิดให้ service ทำงาน ได้พร้อม ๆ กัน โดยที่ไม่ต้องเข้าไปจัดการทีละเครื่อง นอกจากนี้ ยังสามารถกำหนดบทบาทของเครื่องแม่ข่ายแต่ละเครื่อง ว่าจะให้ติดตั้ง/ตั้งค่าซอฟต์แวร์อย่างไร โดยการระบุ role ได้อีกด้วย ซึ่งผู้ดูแลระบบสามารถสร้าง เผยแพร่ และเลือกใช้งาน role ที่มีการเผยแพร่ตามแหล่งต่าง ๆ ได้ตามความเหมาะสม

lablabs.rke2 เป็น role ของ Ansible ที่พัฒนาขึ้นโดยบริษัท Labyrinth Labs เพื่ออำนวยความสะดวกในการติดตั้ง Kubernetes cluster ด้วยการใช้ซอฟต์แวร์ Rancher Kubernetes Engine 2 : RKE 2

สิ่งที่ต้องจัดเตรียม

  1. เครื่องแม่ข่าย หรือเครื่องแม่ข่ายเสมือนสำหรับติดตั้ง 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 ขึ้นไป)
  2. เครื่องแม่ข่ายที่ทำหน้าที่เป็น DNS Server โดยสร้าง A record ให้เครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือนที่จะใช้ในการติดตั้ง Kubernetes Cluster ทุกเครื่อง อย่างในตัวอย่างนี้จะใช้เป็น master01.k8s.example.com, master02.k8s.example.com, และ master03.k8s.example.com
  3. สถานีงาน (workstation) ที่ใช้ Linux kernel ในระบบปฏิบัติการ (เนื่องจากในขณะที่เขียนบทความ ระบบปฏิบัติการ Windows ยังไม่รองรับการทำงานของโปรแกรม Ansible โดยสมบูรณ์)
  4. Public IP
  5. การเชื่อมต่ออินเทอร์เน็ต

ขั้นตอน

  1. ในสถานีงาน ติดตั้งโปรแกรม Ansible รุ่น 2.10 หรือใหม่กว่า (ตรวจสอบรุ่นขั้นต่ำได้จากเอกสารของ RKE2 Ansible Role)
  2. ในสถานีงาน ติดตั้ง Ansible role lablabs.rke2 โดยใช้คำสั่ง ansible-galaxy install lablabs.rke2
  3. ในสถานีงาน สร้างคู่กุญแจ SSH โดยใช้คำสั่ง ssh-keygen โดยไม่ต้องระบุ passphrase จะได้ไฟล์ id_<ชื่ออัลกอริทึม> (private key) และ id_<ชื่ออัลกอริทึม>.pub (public key) ในโฟลเดอร์ ~/.ssh/
  4. ในสถานีงาน คัดลอกข้อความใน public key ไปเพิ่มเป็นบรรทัดใหม่ในไฟล์ ~/.ssh/authorized_keys ของเครื่องแม่ข่าย/เครื่องแม่ข่ายเสมือนทุกเครื่อง โดยใช้คำสั่ง ssh-copy-id <ชื่อผู้ใช้>@<เครื่องแม่ข่าย> เช่น ssh-copy-id [email protected]
  5. สร้างโฟลเดอร์ k8s สำหรับใช้เป็นพื้นที่ทำงาน โดยใช้คำสั่ง mkdir ~/k8s && cd ~/k8s
  6. สร้างไฟล์ 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
    
  7. ทดสอบว่าสามารถใช้ 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"
    }
    
  8. สร้างไฟล์ prepare.yaml ตามตัวอย่างด้านล่าง เพื่อจัดเตรียมเครื่องแม่ข่าย ดังนี้ จากนั้นใช้คำสั่ง 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
  9. สร้างไฟล์ 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
  10. เปลี่ยนชื่อไฟล์ rke2.yaml เป็น config จากนั้นคัดลอกไปไว้ใน <โฟลเดอร์ของผู้ใช้ปัจจุบัน>/.kube/ ของสถานีงาน หรือคอมพิวเตอร์ของผู้ดูแลระบบ เช่น C:\Users\myusername\.kube\ หรือ /home/myusername/.kube/ เป็นต้น
  11. ในสถานีงาน หรือคอมพิวเตอร์ของผู้ดูแลระบบ ติดตั้งโปรแกรม kubectl
  12. ทดลองใช้คำสั่ง 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 มีสิ่งที่ต้องเปลี่ยนแปลง ดังนี้

  1. ขณะที่ใช้คำสั่ง ssh-copy-id ให้ระบุบัญชีที่ต้องการใช้ เช่น ssh-copy-id [email protected]
  2. ในไฟล์ 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

แสดงความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

2 ความคิดเห็นบน “การติดตั้ง Kubernetes cluster โดยใช้ Ansible (role lablabs.rke2)