_Tác giả đã chọn Quỹ nguồn mở và miễn phí để nhận khoản đóng góp như một phần của Viết cho DOnations chương trình._

Giới thiệu

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

Kubeadm tự động cài đặt và cấu hình các thành phần Kubernetes như máy chủ API, Trình quản lý bộ điều khiển và Kube DNS. Tuy nhiên, nó không tạo ra người dùng hoặc xử lý việc cài đặt các phụ thuộc cấp hệ điều hành và cấu hình của chúng. Đối với các nhiệm vụ sơ bộ này, có thể sử dụng công cụ quản lý cấu hình như Ansible hoặc là SaltStack. Sử dụng các công cụ này giúp tạo các cụm bổ sung hoặc tạo lại các cụm 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 cụm Kubernetes từ đầu bằng cách sử dụng Ansible và Kubeadm, và sau đó triển khai một ứng dụng Nginx được chứa vào nó.

Những mục tiêu

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

  • Một nút chính

Nút chính (a nút trong Kubernetes đề cập đến một máy chủ) có trách nhiệm quản lý trạng thái của cụm. Nó chạy Etcd, lưu trữ dữ liệu cụm giữa các thành phần lập lịch tải công việc cho các nút công nhân.

  • Hai nút công nhân

Nút công nhân là các máy chủ nơi bạn khối lượng công việc (tức là các ứng dụng và dịch vụ được container) sẽ chạy. Một nhân viên sẽ tiếp tục chạy khối lượng công việc của bạn sau khi họ được gán cho nó, ngay cả khi chủ nhân đi xuống sau khi lập lịch hoàn tất. Năng lực của một cụm có thể được tăng lên bằng cách thêm công nhân.

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

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

Điều kiện tiên quyết

  • Một cặp khóa SSH trên máy Linux / macOS / BSD cục bộ của bạn. Nếu trước đây bạn chưa sử dụng các khóa SSH, bạn có thể tìm hiểu cách thiết lập chúng bằng cách làm theo giải thích về cách thiết lập khóa SSH trên máy cục bộ của bạn.

  • Ba máy chủ chạy Ubuntu 18.04 với ít nhất 1GB RAM. Bạn sẽ có thể SSH vào mỗi máy chủ như người dùng root với cặp khóa SSH của bạn.

  • Ansible được cài đặt trên máy cục bộ của bạn. Nếu bạn đang chạy Ubuntu 18.04 làm hệ điều hành của bạn, hãy làm theo phần "Bước 1 - Cài đặt Ansible" trong Làm thế nào để cài đặt và cấu hình ansible trên Ubuntu 18.04 để cài đặt Ansible. Để được hướng dẫn cài đặt trên các nền tảng khác như macOS hoặc CentOS, hãy làm theo tài liệu cài đặt chính thức Ansible.

  • Quen thuộc với Playbook Ansible. Để xem xét, 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ừ hình ảnh Docker. Nhìn vào "Bước 5 - Chạy một Docker Container" trong Làm thế nào để cài đặt và sử dụng Docker trên Ubuntu 18.04 nếu bạn cần bồi dưỡng.

Bước 1 - Thiết lập Thư mục Không gian làm việc và Tệp Khoảng không quảng cáo Ansible

Trong phần này, bạn sẽ tạo một thư mục trên máy cục bộ của bạn sẽ phục vụ như không gian làm việc của bạn. Bạn sẽ cấu hình Ansible cục bộ để nó có thể giao tiếp và thực hiện các lệnh trên các máy chủ từ xa của bạn. Khi đã xong, bạn sẽ tạo hosts tệp chứa thông tin khoảng không quảng cáo như địa chỉ IP của 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à máy chủ với IP được hiển thị dưới dạng master_ip. Hai máy chủ khác sẽ là công nhân và sẽ có các IP worker_1_ipworker_2_ip.

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

mkdir ~/kube-cluster

cd ~/kube-cluster

Thư mục này sẽ là không gian làm việc 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 Playbook Ansible 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 tệp có tên ~/kube-cluster/hosts sử dụng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

nano ~/kube-cluster/hosts

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

