Mục lục

Không có mục lục
Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly

Cách tạo một Kubernetes Cluster bằng Kubeadm trên Ubuntu 20.04

Ngày đăng: 7 tháng 11 năm 2022

Ubuntu

Giới thiệu

Kubernetes là một hệ thống điều phối vùng chứa quản lý các vùng chứa trên quy mô lớn. Ban đầu được Google phát triển dựa trên kinh nghiệm chạy các vùng chứa trong quá trình sản xuất, Kubernetes là mã nguồn mở và được phát triển tích cực bởi cộng đồng trên khắp thế giới.

Lưu ý: Hướng dẫn này sử dụng phiên bản 1.22 của Kubernetes, phiên bản được hỗ trợ chính thức tại thời điểm xuất bản bài viết này. Để biết thông tin cập nhật về phiên bản mới nhất, vui lòng xem ghi chú phát hành hiện tại trong tài liệu Kubernetes chính thức.

Kubeadm tự động hóa việc cài đặt và cấu hình các thành phần Kubernetes như máy chủ API, Controller Manager và Kube DNS. Tuy nhiên, nó không tạo user hoặc xử lý việc cài đặt các phần phụ thuộc cấp hệ điều hành và cấu hình của chúng. Đối với các tác vụ sơ bộ này, có thể sử dụng công cụ quản lý cấu hình như Ansible hoặc SaltStack. Việc sử dụng các công cụ này làm cho việc tạo các cluster bổ sung hoặc tạo lại các cluster hiện có đơn giản hơn nhiều và ít bị lỗi hơn.

Trong hướng dẫn này, bạn sẽ thiết lập một Kubernetes cluster từ đầu bằng Ansible và Kubeadm, sau đó triển khai một ứng dụng Nginx được chứa trong đó.

Mục tiêu

Cluster của bạn sẽ bao gồm các tài nguyên vật lý sau:

  • Một Control Plane node Control plane node (một node trong Kubernetes dùng để chỉ máy chủ) chịu trách nhiệm quản lý trạng thái của cluster. Nó chạy Etcd, nơi lưu trữ dữ liệu cluster giữa các thành phần lên lịch khối lượng công việc cho các worker node.

  • Hai worker node Worker nodes là các máy chủ nơi khối lượng công việc của bạn (tức là các ứng dụng và dịch vụ được tích hợp sẵn) sẽ chạy. Một worker sẽ tiếp tục chạy khối lượng công việc của bạn sau khi họ được giao nhiệm vụ đó, ngay cả khi control plane ngừng hoạt động sau khi lên lịch hoàn tất. Công suất của một cluster có thể được tăng lên bằng cách thêm worker.

Sau khi hoàn thành hướng dẫn này, bạn sẽ có một cluster sẵn sàng để chạy các ứng dụng được chứa trong vùng chứa, với điều kiện là các máy chủ trong cluster có đủ tài nguyên CPU và RAM để các ứng dụng của bạn sử dụng. Hầu hết mọi ứng dụng Unix truyền thống bao gồm các ứng dụng web, cơ sở dữ liệu, daemon và các công cụ dòng lệnh đều có thể được chứa và chạy trên cluster. Bản thân cluster sẽ tiêu thụ khoảng 300-500MB bộ nhớ và 10% CPU trên mỗi node.

Khi cluster được thiết lập, bạn sẽ triển khai máy chủ web Nginx cho nó để đảm bảo rằng nó đang chạy khối lượng công việc một cách chính xác.

Điều kiện

  • Cặp SSH key trên máy Linux/macOS/BSD cục bộ của bạn. Nếu bạn chưa sử dụng SSH key trước đây, bạn có thể tìm hiểu cách thiết lập chúng bằng cách làm theo hướng dẫn về cách thiết lập SSH key trên máy cục bộ của bạn.
  • Ba máy chủ chạy Ubuntu 20.04 với ít nhất 2GB RAM và 2 vCPU mỗi máy. Bạn có thể SSH vào từng máy chủ với tư cách là root user bằng cặp SSH key của mình.

