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 đó.
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.
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ủ.
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_ip
và worker_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 đó:
- mkdir ~/kube-cluster
- 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:
- 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:
[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 plane và workers) 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_ip
và worker_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 Y
và Enter
.
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.
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:
- 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:
---
- 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:
ubuntu
.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.~/.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ộ:
- 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:
OutputPLAY [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.
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à:
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:
- 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:
---
- 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:
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.kubelet
và kubeadm
.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:
- 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:
OutputPLAY [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, kubeadm
và kubelet
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.
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:
- 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:
---
- 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:
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..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./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.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:
- 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:
OutputPLAY [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:
- ssh ubuntu@control_plane_ip
Khi bên trong control plane node, hãy thực hiện:
- kubectl get nodes
Bây giờ bạn sẽ thấy kết quả sau:
OutputNAME 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.
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
:
- nano ~/kube-cluster/workers.yml
Thêm văn bản dưới đây vào tệp để thêm worker vào cluster:
---
- 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:
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 đó.Lưu và đóng tệp khi bạn hoàn tất.
Chạy playbook cục bộ với lệnh sau:
- 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:
OutputPLAY [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.
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:
- ssh ubuntu@control_plane_ip
Sau đó thực hiện lệnh sau để nhận trạng thái của cluster:
- kubectl get nodes
Bạn sẽ thấy đầu ra tương tự như sau:
OutputNAME 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ó NotReady
là STATUS
, đ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â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ư ports
và volumes
).
Đả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
:
- 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:
- 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:
- kubectl get services
Lệnh này sẽ xuất ra 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 đượ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:
- kubectl delete service nginx
Chạy các bước 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 deployment:
- kubectl delete deployment nginx
Chạy phần sau để xác nhận rằng điều này đã hoạt động:
- kubectl get deployments
OutputNo resources found.
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:
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.