~/kube-cluster/hosts

[masters]
master ansible_host=master_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 tệp khoảng không quảng cáo 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 dưới dạng đơn vị duy nhất để thực hiện lệnh. ~/kube-cluster/hosts sẽ là tệp khoảng không quảng cáo của bạn và bạn đã thêm hai nhóm Ansible (bậc thầycông nhân) để chỉ định cấu trúc logic của cụm của bạn.

bên trong bậc thầy nhóm, có một mục nhập máy chủ có tên là "master" liệt kê IP của nút chính (master_ip) và chỉ định rằng Ansible sẽ chạy các lệnh từ xa với tư cách là người dùng root.

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

Dòng cuối cùng của tệp cho Ansible sử dụng các 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.

Sau khi thiết lập khoảng không quảng cáo máy chủ với các nhóm, hãy tiếp tục cài đặt các 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 một người dùng không phải root trên tất cả các máy chủ từ xa

Trong phần này, bạn sẽ tạo một người dùng không phải root 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 một cách thủ công như một người dùng không có đặc quyền. Điều này có thể hữu ích nếu, ví dụ, bạn muốn xem thông tin hệ thống với các lệnh như top/htop, xem danh sách các thù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 thường xuyên được thực hiện trong quá trình bảo trì cụm và sử dụng người dùng không phải root 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 tệp có tên ~/kube-cluster/initial.yml trong không gian làm việc:

nano ~/kube-cluster/initial.yml

Tiếp theo, thêm các mục sau chơi vào tệp để tạo người dùng không phải root với quyền sudo trên tất cả các máy chủ. Một vở kịch trong Ansible là một tập hợp các bước được thực hiện để nhắm mục tiêu các máy chủ và nhóm cụ thể. Phát sau sẽ tạo người dùng sudo không phải root:

~/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ề playbook này:

  • Tạo người dùng không phải root ubuntu.

  • Định cấu hình sudoers tệp để cho phép ubuntu người dùng chạy sudo các lệnh không có dấu nhắc mật khẩu.

  • Thêm khóa công khai vào máy cục bộ của bạn (thường là ~/.ssh/id_rsa.pub) đến điều khiển từ xa ubuntu danh sách khóa được ủy quyền của người dùng. Điều này sẽ cho phép bạn SSH vào mỗi máy chủ như ubuntu người dùng.

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

Tiếp theo, thực thi playbook bằng cách chạy cục bộ:

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 kết quả tương tự như sau:

OutputPLAY [all] ****

TASK [Gathering Facts] ****
ok: [master]
ok: [worker1]
ok: [worker2]

TASK [create the 'ubuntu' user] ****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [allow 'ubuntu' user to have passwordless sudo] ****
changed: [master]
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: [master] => (item=ssh-rsa AAAAB3...)

PLAY RECAP ****
master                     : ok=5    changed=4    unreachable=0    failed=0   
worker1                    : ok=5    changed=4    unreachable=0    failed=0   
worker2                    : ok=5    changed=4    unreachable=0    failed=0   

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

Bước 3 - Cài đặt Kubernetetes 'Dependencies

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 thời gian chạy container. Nó là thành phần chạy container của bạn. Hỗ trợ các thời gian chạy khác như rkt đang được phát triển tích cực ở Kubernetes.

  • 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 cụm 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 nút và xử lý các hoạt động cấp nút.

  • kubectl - một công cụ CLI được sử dụng để phát lệnh tới cụm thông qua Máy chủ API của nó.

Tạo tệp có tên ~/kube-cluster/kube-dependencies.yml trong không gian làm việc:

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

Thêm các lượt phát sau 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: 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
       state: present
       update_cache: true

   - name: install kubeadm
     apt:
       name: kubeadm
       state: present

- hosts: master
  become: yes
  tasks:
   - name: install kubectl
     apt:
       name: kubectl
       state: present

Lần chơi đầu tiên trong playbook thực hiện như sau:

  • Cài đặt Docker, thời gian chạy của vùng chứa.

  • Số lượt 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 nguồn APT của bạn.

  • Thêm apt-key của kho lưu trữ Kubernetes APT để xác minh khóa.

  • Thêm kho chứa Kubernetes APT vào danh sách các nguồn APT của máy chủ từ xa của bạn.

  • Số lượt cài đặt kubeletkubeadm.