Lưu ý: Nếu bạn chưa SSH vào từng máy chủ này ít nhất một lần trước khi làm theo hướng dẫn, bạn có thể được nhắc chấp nhận vân tay máy chủ vào một thời điểm bất tiện sau này. Bạn nên thực hiện việc này ngay bây giờ hoặc để thay thế, bạn có thể tắt tính năng kiểm tra key máy chủ.

  • Ansible được cài đặt trên máy cục bộ của bạn. Nếu bạn đang chạy Ubuntu 20.04 làm hệ điều hành của mình, hãy làm theo phần “Bước 1: Cài đặt Ansible” trong Cách cài đặt và thiết lập cấu hình Ansible trên Ubuntu 20.04 để cài đặt Ansible. Để biết hướng dẫn cài đặt trên các nền tảng khác như macOS hoặc Rocky Linux, hãy làm theo tài liệu cài đặt Ansible chính thức.
  • Làm quen với Ansible playbooks. Để xem lại, hãy xem Quản lý cấu hình 101: Viết Ansible Playbooks.
  • Kiến thức về cách khởi chạy vùng chứa từ Docker image. Xem “Bước 5: Chạy Docker Container” trong Cách cài đặt và sử dụng Docker trên Ubuntu 20.04 nếu bạn cần cập nhật.

Bước 1: Thiết lập Thư mục Workspace và Tệp Ansible Inventory

Trong phần này, bạn sẽ tạo một thư mục trên máy cục bộ của mình để làm không gian làm việc của bạn. Bạn sẽ cấu hình cục bộ Ansible để nó có thể giao tiếp và thực thi các lệnh trên máy chủ từ xa của bạn. Sau khi hoàn tất, bạn sẽ tạo một tệp hosts chứa thông tin về inventory, chẳng hạn như địa chỉ IP của các máy chủ của bạn và các nhóm mà mỗi máy chủ thuộc về.

Trong số ba máy chủ của bạn, một máy chủ sẽ là control plane với IP được hiển thị là control_plane_ip. Hai máy chủ còn lại sẽ là worker và sẽ có IP worker_1_ipworker_2_ip.

Tạo một thư mục có tên ~/kube-cluster trong thư mục chính của máy cục bộ của bạn và cd vào đó:

  1. mkdir ~/kube-cluster
  2. cd ~/kube-cluster

Thư mục này sẽ là workspace của bạn cho phần còn lại của hướng dẫn và sẽ chứa tất cả các Ansible playbook của bạn. Nó cũng sẽ là thư mục bên trong mà bạn sẽ chạy tất cả các lệnh cục bộ.

Tạo một tệp có tên ~/kube-cluster/hosts bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

  1. nano ~/kube-cluster/hosts

Thêm văn bản sau vào tệp, văn bản này sẽ chỉ định thông tin về cấu trúc lôgic của cluster của bạn:

~/kube-cluster/hosts
[control_plane]
control1 ansible_host=control_plane_ip ansible_user=root 

[workers]
worker1 ansible_host=worker_1_ip ansible_user=root
worker2 ansible_host=worker_2_ip ansible_user=root

[all:vars]
ansible_python_interpreter=/usr/bin/python3

Bạn có thể nhớ lại rằng các tệp inventory trong Ansible được sử dụng để chỉ định thông tin máy chủ như địa chỉ IP, người dùng từ xa và nhóm máy chủ để nhắm mục tiêu như một đơn vị duy nhất để thực hiện các lệnh. ~/kube-cluster/hosts sẽ là tệp inventory của bạn, và bạn đã thêm hai nhóm Ansible (control planeworkers) vào đó để chỉ định cấu trúc logic của cluster của bạn.

Trong nhóm control plane, có một mục máy chủ có tên “control1” liệt kê IP của control plane (control_plane_ip) và chỉ định rằng Ansible sẽ chạy các lệnh từ xa với tư cách là root user.

Tương tự, trong nhóm workers, có hai mục nhập cho máy chủ workers (worker_1_ipworker_2_ip) cũng chỉ định ansible_user làm gốc.

Dòng cuối cùng của tệp yêu cầu Ansible sử dụng trình thông dịch Python 3 của máy chủ từ xa cho các hoạt động quản lý của nó.

Lưu và đóng tệp sau khi bạn đã thêm văn bản. Nếu bạn đang sử dụng nano, hãy nhấn Ctrl + X, sau đó khi được nhắc, hãy nhấn YEnter.

Sau khi thiết lập inventory máy chủ với các nhóm, hãy chuyển sang cài đặt phần phụ thuộc cấp hệ điều hành và tạo cài đặt cấu hình.

Bước 2: Tạo Non-Root User trên tất cả máy chủ từ xa

Trong phần này, bạn sẽ tạo một non-root user với các đặc quyền sudo trên tất cả các máy chủ, để bạn có thể SSH vào chúng theo cách thủ công với tư cách là một unprivileged user (người dùng không có đặc quyền). Điều này có thể hữu ích nếu, chẳng hạn, bạn muốn xem thông tin hệ thống bằng các lệnh như top/htop, xem danh sách các vùng chứa đang chạy hoặc thay đổi các tệp cấu hình do root sở hữu. Các hoạt động này được thực hiện thường xuyên trong quá trình bảo trì một cluster, và việc sử dụng non-root user cho các tác vụ như vậy sẽ giảm thiểu rủi ro sửa đổi hoặc xóa các tệp quan trọng hoặc vô tình thực hiện các hoạt động nguy hiểm khác.

Tạo một tệp có tên ~/kube-cluster/initial.yml trong workspace:

  1. nano ~/kube-cluster/initial.yml

Tiếp theo, thêm play dưới đây vào tệp để tạo non-root user có đặc quyền sudo trên tất cả các máy chủ. Một play trong Ansible là một tập hợp các bước được thực hiện nhằm vào các máy chủ và nhóm cụ thể. Play dưới đây sẽ tạo một non-root sudo user:

~/kube-cluster/initial.yml
---
- hosts: all
  become: yes
  tasks:
    - name: create the 'ubuntu' user
      user: name=ubuntu append=yes state=present createhome=yes shell=/bin/bash

    - name: allow 'ubuntu' to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        line: 'ubuntu ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: set up authorized keys for the ubuntu user
      authorized_key: user=ubuntu key="{{item}}"
      with_file:
        - ~/.ssh/id_rsa.pub

Dưới đây là bảng phân tích về những gì mà playbook này thực hiện:

  • Tạo non-root user ubuntu.
  • Thiết lập cấu hình tệp sudoers để cho phép ubuntu user chạy các lệnh sudo mà không có lời nhắc mật khẩu.
  • Thêm public key trong máy cục bộ của bạn (thường là ~/.ssh/id_rsa.pub) vào danh sách key được ủy quyền của ubuntu user từ xa. Điều này sẽ cho phép bạn SSH vào từng máy chủ với tư cách là ubuntu user.

Lưu và đóng tệp sau khi bạn đã thêm văn bản.

Tiếp theo, chạy playbook cục bộ:

  1. ansible-playbook -i hosts ~/kube-cluster/initial.yml

Lệnh sẽ hoàn thành trong vòng hai đến năm phút. Khi hoàn thành, bạn sẽ thấy đầu ra tương tự như sau:

Output
PLAY [all] **** TASK [Gathering Facts] **** ok: [control1] ok: [worker1] ok: [worker2] TASK [create the 'ubuntu' user] **** changed: [control1] changed: [worker1] changed: [worker2] TASK [allow 'ubuntu' user to have passwordless sudo] **** changed: [control1] changed: [worker1] changed: [worker2] TASK [set up authorized keys for the ubuntu user] **** changed: [worker1] => (item=ssh-rsa AAAAB3...) changed: [worker2] => (item=ssh-rsa AAAAB3...) changed: [control1] => (item=ssh-rsa AAAAB3...) PLAY RECAP **** control1 : ok=4 changed=3 unreachable=0 failed=0 worker1 : ok=4 changed=3 unreachable=0 failed=0 worker2 : ok=4 changed=3 unreachable=0 failed=0

Bây giờ thiết lập sơ bộ đã hoàn tất, bạn có thể chuyển sang cài đặt các phần phụ thuộc cụ thể của Kubernetes.

Bước 3: Cài đặt Sự phụ thuộc của Kubernetetes