Lần phát thứ hai bao gồm một tác vụ duy nhất cài đặt kubectl trên nút chính của bạn.

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

Tiếp theo, thực thi playbook bằng cách chạy cục bộ:

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

Khi hoàn thành, bạn sẽ thấy kết quả tương tự như sau:

OutputPLAY [all] ****

TASK [Gathering Facts] ****
ok: [worker1]
ok: [worker2]
ok: [master]

TASK [install Docker] ****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [install APT Transport HTTPS] *****
ok: [master]
ok: [worker1]
changed: [worker2]

TASK [add Kubernetes apt-key] *****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [add Kubernetes' APT repository] *****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [install kubelet] *****
changed: [master]
changed: [worker1]
changed: [worker2]

TASK [install kubeadm] *****
changed: [master]
changed: [worker1]
changed: [worker2]

PLAY [master] *****

TASK [Gathering Facts] *****
ok: [master]

TASK [install kubectl] ******
ok: [master]

PLAY RECAP ****
master                     : ok=9    changed=5    unreachable=0    failed=0   
worker1                    : ok=7    changed=5    unreachable=0    failed=0  
worker2                    : ok=7    changed=5    unreachable=0    failed=0  

Sau khi thực hiện, 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à thành phần bắt buộc và chỉ cần thiết để thực hiện các lệnh cụm. Việc cài đặt nó chỉ trên nút chính có ý nghĩa trong ngữ cảnh này, vì bạn sẽ chạy kubectl lệnh chỉ từ chủ. Tuy nhiên, lưu ý rằng kubectl các lệnh có thể được chạy từ bất kỳ nút nào của nhân viên hoặc từ bất kỳ máy nào có thể cài đặt và cấu hình để trỏ đến một cụm.

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

Bước 4 - Thiết lập nút chính

Trong phần này, bạn sẽ thiết lập nút chính. Tuy nhiên, trước khi tạo bất kỳ playbook nào, nó có giá trị bao gồm một vài khái niệm như PodPlugin mạng Pod, vì cụm của bạn sẽ bao gồm cả hai.

Một nhóm là một đơn vị nguyên tử chạy một hoặc nhiều vùng chứa. Các thùng chứa này chia sẻ các tài nguyên như khối lượng tệp và giao diện mạng chung. Pod là đơn vị lập lịch cơ bản trong Kubernetes: tất cả các vùng chứa trong một nhóm được đảm bảo chạy trên cùng một nút mà nhóm được lên lịch.

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

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

Tạo một Playbook Ansible có tên master.yml trên máy cục bộ của bạn:

nano ~/kube-cluster/master.yml

Thêm lối chơi sau vào tệp để khởi tạo cụm và cài đặt Flannel:

~/kube-cluster/master.yml

- hosts: master
  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/v0.9.1/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ề cách chơi này:

  • Nhiệm vụ đầu tiên khởi tạo cụm bằng cách chạy kubeadm init. Vượt qua đối số --pod-network-cidr=10.244.0.0/16 chỉ định mạng con riêng tư mà các IP nhóm sẽ được chỉ định. Flannel sử dụng mạng con ở trên theo mặc định; chúng tôi đang nói kubeadm để sử dụng cùng một mạng con.

  • Nhiệm vụ thứ hai tạo ra một .kube thư mục tại /home/ubuntu. Thư mục này sẽ giữ thông tin cấu hình như các tệp khóa quản trị, được yêu cầu để kết nối với cụm và địa chỉ API của cụm.

  • Nhiệm vụ thứ ba sẽ sao chép /etc/kubernetes/admin.conf tệp được tạo từ kubeadm init vào thư mục chính của người dùng không phải root của bạn. Điều này sẽ cho phép bạn sử dụng kubectl để truy cập cụm 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 để kể kubectl để tạo các đối tượng được mô tả trong descriptor.[yml|json] tập tin. Các kube-flannel.yml tệp chứa các mô tả về các đối tượng cần thiết để thiết lập Flannel trong cụm.

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

Thực thi playbook cục bộ bằng cách chạy:

ansible-playbook -i hosts ~/kube-cluster/master.yml

Khi hoàn thành, bạn sẽ thấy kết quả tương tự như sau:

Output
PLAY [master] ****

TASK [Gathering Facts] ****
ok: [master]

TASK [initialize the cluster] ****
changed: [master]

TASK [create .kube directory] ****
changed: [master]

TASK [copy admin.conf to user's kube config] *****
changed: [master]

TASK [install Pod network] *****
changed: [master]

PLAY RECAP ****
master                     : ok=5    changed=4    unreachable=0    failed=0  

Để kiểm tra trạng thái của nút chính, SSH vào nó bằng lệnh sau:

ssh ubuntu@master_ip

Khi đã ở trong nút chính, hãy thực thi:

kubectl get nodes

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

OutputNAME      STATUS    ROLES     AGE       VERSION
master    Ready     master    1d        v1.11.1

Đầu ra nói rằng master nút đã hoàn thành tất cả các tác vụ khởi tạo và nằm trong Ready trạng thái mà từ đó nó có thể bắt đầu chấp nhận các nút công nhân và thực hiện các tác vụ được gửi tới Máy chủ API. Bây giờ bạn có thể thêm công nhân từ máy cục bộ của bạn.

Bước 5 - Thiết lập các nút công nhân

Thêm công nhân vào cụm liên quan đến việc thực thi một lệnh duy nhất trên mỗi cụm. Lệnh này bao gồm các thông tin cụm cần thiết, chẳng hạn như địa chỉ IP và cổng của máy chủ API của chủ và một mã thông báo bảo mật. Chỉ các nút được truyền trong mã thông báo bảo mật mới có thể tham gia nhóm.

Điều hướng trở lại không gian làm việc của bạn và tạo một cuốn sách có tên workers.yml:

nano ~/kube-cluster/workers.yml

Thêm văn bản sau vào tệp để thêm công nhân vào cụm:

~/kube-cluster/workers.yml

- hosts: master
  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['master'].join_command }} >> node_joined.txt"
      args:
        chdir: $HOME
        creates: node_joined.txt

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

  • Lần chơi đầu tiên nhận lệnh join cần được chạy trên các nút công nhân. Lệnh này sẽ có định dạng sau:kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>. Một khi nó nhận được lệnh thực tế với mã thông báobăm các giá trị, nhiệm vụ đặt nó như là một thực tế để chơi tiếp theo sẽ có thể truy cập thông tin đó.

  • Lần chơi thứ hai có một nhiệm vụ duy nhất chạy lệnh nối trên tất cả các nút của nhân viên. Khi hoàn thành nhiệm vụ này, hai nút công nhân sẽ là một phần của cụm.

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

Thực thi playbook bằng cách chạy cục bộ:

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

Khi hoàn thành, bạn sẽ thấy kết quả tương tự như sau:

OutputPLAY [master] ****

TASK [get join command] ****
changed: [master]

TASK [set join command] *****
ok: [master]

PLAY [workers] *****

TASK [Gathering Facts] *****
ok: [worker1]
ok: [worker2]

TASK [join cluster] *****
changed: [worker1]
changed: [worker2]

PLAY RECAP *****
master                     : 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 nút công nhân, cụm của bạn bây giờ đã được thiết lập và hoạt động đầy đủ, với các công nhân đã sẵn sàng để chạy các 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 cụm đang hoạt động như dự định.

Bước 6 - Xác minh cụm

Một cụm đôi khi có thể thất bại trong quá trình thiết lập vì nút bị hỏng hoặc kết nối mạng giữa máy chủ và nhân viên không hoạt động chính xác. Hãy kiểm tra cụm sao và đảm bảo rằng các nút đ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 cụm từ nút chính để đảm bảo rằng các nút đã sẵn sàng. Nếu bạn bị ngắt kết nối khỏi nút chính, bạn có thể SSH trở lại vào nó bằng lệnh sau đây:

ssh ubuntu@master_ip

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

kubectl get nodes

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

OutputNAME      STATUS    ROLES     AGE       VERSION
master    Ready     master    1d        v1.11.1
worker1   Ready     <none>    1d        v1.11.1 
worker2   Ready     <none>    1d        v1.11.1

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

Tuy nhiên, nếu một vài nút có NotReady như STATUS, nó có thể có nghĩa là các nút công nhân vẫn chưa hoàn thành thiết lập của họ. Đợi khoảng 5 đến 10 phút trước khi chạy lại kubectl get nodes và kiểm tra đầu ra mới. Nếu một vài nút vẫn còn NotReady là trạng thái, 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ờ cụm của bạn đã được xác minh thành công, hãy lên lịch một ứng dụng Nginx ví dụ trên cụm.

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 container nào vào cụm của bạn. Để giữ cho mọi thứ quen thuộc, hãy triển khai Nginx bằng Triển khaiDịch vụ để xem ứng dụng này có thể được triển khai như thế nào trong 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 container khác, miễn là bạn thay đổi tên hình ảnh Docker và bất kỳ cờ nào có liên quan (chẳng hạn như portsvolumes).

Vẫn nằm trong nút chính, thực hiện lệnh sau để tạo triển khai có tên nginx:

kubectl run nginx --image=nginx --port 80

Triển khai là một loại đối tượng Kubernetes đảm bảo luôn có một số lượng nhóm được chỉ định chạy dựa trên mẫu được xác định, ngay cả khi vỏ bị hỏng trong suốt thời gian tồn tại của cụm. Việc triển khai trên sẽ tạo ra một nhóm với một container từ registry của Docker Hình ảnh Nginx Docker.

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

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

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

Chạy lệnh sau:

kubectl get services

Điều này sẽ xuất văn bản tương tự như sau:

OutputNAME         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 thứ ba của đầu ra ở trên, bạn có thể truy xuất cổng Nginx đang chạy. Kubernetes sẽ gán một cổng ngẫu nhiên lớn hơn 30000 tự động, trong khi đả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 mọi thứ đang hoạt động, hãy truy cập http://worker_1_ip:nginx_port hoặc là 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 hết hãy xóa nginx dịch vụ từ nút chính:

kubectl delete service nginx

Chạy phần sau để đảm bảo rằng dịch vụ đã bị xóa:

kubectl get services

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

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

Sau đó xóa triển khai:

kubectl delete deployment nginx

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

kubectl get deployments

OutputNo resources found.

Phần kết luận

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

Nếu bạn đang tự hỏi phải làm gì với cluster ngay bây giờ khi nó được thiết lập, một bước tiếp theo tốt là làm quen với việc triển khai các ứng dụng và dịch vụ của riêng bạn lên 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:

  • Ứng dụng Dockerizing - Liệt kê các ví dụ chi tiết cách chứa các ứng dụng bằng Docker.

  • Tổng quan về Pod - 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. Pods có mặt khắp nơi ở Kubernetes, vì vậy việc hiểu chúng sẽ tạo thuận lợi cho công việc của bạn.

  • Tổng quan về triển khai - cung cấp tổng quan về triển khai. Nó rất hữu ích để hiểu cách các bộ điều khiển như triển khai hoạt động như thế nào vì chúng được sử dụng thường xuyên trong các ứng dụng không trạng thái để mở rộng quy mô và tự động sửa chữa các ứng dụng không lành mạnh.

  • Tổng quan về dịch vụ - bao gồm các dịch vụ, một đối tượng thường được sử dụng khác trong các cụm Kubernetes. Hiểu các loại dịch vụ và các tùy chọn mà chúng có là cần thiết để chạy cả hai ứng dụng không trạng thái và trạng thái.

Các khái niệm quan trọng khác mà bạn có thể xem xét là Tập, Ingresses và Bí mật, tất cả đều tiện dụng 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. Tài liệu chính thức của Kubernetes là nơi tốt nhất để tìm hiểu về các khái niệm, tìm hướng dẫn cụ thể theo nhiệm vụ và tra cứu tham chiếu API cho các đối tượng khác nhau.