Trong phần này, bạn sẽ cài đặt các gói cấp hệ điều hành theo yêu cầu của Kubernetes với trình quản lý gói của Ubuntu. Các gói này là:

  • Docker - một container runtime. Nó là thành phần chạy các vùng chứa của bạn. Kubernetes hỗ trợ các runtime khác, nhưng Docker vẫn là một lựa chọn phổ biến và đơn giản.
  • kubeadm - một công cụ CLI sẽ cài đặt và cấu hình các thành phần khác nhau của một cluster theo cách tiêu chuẩn.
  • kubelet - một dịch vụ/chương trình hệ thống chạy trên tất cả các node và xử lý các hoạt động ở cấp độ node.
  • kubectl - một công cụ CLI được sử dụng để phát lệnh cho cluster thông qua Máy chủ API của nó.

Tạo một tệp có tên ~/kube-cluster/kube-dependencies.yml trong workspace:

  1. nano ~/kube-cluster/kube-dependencies.yml

Thêm các play dưới đây vào tệp để cài đặt các gói này vào máy chủ của bạn:

~/kube-cluster/kube-dependencies.yml
---
- hosts: all
  become: yes
  tasks:
   - name: create Docker config directory
     file: path=/etc/docker state=directory

   - name: changing Docker to systemd driver
     copy:
      dest: "/etc/docker/daemon.json"
      content: |
        {
        "exec-opts": ["native.cgroupdriver=systemd"]
        }

   - name: install Docker
     apt:
       name: docker.io
       state: present
       update_cache: true

   - name: install APT Transport HTTPS
     apt:
       name: apt-transport-https
       state: present

   - name: add Kubernetes apt-key
     apt_key:
       url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
       state: present

   - name: add Kubernetes' APT repository
     apt_repository:
      repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
      state: present
      filename: 'kubernetes'

   - name: install kubelet
     apt:
       name: kubelet=1.22.4-00
       state: present
       update_cache: true

   - name: install kubeadm
     apt:
       name: kubeadm=1.22.4-00
       state: present

- hosts: control_plane
  become: yes
  tasks:
   - name: install kubectl
     apt:
       name: kubectl=1.22.4-00
       state: present
       force: yes

Play đầu tiên trong playbook thực hiện như sau:

  • Cài đặt Docker, container runtime và thiết lập cấu hình cài đặt tương thích.
  • Cài đặt apt-transport-https, cho phép bạn thêm các nguồn HTTPS bên ngoài vào danh sách các nguồn APT của mình.
  • Thêm apt-key của kho lưu trữ Kubernetes APT để xác minh key.
  • Thêm kho lưu trữ Kubernetes APT vào danh sách nguồn APT của máy chủ từ xa của bạn.
  • Cài đặt kubeletkubeadm.

Play thứ hai bao gồm một nhiệm vụ duy nhất là cài đặt kubectl trên control plane node của bạn.

Lưu ý: Mặc dù tài liệu Kubernetes khuyến nghị bạn sử dụng phiên bản Kubernetes ổn định mới nhất cho môi trường của bạn, nhưng hướng dẫn này sử dụng một phiên bản cụ thể. Điều này sẽ đảm bảo rằng bạn có thể làm theo các bước thành công, vì Kubernetes thay đổi nhanh chóng và phiên bản mới nhất có thể không hoạt động với hướng dẫn này. Mặc dù “xenial” là tên của Ubuntu 16.04 và hướng dẫn này dành cho Ubuntu 20.04, Kubernetes vẫn đề cập đến các nguồn gói Ubuntu 16.04 theo mặc định và chúng được hỗ trợ trên 20.04 trong trường hợp này.

Lưu và đóng tệp khi bạn hoàn tất.

Tiếp theo, chạy playbook cục bộ bằng lệnh sau:

  1. ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml

Sau khi hoàn thành, bạn sẽ nhận được đầu ra tương tự như sau:

Output
PLAY [all] **** TASK [Gathering Facts] **** ok: [worker1] ok: [worker2] ok: [control1] TASK [create Docker config directory] **** changed: [control1] changed: [worker1] changed: [worker2] TASK [changing Docker to systemd driver] **** changed: [control1] changed: [worker1] changed: [worker2] TASK [install Docker] **** changed: [control1] changed: [worker1] changed: [worker2] TASK [install APT Transport HTTPS] ***** ok: [control1] ok: [worker1] changed: [worker2] TASK [add Kubernetes apt-key] ***** changed: [control1] changed: [worker1] changed: [worker2] TASK [add Kubernetes' APT repository] ***** changed: [control1] changed: [worker1] changed: [worker2] TASK [install kubelet] ***** changed: [control1] changed: [worker1] changed: [worker2] TASK [install kubeadm] ***** changed: [control1] changed: [worker1] changed: [worker2] PLAY [control1] ***** TASK [Gathering Facts] ***** ok: [control1] TASK [install kubectl] ****** changed: [control1] PLAY RECAP **** control1 : ok=11 changed=9 unreachable=0 failed=0 worker1 : ok=9 changed=8 unreachable=0 failed=0 worker2 : ok=9 changed=8 unreachable=0 failed=0

Sau khi chạy playbook này, Docker, kubeadmkubelet sẽ được cài đặt trên tất cả các máy chủ từ xa. kubectl không phải là một thành phần bắt buộc và chỉ cần thiết để thực hiện các lệnh cluster. Cài đặt nó chỉ trên control plane node có ý nghĩa trong bối cảnh này, vì bạn sẽ chỉ chạy các lệnh kubectl từ control plane. Tuy nhiên, lưu ý rằng các lệnh kubectl có thể được chạy từ bất kỳ node nào trong số các worker node hoặc từ bất kỳ máy nào mà nó có thể được cài đặt và cấu hình để trỏ đến một cluster.

Tất cả các phụ thuộc hệ thống hiện đã được cài đặt. Hãy thiết lập control plane node và khởi tạo cluster.

Bước 4: Thiết lập Control Plane Node

Trong phần này, bạn sẽ thiết lập control plane node. Tuy nhiên, trước khi tạo bất kỳ playbook nào, bạn nên đề cập đến một vài khái niệm như Pod và Pod Network Plugins, vì cluster của bạn sẽ bao gồm cả hai.

Một pod là một đơn vị nguyên tử chạy một hoặc nhiều vùng chứa. Các vùng chứa này dùng chung các tài nguyên như file volumes (không gian tệp) và network interfaces (giao diện mạng). Pods là đơn vị lên lịch cơ bản trong Kubernetes: tất cả các vùng chứa trong pod được đảm bảo chạy trên cùng một node mà pod được lập lịch.

Mỗi pod có địa chỉ IP riêng và pod trên một node có thể truy cập pod trên node khác bằng IP của nhóm. Các vùng chứa trên một node duy nhất có thể giao tiếp dễ dàng thông qua giao diện cục bộ. Tuy nhiên, giao tiếp giữa các pod phức tạp hơn và yêu cầu một thành phần mạng riêng biệt có thể định tuyến lưu lượng truy cập từ một pod trên một node một cách rõ ràng đến một pod trên một node khác.

Chức năng này được cung cấp bởi các pod network plugin. Đối với cluster này, bạn sẽ sử dụng Flannel, một tùy chọn ổn định và hiệu quả.

Tạo một Ansible playbook có tên là control-plane.yml trên máy cục bộ của bạn:

  1. nano ~/kube-cluster/control-plane.yml

Thêm play dưới đây vào tệp để khởi tạo cluster và cài đặt Flannel:

~/kube-cluster/control-plane.yml
---
- hosts: control_plane
  become: yes
  tasks:
    - name: initialize the cluster
      shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
      args:
        chdir: $HOME
        creates: cluster_initialized.txt

    - name: create .kube directory
      become: yes
      become_user: ubuntu
      file:
        path: $HOME/.kube
        state: directory
        mode: 0755

    - name: copy admin.conf to user's kube config
      copy:
        src: /etc/kubernetes/admin.conf
        dest: /home/ubuntu/.kube/config
        remote_src: yes
        owner: ubuntu

    - name: install Pod network
      become: yes
      become_user: ubuntu
      shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml >> pod_network_setup.txt
      args:
        chdir: $HOME
        creates: pod_network_setup.txt

Dưới đây là bảng phân tích về play này:

  • Tác vụ đầu tiên khởi tạo cluster bằng cách chạy kubeadm init. Truyền đối số --pod-network-cidr=10.244.0.0/16 chỉ định subnet (mạng con) riêng mà các pod IP sẽ được chỉ định từ đó. Flannel sử dụng subnet trên theo mặc định; chúng ta đang yêu cầu kubeadm sử dụng cùng một subnet.
  • Tác vụ thứ hai tạo một thư mục .kube tại /home/ubuntu. Thư mục này sẽ chứa thông tin cấu hình, chẳng hạn như các tệp admin key, được yêu cầu để kết nối với cluster và địa chỉ API của cluster.
  • Tác vụ thứ ba sao chép tệp /etc/kubernetes/admin.conf được tạo từ kubeadm init vào thư mục chính của non-root user của bạn. Điều này sẽ cho phép bạn sử dụng kubectl để truy cập vào cluster mới được tạo.
  • Tác vụ cuối cùng chạy kubectl apply để cài đặt Flannel. kubectl apply -f descriptor.[yml|json] là cú pháp để yêu cầu kubectl tạo các đối tượng được mô tả trong tệp descriptor.[yml|json]. Tệp kube-flannel.yml chứa mô tả các đối tượng cần thiết để thiết lập Flannel trong cluster.

Lưu và đóng tệp khi bạn hoàn tất.

Chạy playbook cục bộ bằng lệnh sau:

  1. ansible-playbook -i hosts ~/kube-cluster/control-plane.yml

Khi hoàn thành, bạn sẽ thấy đầu ra tương tự như sau:

Output
PLAY [control1] **** TASK [Gathering Facts] **** ok: [control1] TASK [initialize the cluster] **** changed: [control1] TASK [create .kube directory] **** changed: [control1] TASK [copy admin.conf to user's kube config] ***** changed: [control1] TASK [install Pod network] ***** changed: [control1] PLAY RECAP **** control1 : ok=5 changed=4 unreachable=0 failed=0

Để kiểm tra trạng thái của control plane node, hãy SSH vào đó bằng lệnh sau:

  1. ssh ubuntu@control_plane_ip

Khi bên trong control plane node, hãy thực hiện:

  1. kubectl get nodes

Bây giờ bạn sẽ thấy kết quả sau:

Output
NAME STATUS ROLES AGE VERSION control1 Ready control-plane,master 51s v1.22.4

Lưu ý: Kể từ Ubuntu 20.04, kubernetes đang trong quá trình cập nhật thuật ngữ cũ của họ. Node mà chúng tôi đã gọi là control-plane trong suốt hướng dẫn này từng được gọi là master node và đôi khi bạn sẽ thấy kubernetes gán cả hai vai trò đồng thời vì lý do tương thích.

Đầu ra cho biết control-plane node đã hoàn thành tất cả các tác vụ khởi tạo và ở trạng thái Ready mà từ đó nó có thể bắt đầu chấp nhận các worker node, và thực thi các tác vụ được gửi đến Máy chủ API. Bây giờ bạn có thể thêm worker từ máy cục bộ của mình.

Bước 5: Thiết lập các Worker Node

Thêm worker vào cluster liên quan đến việc thực hiện một lệnh duy nhất. Lệnh này bao gồm thông tin cluster cần thiết, chẳng hạn như địa chỉ IP và cổng của Máy chủ API của control plane và token (mã thông báo) an toàn. Chỉ các node vượt qua token an toàn mới có thể tham gia vào cluster.

Điều hướng trở lại workspace của bạn và tạo một playbook có tên là workers.yml:

  1. nano ~/kube-cluster/workers.yml

Thêm văn bản dưới đây vào tệp để thêm worker vào cluster:

~/kube-cluster/workers.yml
---
- hosts: control_plane
  become: yes
  gather_facts: false
  tasks:
    - name: get join command
      shell: kubeadm token create --print-join-command
      register: join_command_raw

    - name: set join command
      set_fact:
        join_command: "{{ join_command_raw.stdout_lines[0] }}"


- hosts: workers
  become: yes
  tasks:
    - name: join cluster
      shell: "{{ hostvars['control1'].join_command }} >> node_joined.txt"
      args:
        chdir: $HOME
        creates: node_joined.txt

Đây là những gì playbook thực hiện:

  • Play đầu tiên nhận được lệnh tham gia cần được chạy trên các worker node. Lệnh này sẽ có định dạng sau: kubeadm join --token <token> <control-plane-ip>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>. Khi nó nhận được lệnh thực sự với token và giá trị hash thích hợp, tác vụ sẽ đặt nó thành dữ kiện để play tiếp theo sẽ có thể truy cập thông tin đó.
  • Play thứ hai có một nhiệm vụ duy nhất là chạy lệnh tham gia trên tất cả các worker node. Khi hoàn thành nhiệm vụ này, hai worker node sẽ là một phần của cluster.

Lưu và đóng tệp khi bạn hoàn tất.

Chạy playbook cục bộ với lệnh sau:

  1. ansible-playbook -i hosts ~/kube-cluster/workers.yml

Khi hoàn thành, bạn sẽ thấy đầu ra tương tự như sau:

Output
PLAY [control1] **** TASK [get join command] **** changed: [control1] TASK [set join command] ***** ok: [control1] PLAY [workers] ***** TASK [Gathering Facts] ***** ok: [worker1] ok: [worker2] TASK [join cluster] ***** changed: [worker1] changed: [worker2] PLAY RECAP ***** control1 : ok=2 changed=1 unreachable=0 failed=0 worker1 : ok=2 changed=1 unreachable=0 failed=0 worker2 : ok=2 changed=1 unreachable=0 failed=0

Với việc bổ sung các worker node, cluster của bạn hiện đã được thiết lập và hoạt động đầy đủ, với các worker sẵn sàng chạy khối lượng công việc. Trước khi lên lịch ứng dụng, hãy xác minh rằng cluster đang hoạt động như dự kiến.

Bước 6: Xác minh Cluster

Một cluster đôi khi có thể bị lỗi trong quá trình thiết lập do một node bị lỗi hoặc kết nối mạng giữa control plane và workers hoạt động không chính xác. Hãy xác minh cluster và đảm bảo rằng các node đang hoạt động chính xác.

Bạn sẽ cần phải kiểm tra trạng thái hiện tại của cluster từ control plane node để đảm bảo rằng các node đã sẵn sàng. Nếu bạn ngắt kết nối khỏi control plane node, bạn có thể SSH trở lại node đó bằng lệnh sau:

  1. ssh ubuntu@control_plane_ip

Sau đó thực hiện lệnh sau để nhận trạng thái của cluster:

  1. kubectl get nodes

Bạn sẽ thấy đầu ra tương tự như sau:

Output
NAME STATUS ROLES AGE VERSION control1 Ready control-plane,master 3m21s v1.22.0 worker1 Ready <none> 32s v1.22.0 worker2 Ready <none> 32s v1.22.0

Nếu tất cả các node của bạn có giá trị Ready cho STATUS, điều đó có nghĩa là chúng là một phần của cluster và sẵn sàng chạy khối lượng công việc.

Tuy nhiên, nếu một số node có NotReadySTATUS, điều đó có thể có nghĩa là các worker node chưa hoàn thành thiết lập của chúng. Chờ khoảng năm đến mười phút trước khi chạy lại kubectl get nodes và kiểm tra đầu ra mới. Nếu một số node vẫn có trạng thái NotReady, bạn có thể phải xác minh và chạy lại các lệnh trong các bước trước đó.

Bây giờ cluster của bạn đã được xác minh thành công, hãy lên lịch cho một ứng dụng Nginx mẫu trên cluster.

Bước 7: Chạy một ứng dụng trên cluster

Bây giờ bạn có thể triển khai bất kỳ ứng dụng được chứa trong cluster của mình. Để giữ cho mọi thứ quen thuộc, hãy triển khai Nginx bằng Deployments and Services để khám phá cách ứng dụng này có thể được triển khai cho cluster. Bạn cũng có thể sử dụng các lệnh bên dưới cho các ứng dụng được chứa trong vùng chứa khác, miễn là bạn thay đổi Docker image name và bất kỳ cờ nào có liên quan (chẳng hạn như portsvolumes).

Đảm bảo rằng bạn đã đăng nhập vào control plane node, sau đó chạy lệnh dưới đây để tạo một deployment có tên nginx:

  1. kubectl create deployment nginx --image=nginx

Deployment là một loại đối tượng Kubernetes đảm bảo luôn có một số lượng pod được chỉ định chạy dựa trên một mẫu đã xác định, ngay cả khi pod gặp sự cố trong thời gian tồn tại của cluster. Việc triển khai ở trên sẽ tạo một pod với một vùng chứa từ Nginx Docker Image của cơ quan đăng ký Docker.

Tiếp theo, chạy lệnh dưới đây để tạo một dịch vụ có tên nginx sẽ hiển thị ứng dụng công khai. Nó sẽ làm như vậy thông qua NodePort, một lược đồ sẽ làm cho pod có thể truy cập thông qua một cổng tùy ý được mở trên mỗi node của cluster:

  1. kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort

Services là một loại đối tượng Kubernetes khác để hiển thị các dịch vụ nội bộ cluster cho các máy khách, cả nội bộ và bên ngoài. Chúng cũng có khả năng cân bằng tải các yêu cầu tới nhiều pod và là một thành phần không thể thiếu trong Kubernetes, thường xuyên tương tác với các thành phần khác.

Chạy lệnh sau:

  1. kubectl get services

Lệnh này sẽ xuất ra văn bản tương tự như sau:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d nginx NodePort 10.109.228.209 <none> 80:nginx_port/TCP 40m

Từ dòng được đánh dấu của đầu ra ở trên, bạn có thể truy xuất cổng mà Nginx đang chạy. Kubernetes sẽ tự động chỉ định một cổng ngẫu nhiên lớn hơn 30000, đồng thời đảm bảo rằng cổng đó chưa bị ràng buộc bởi một dịch vụ khác.

Để kiểm tra xem mọi thứ đang hoạt động, hãy truy cập http://worker_1_ip:nginx_port hoặc http://worker_2_ip:nginx_port thông qua trình duyệt trên máy cục bộ của bạn. Bạn sẽ thấy trang chào mừng quen thuộc của Nginx.

Nếu bạn muốn xóa ứng dụng Nginx, trước tiên hãy xóa dịch vụ nginx khỏi control plane node:

  1. kubectl delete service nginx

Chạy các bước sau để đảm bảo rằng dịch vụ đã bị xóa:

  1. kubectl get services

Bạn sẽ thấy kết quả sau:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d

Sau đó xóa deployment:

  1. kubectl delete deployment nginx

Chạy phần sau để xác nhận rằng điều này đã hoạt động:

  1. kubectl get deployments
Output
No resources found.

Kết luận

Trong hướng dẫn này, bạn đã thiết lập thành công một Kubernetes cluster trên Ubuntu 20.04 bằng cách sử dụng Kubeadm và Ansible để tự động hóa.

Nếu bạn đang tự hỏi phải làm gì với cluster bây giờ khi nó đã được thiết lập, bước tiếp theo sẽ là bạn có thể cảm thấy thoải mái khi triển khai các ứng dụng và dịch vụ của riêng mình vào cluster. Dưới đây là danh sách các liên kết có thêm thông tin có thể hướng dẫn bạn trong quá trình này:

  • Dockerizing ứng dụng - liệt kê các ví dụ trình bày chi tiết cách chứa các ứng dụng bằng Docker.
  • Pod Overview - mô tả chi tiết cách Pod hoạt động và mối quan hệ của chúng với các đối tượng Kubernetes khác. Pod phổ biến ở Kubernetes, vì vậy hiểu rõ về chúng sẽ tạo điều kiện thuận lợi cho công việc của bạn.
  • Deployments Overview - cung cấp tổng quan về các deployment. Sẽ rất hữu ích khi hiểu cách các bộ điều khiển như deployments hoạt động, vì chúng được sử dụng thường xuyên trong các ứng dụng không trạng thái (stateless applications) để mở rộng quy mô và tự động chữa lành các ứng dụng không lành mạnh (unhealthy applications).
  • Services Overview - bao gồm các dịch vụ, một đối tượng thường được sử dụng khác trong các Kubernetes cluster. Hiểu các loại dịch vụ và các tùy chọn mà chúng có là điều cần thiết để chạy cả stateless và stateful applications.

Các khái niệm quan trọng khác mà bạn có thể xem xét là Volumes, Ingresses và Secrets, tất cả đều hữu ích khi triển khai các ứng dụng sản xuất.

Kubernetes có rất nhiều chức năng và tính năng để cung cấp. The Kubernetes Official Documentation là nơi tốt nhất để tìm hiểu về các khái niệm, tìm các hướng dẫn dành riêng cho tác vụ và tra cứu các tham chiếu API cho các đối tượng khác nhau.

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời