Cách cài đặt Kubernetes trên Ubuntu
Việc triển khai thủ công các container Docker trên nhiều máy chủ có thể rất tốn thời gian, khiến lịch làm việc của bất kỳ quản trị viên hệ thống nào được giao nhiệm vụ này bị chiếm dụng hoàn toàn. Trong ngành CNTT hiện đại, sự phổ biến của điện toán đám mây, microservices và container tiếp tục gia tăng, và chính vì lý do này, các giải pháp như Kubernetes đã được phát triển.
Kubernetes là một giải pháp quản lý và điều phối container mã nguồn mở, cho phép bạn xây dựng một cụm (cluster) nhằm đơn giản hóa việc triển khai các container trong môi trường phân tán cũng như đảm bảo tính sẵn sàng cao cho các ứng dụng được container hóa. Mục tiêu của bài viết này là tìm hiểu cách cài đặt Kubernetes trên Ubuntu để chạy các ứng dụng trong các container Docker.
Yêu cầu và Cấu hình Hệ thống để Cài đặt Kubernetes trên Ubuntu
Cụm Kubernetes bao gồm các node chính và các node công tác. Cấu hình phần cứng phụ thuộc vào nhu cầu và các ứng dụng mà bạn dự định chạy trong Container Docker. Yêu cầu phần cứng tối thiểu để cài đặt Kubernetes trên Ubuntu là:
- Ít nhất một CPU (Bộ xử lý) x86/x64 2 lõi
- RAM (Bộ nhớ truy xuất ngẫu nhiên) ít nhất 2 GB hoặc nhiều hơn
- Truy cập Internet
Các cổng cần được mở để cài đặt Kubernetes trên Ubuntu:
| Giao thức và phạm vi cổng | Nguồn | Mục đích | Hướng |
| TCP 443 | Các nút công tác, người dùng cuối, yêu cầu API | Máy chủ API Kubernetes | Đầu vào nút chính |
| TCP 10250 | Các node chính | Cổng kiểm tra sức khỏe nút công tác Kubelet | Đầu vào nút công tác |
| TCP 30000-32767 | Khách hàng ứng dụng bên ngoài | Phạm vi cổng mặc định để cung cấp các dịch vụ bên ngoài | |
| UDP 8285 | Các nút công tác | Backend UDP của mạng phủ Flannel | |
| UDP 8472 | Các nút công tác | Backend VXLAN của mạng phủ Flannel | |
| TCP 179 | Các nút công tác | Cần thiết chỉ khi mạng Calico BGP được sử dụng | |
| TCP 2379-2380 | Các node chính | API khách hàng máy chủ etcd | Đầu vào nút etcd |
| TCP 2379-2380 | Các nút công tác | API khách hàng máy chủ etcd cần thiết nếu sử dụng Flannel hoặc Calico |
Theo mặc định, tường lửa iptables được cài đặt trên Ubuntu, nhưng không có bất kỳ quy tắc chặn nào “ra khỏi hộp”. Do đó, nếu bạn đang cài đặt Ubuntu để thử Kubernetes, bạn không cần phải chỉnh sửa các quy tắc tường lửa. Kube-proxy đặt các chuỗi iptables của nó trước, và sau đó chèn hai quy tắc iptables. Các quy tắc này là KUBE-EXTERNAL-SERVICES và KUBE-FIREWALL được chèn vào đầu chuỗi INPUT.
Cài đặt Kubernetes trên Ubuntu có thể được thực hiện trên cả máy vật lý và máy ảo. Khuyến nghị chung là sử dụng phiên bản mới nhất của Ubuntu Linux 64 bit. Bài viết trên blog hôm nay giải thích cách cài đặt Kubernetes trên Ubuntu 18.04 LTS đang chạy trên VM của VMware. Loại triển khai Kubernetes đầu tiên được giải thích là với một nút điều khiển và hai nút công nhân được sử dụng cho cụm Kubernetes. Xem bảng dưới đây để xem số lượng nút có điều kiện, vai trò nút, tên máy chủ và địa chỉ IP của các máy được sử dụng trong ví dụ được cân nhắc.
| № | Vai trò Nút | Địa chỉ IP | Tên máy chủ |
| 1 | Điều Khiển | 192.168.101.21 | docker-nakivo21 |
| 2 | Công Nhân | 192.168.101.31 | docker-nakivo31 |
| 3 | Công Nhân | 192.168.101.32 | docker-nakivo32 |
Bạn có thể sử dụng VM đang chạy trên máy chủ ESXi nếu bạn sử dụng VMware vSphere, hoặc bạn có thể chạy VM trên VMware Workstation được cài đặt trên máy tính cá nhân của bạn với Linux hoặc Windows. Chúng tôi đang sử dụng VM chạy trên VMware Workstation trong ví dụ hôm nay. VM sử dụng NAT mạng với kết nối Internet, và nếu bạn thích VirtualBox chạy trên VMware, bạn có thể sử dụng nó.
Địa chỉ IP của máy chủ: 10.10.10.53
Địa chỉ IP của cổng ảo cho mạng NAT (VMNet8): 192.168.101.2
Cùng một người dùng Linux tồn tại trên tất cả các máy Ubuntu: kubernetes-user
Cấu hình VM: 2CPU, 4GB RAM, Đĩa ảo 20-GB
Bạn có thể thay đổi địa chỉ IP của VMnet8 bằng cách vào Edit > Virtual Network Editor trong VMware Workstation.
Để hiểu rõ hơn, tất cả các thành phần sẽ được cài đặt trên Linux thủ công mà không có các công cụ tự động hóa như Ansible trong ví dụ hôm nay.
Triển khai VM Ubuntu
Tạo VM mới có tên là docker-nakivo21 .
Cài đặt Ubuntu 64-bit trên máy đầu tiên, và đặt tên máy chủ và tên người dùng.
Tên VM: docker-nakivo21
Tên người dùng: kubernetes-user

Cài đặt Công Cụ VMware sau khi đăng nhập lần đầu vào hệ điều hành đã cài đặt. Nếu bạn sử dụng máy chủ vật lý, bạn không cần sử dụng Công Cụ VMware và có thể bỏ qua bước này.
Lưu ý : Ký tự $ ở đầu nghĩa là lệnh được chạy như người dùng bình thường (trong trường hợp này là kubernetes-user ). Nếu chuỗi bắt đầu với ký tự #, lệnh phải được thực hiện như root . Lệnh sudo (thay thế người dùng làm hoặc người dùng cao cấp làm) cho phép bạn thực thi các lệnh dưới danh bạ của người dùng khác bao gồm root. </br>Bạn có thể đánh sudo -i để có quyền root trong bảng điều khiển. Nhấn Ctrl+D để thoát chế độ root.
Bạn có thể cài đặt VMware Tools từ hình ảnh ISO được cung cấp kèm với hypervisor VMware hoặc từ các kho lưu trữ Linux (giải thích bên dưới).
$ sudo apt-get install open-vm-tools
Nếu bạn cần trải nghiệm màn hình nâng cao như chia sẻ clipboard, kéo và thả tệp, v.v…, hãy chạy:
$ sudo apt-get install open-vm-tools-desktop
Khởi động lại VM.
$ init 6
Cấu hình Máy Ubuntu của Bạn Trước Khi Cài Đặt Kubernetes
Một số chuẩn bị phải được thực hiện trước khi cài đặt Kubernetes trên các máy Ubuntu. Trước hết, bạn phải cấu hình địa chỉ IP tĩnh và tên máy chủ cho bất kỳ máy chủ thông thường nào.
Thiết lập địa chỉ IP tĩnh
Đối với bất kỳ loại cụm nào khác, khuyến cáo mạnh mẽ sử dụng các địa chỉ IP tĩnh trên các nút.
Cài đặt công cụ mạng Linux trước khi thiết lập địa chỉ IP.
$ sudo apt-get install net-tools
Đánh ifconfig để kiểm tra địa chỉ IP hiện tại của VM Ubuntu của bạn.

Bạn có thể thấy địa chỉ IP được tự động lấy từ DHCP. Nhớ tên của giao diện mạng. Trong ví dụ hiện tại tên này là ens33 . Tên của giao diện mạng Ethernet đầu tiên thường là eth0 đối với máy vật lý.
Bạn cần một trình chỉnh sửa văn bản để chỉnh sửa tập tin cấu hình. Cài đặt vim làm trình chỉnh sửa văn bản.
$ sudo apt-get install vim
Ở các phiên bản Ubuntu mới nhất, cấu hình mạng được thiết lập trong tập tin yaml. Mở tập tin cấu hình mạng yaml trong vim.
$ sudo vim /etc/netplan/01-network-manager-all.yaml
Chế độ xem mặc định của tập tin cấu hình là:

Chỉnh sửa tập tin cấu hình mạng như hiển thị dưới đây:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.101.21/24]
gateway4: 192.168.101.2
nameservers:
addresses: [192.168.101.2,8.8.8.8]
Lưu thay đổi và thoát.
:wq

$ sudo netplan try
Nhấn ENTER để chấp nhận cấu hình mới.
Kiểm tra xem cấu hình mạng của bạn đã được thay đổi và thử ping, ví dụ, nakivo.com .
$ ifconfig
$ ping nakivo.com

Cấu hình tên máy chủ
Kiểm tra tên máy chủ hiện tại của bạn.
$ hostnamectl
Như bạn đã nhớ, tên máy chủ cho VM đầu tiên là docker-nakivo21 đã được cấu hình sẵn trong quá trình cài đặt. Để thay đổi tên máy chủ, làm như sau (điều này sẽ cần thiết để cấu hình cho VM thứ hai và thứ ba sau khi sao chép. Hai VM đó sẽ được dự định cấu hình như các nút công nhân):
Ví dụ, nếu bạn cần thay đổi tên máy chủ thành docker-nakivo21 trên VM đầu tiên, hãy chạy: $ sudo hostnamectl set-hostname docker-nakivo21
Kiểm tra rằng tên máy chủ mới được áp dụng.
$ less /etc/hostname
Chỉnh sửa tệp máy chủ vật lý .
$ sudo vim /etc/hosts
Nội dung của tệp máy chủ vật lý phải như sau:
127.0.0.1 localhost
127.0.1.1 docker-nakivo21
Khởi động lại máy.
$ init 6
Đã vô hiệu hoán đổi tệp
Sử dụng hoán đổi tệp không được Kubernetes hỗ trợ và cần phải vô hiệu swappiness để cài đặt Kubernetes trên Ubuntu thành công.
Vô hiệu hoán đổi tệp để ngăn chặn việc sử dụng CPU cao của kubelet.
$ sudo swapoff -a
Chỉnh sửa /etc/fstab và nhận xét chuỗi bằng cách sử dụng ký tự #.
$ sudo vim /etc/fstab
#/swapfile none swap sw 0 0

Bạn có thể làm tương tự với sed chỉ với một lệnh.
$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
Vô hiệu hoán đổi trong sysctl.conf
$ sudo echo "vm.swappiness=0" | sudo tee --append /etc/sysctl.conf
Nơi 0 là phần trăm của swappiness. Trong trường hợp này hoán đổi chỉ có thể được sử dụng khi bạn hết RAM (mặc định hoán đổi được sử dụng khi hơn 60% RAM đầy).
Áp dụng thay đổi cấu hình mà không khởi động lại.
$ sudo sysctl -p
Lưu ý : Nếu phân vùng hoán đổi không được vô hiệu hóa, quá trình kswapd0 của Ubuntu Linux chạy Kubernetes có thể tiêu tốn một lượng lớn tài nguyên Bộ xử lý, khiến ứng dụng không phản hồi và hệ thống treo. Điều này xảy ra khi hệ điều hành hết bộ nhớ và các trang bộ nhớ cũ được chuyển sang hoán đổi bởi một tiến trình nhân Linux. Vì những lý do kỳ lạ, đôi khi sự việc diễn ra không đúng, và một vòng lặp không ngừng sử dụng tất cả tài nguyên Bộ xử lý xảy ra. Trên màn hình dưới đây, bạn nhìn thấy việc tiêu thụ Bộ xử lý cao của quá trình kswapd0 khi Kubernetes được cài đặt trên Ubuntu. Giá trị trung bình tải là quá cao.

Nếu kswapd0 vẫn còn quá tải CPU, hãy chạy lệnh sau để vô hiệu hóa tất cả bộ nhớ đệm và dừng kswapd0 (thực hiện như người dùng root).
# echo 1 > /proc/sys/vm/drop_caches
Đóng máy ảo.
$ init 0
Máy ảo đã được định cấu hình một phần này ( docker-nakivo21 ) chuẩn bị được sử dụng như một nút chính. Tạo hai máy để sử dụng làm nút lao động. Nếu bạn sử dụng máy vật lý, hãy lặp lại các bước trước đó thủ công (hoặc sử dụng các công cụ tự động hóa như Ansible để cấu hình đồng thời nhiều máy Linux qua SSH). Vì các máy ảo được sử dụng trong ví dụ hiện tại, chúng có thể được sao chép để tiết kiệm thời gian trong khi chuẩn bị môi trường để cài đặt Kubernetes trên các máy Ubuntu.
Sao chép máy ảo
Sao chép máy ảo đầu tiên của bạn. Nếu bạn sử dụng VMware ESXi, bạn có thể sử dụng tính năng sao chép tích hợp. Bạn có thể tìm hiểu thêm về chủ đề này bằng cách đọc bài đăng trên blog của chúng tôi tại Sao chép máy ảo bằng cách sử dụng các mẫu máy ảo. Nếu bạn sử dụng VMware Workstation, bạn cũng có thể sao chép VMs bằng hai phương pháp (công cụ sao chép tích hợp sẵn và thủ công). Bạn có thể nhấp vào VM > Manage > Clone để tạo một bản sao liên kết. Hãy tạo một bản sao đầy đủ của VM đầu tiên và sao chép thủ công các tệp VM. Trong trường hợp này, các tệp được sao chép từ thư mục docker-nakivo21 đến docker-nakivo31. Các thư mục phải được tạo thủ công trước khi sao chép tệp VM.

Chỉnh sửa tệp VMX, vì tên VM và đường dẫn đến tệp đĩa ảo đã được thay đổi.
displayName = "docker-nakivo31"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo31.vmdk"
nvram = "docker-nakivo31.nvram"

VM sẽ được sử dụng như nút công nhân đầu tiên đã được tạo. Sao chép lại VM đầu tiên để chuẩn bị nút công nhân thứ hai của cụm Kubernetes.
Chỉnh sửa tệp VMX cho VM thứ ba (nút công nhân thứ hai), như bạn đã làm trước đó.
displayName = "docker-nakivo32"
scsi0:0.fileName = "C:VirtualKUBERNETESdocker-nakivo31docker-nakivo32.vmdk"
nvram = "docker-nakivo32.nvram"
Mở các bản sao VM trong VMware Workstation (File> Open và chọn tệp VMX của VM), hoặc chỉ cần nhấp đúp vào tệp VMX của VM. Bật ba máy ảo (một máy nguồn của bạn và hai bản sao VM). Nhấp vào Tôi đã sao chép nó , khi được nhắc.
Lưu ý : Nếu bạn sử dụng máy ảo, chỉnh sửa địa chỉ IP và tên máy chủ trên mỗi bản sao VM một khi VMs đã được sao chép. Nếu bạn sử dụng máy vật lý, làm theo tất cả các bước trước đó theo địa chỉ IP và tên máy chủ của từng máy.
Cấu hình địa chỉ IP và tên máy chủ trên VMs
Thay đổi địa chỉ IP và tên máy trên docker-nakivo31 và docker-nakivo32 VMs (như được hiển thị ở trên).
Lặp lại các bước được giải thích trong các phần trên để cấu hình địa chỉ IP tĩnh và tên máy chủ.
Địa chỉ IP phải là: 192.168.101.31 và 192.168.101.32 ; tên máy chủ phải là docker-nakivo31 và docker-nakivo32 tương ứng trên các nút công nhân.
Tất cả các máy phải được cấu hình để giải quyết tên máy chủ của các nút thành địa chỉ IP. Bạn có thể cấu hình máy chủ DNS hoặc chỉnh sửa thủ công tệp hosts trên mỗi máy. Hãy chỉnh sửa hosts .
Thêm các chuỗi sau vào tệp hosts trên mỗi máy ( docker-nakivo21 , docker-nakivo31 , docker-nakivo32 ).
$ sudo vim /etc/hosts
Thêm các dòng này vào tệp hosts :
192.168.101.21 docker-nakivo21
192.168.101.31 docker-nakivo31
192.168.101.32 docker-nakivo32

Ping các máy chủ khác từ mỗi máy để đảm bảo rằng các tên máy chủ được giải quyết: $ ping docker-nakivo21
$ ping docker-nakivo31
$ ping docker-nakivo32
Cấu hình quyền truy cập SSH trên tất cả các máy chủ vật lý (VMs)
Cấu hình quyền truy cập SSH trên tất cả các máy chủ vật lý. Cài đặt máy chủ OpenSSH bằng cách thực thi các lệnh trên mỗi máy.
$ sudo apt-get install openssh-server
Đi đến thư mục chính của người dùng Kubernetes và tạo cặp khóa SSH (bao gồm một khóa cá nhân và một khóa công khai). Cặp khóa SSH có thể được sử dụng để truy cập điều khiển từ xa Linux qua SSH mà không cần sử dụng mật khẩu. Khóa công khai có thể được sao chép vào một máy mà bạn cần kết nối từ xa, trong khi khóa cá nhân là rất bí mật và phải được lưu trữ trên máy mà bạn cần kết nối.
$ ssh-keygen
Không cần thiết phải nhập mật khẩu để tạo khóa (mật khẩu là tùy chọn).
Sao chép khóa tới các máy Ubuntu khác:
$ ssh-copy-id kubernetes-user@192.168.101.31
$ ssh-copy-id kubernetes-user@192.168.101.32
Nhập mật khẩu người dùng của bạn để xác nhận việc sao chép khóa.
Thử kết nối tới máy thứ hai ( docker-nakivo31 ) với tư cách người dùng Kubernetes (đó là một người dùng thông thường).
$ ssh 'kubernetes-user@192.168.101.31'
Sau đó kiểm tra kết nối tới máy thứ ba ( docker-nakivo32 ).
$ ssh 'kubernetes-user@192.168.101.32'
Bạn sẽ thấy tên của máy vật lý từ xa trong lời nhắc lệnh của bảng điều khiển của bạn sau kết nối thành công.

Nhấn Ctrl+D để thoát khỏi bảng điều khiển từ xa.
Làm thế nào để sao chép khóa để kết nối qua SSH với tư cách người dùng root?
Do bạn sẽ cần quyền root trong Kubernetes, hãy tạo khóa để cấu hình quyền truy cập SSH cho người dùng root. Thực thi các lệnh sau trên tất cả các máy (docker-nakivo21, docker-nakivo31 và docker-nakivo32) cần được truy cập qua SSH với tư cách là người dùng root.
$ sudo -i
Chỉnh sửa tệp cấu hình máy chủ SSH.
# vim /etc/ssh/sshd_config
Thêm/chỉnh sửa chuỗi sau vào tệp này.
PermitRootLogin yes

Khởi động lại daemon của máy chủ SSH.
# /etc/init.d/ssh stop
# /etc/init.d/ssh start
Đặt mật khẩu root (mật khẩu dành cho người dùng root).
# passwd
$ cd /home/kubernetes-user/
$ sudo ssh-keygen -t rsa
Sao chép khóa công khai để có thể đăng nhập từ xa qua SSH với tư cách root (khóa được lưu trong thư mục chính của người dùng thông thường vì lệnh trước đó đã chạy từ thư mục đó).
$ sudo ssh-copy-id -i /home/kubernetes-user/.ssh/id_rsa.pub 127.0.0.1
Nếu khóa của bạn được lưu vào thư mục chính của người dùng root, sao chép khóa bằng lệnh này:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1
Xác nhận hành động này và nhập mật khẩu của bạn.
Lặp lại thao tác, sao chép khóa từ mỗi máy sang các máy khác. Ví dụ, trên máy docker-nakivo21 thực thi:
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.31
# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.101.32
Làm cho khóa công khai được ủy quyền.
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
Xác minh xem bạn có thể đăng nhập với tư cách là người dùng root qua SSH trên máy cục bộ hay không. $ sudo ssh root@127.0.0.1
Thử kết nối từ/đến máy chủ vật lý mà không cần nhập mật khẩu.
$ sudo ssh root@192.168.101.21
$ sudo ssh root@192.168.101.31
$ sudo ssh root@192.168.101.32
Ghi chú : Kết nối với tư cách người dùng root có thể không an toàn. Đừng kết nối với tư cách người dùng root nếu không cần thiết—tốt hơn là kết nối qua SSH với tư cách người dùng thường và sử dụng lệnh sudo.
Cài đặt Docker
Docker là nền tảng container ứng dụng doanh nghiệp phổ biến nhất được hỗ trợ bởi Kubernetes. Cài đặt Docker trên tất cả các máy chủ vật lý. Thực hiện các lệnh được hiển thị dưới đây trên docker-nakivo21 , docker-nakivo31 , docker-nakivo32 .
Tuy nhiên, không cần phải vội vàng. Ban đầu, bạn chỉ cần cài đặt Docker bằng cách sử dụng lệnh thông thường:
$ sudo apt-get install -y docker.io
Tuy nhiên, trong trường hợp này, phiên bản Docker được sử dụng có thể không phải là phiên bản mới nhất. Chúng ta hãy khắc phục điều đó bằng cách cài đặt phiên bản mới nhất của Docker.
Đầu tiên, cài đặt các gói yêu cầu.
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Curl là công cụ nhỏ gọn và phổ quát được thiết kế để chuyển dữ liệu từ/đến máy chủ vật lý mà không cần sự tương tác của người dùng bằng cách sử dụng một trong các giao thức được hỗ trợ (HTTP, HTTPS, FTP, FTPS, SFTP, LDAP, LDAPS, IMAP, IMAPS, POP3, POP3S, SCP, SMB, SMTP, TELNET, v.v.).
Thêm khóa GPG cho kho lưu trữ Docker chính thức vào hệ thống Ubuntu của bạn:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Đầu ra của bảng điều khiển phải là OK.
Thêm kho lưu trữ Docker chính thức vào trình quản lý gói apt của bạn:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
Cập nhật cơ sở dữ liệu của trình quản lý gói sau khi thực hiện các thay đổi bằng lệnh trước đó.
$ sudo apt-get update
Kiểm tra phiên bản của gói Docker có sẵn trong kho lưu trữ chính thức.
$ apt-cache policy docker-ce
Cài đặt Docker.
$ sudo apt-get install docker-ce
Bạn có thể kiểm tra phiên bản của Docker sau khi cài đặt.
$ docker --version
Trong trường hợp này, đầu ra là: Docker phiên bản 18.09.6, build 481bc77 .
Khởi động Docker và khiến daemon của nó có thể tải tự động khi hệ thống khởi động.
$ sudo systemctl start docker
$ sudo systemctl enable docker
Sau khi bạn đã cài đặt Docker trên tất cả các máy chủ vật lý, bạn có thể tiến thẳng đến bước cài đặt Kubernetes trên Ubuntu.
Cài đặt Kubernetes trên Ubuntu và Khởi tạo Cluster
Hiện tại, không có gì ngăn cản bạn cài đặt các thành phần chính của Kubernetes.
Chạy các lệnh như là người dùng root trên tất cả các máy chủ sẽ được bao gồm trong cluster Kubernetes.
$ sudo -i
Thêm khóa GPG cho kho lưu trữ Docker chính thức vào hệ thống Ubuntu của bạn:
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
Thêm kho lưu trữ Kubernetes chính thức vào cơ sở dữ liệu của các kho lưu trữ gói có sẵn cho trình quản lý gói apt của bạn.
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
Ngoài ra, bạn có thể thêm kho lưu trữ với lệnh này: # echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
Trong đó tee là một công cụ đọc đầu vào tiêu chuẩn và ghi dữ liệu đầu vào ra đầu ra tiêu chuẩn cũng như các tệp đã định nghĩa.
Cập nhật danh sách gói của các kho lưu trữ có sẵn trên hệ thống Ubuntu của bạn.
# apt-get update

Cài đặt kubectl , kubeadm và kubectl là điều cần thiết để cài đặt Kubernetes trên Ubuntu.
# apt-get install -y kubelet kubeadm kubectl
Cài đặt keepalived.
# apt-get install keepalived
# systemctl enable keepalived && systemctl start keepalived
Kiểm tra xem giá trị có phải là 1 hay không để đảm bảo Kubernetes cài đặt trên Ubuntu hoạt động chính xác.
# sysctl net.bridge.bridge-nf-call-iptables
Để đặt giá trị này thành 1 hãy chạy lệnh:
sysctl net.bridge.bridge-nf-call-iptables=1
Chỉnh sửa tệp cấu hình kubeadm.
# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Thêm chuỗi sau chuỗi Environment hiện có:
Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

Cgroups là các nhóm kiểm soát giúp cách ly việc sử dụng tài nguyên như bộ xử lý, bộ nhớ, đầu vào/đầu ra đĩa, mạng.
Trên nút chủ ( docker-nakivo21 ), hãy chạy lệnh để khởi tạo cụm Kubernetes trên Ubuntu.
# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.101.21
Trong đó
–pod-network-cidr là thông số bắt buộc do trình điều khiển Flannel yêu cầu. CIDR (Classless Inter-Domain Routing) xác định địa chỉ của mạng overlay (như Flannel) sẽ được cấu hình sau này. Mặt nạ mạng cũng xác định số lượng pod có thể chạy trên mỗi nút. Địa chỉ mạng CIDR và địa chỉ mạng được sử dụng cho Flannel phải giống nhau.
–apiserver-advertise-address=192.168.101.21 xác định địa chỉ IP sẽ được Kubernetes công bố làm máy chủ API của nó.

Hãy đọc kết quả đầu ra và lưu các lệnh được hiển thị ở cuối văn bản. Đây là một điểm quan trọng. Token được tạo ra là bắt buộc để thêm các nút worker vào cụm Kubernetes.
Chạy các lệnh sau với tư cách người dùng đã thực thi kubeadm init. Trong trường hợp này, các lệnh được thực thi với quyền root.
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
Nếu bạn không chạy các lệnh này, Kubernetes sẽ trả về lỗi: Kết nối đến máy chủ localhost:8080 bị từ chối – bạn đã chỉ định đúng máy chủ hoặc cổng chưa?
Kubernetes không tự động sao chép tệp cấu hình này vào thư mục người dùng. Bạn nên thực hiện thao tác này thủ công.

Kiểm tra các nút đã được thêm vào cụm
# kubectl get nodes

Bạn có thể thấy một nút chủ có trạng thái NotReady trong cụm Kubernetes đang được cài đặt trên Ubuntu. Điều này là do mạng overlay chưa được cấu hình. Hãy cấu hình Flannel để khắc phục trạng thái NotReady của nút chủ Kubernetes. Tạo thư mục để lưu trữ các tệp yaml cho Docker và Kubernetes, ví dụ /home/kubernetes-user/kubernetes/
YAML (Yet Another Markup Language) cung cấp sự tiện lợi hơn khi tạo các pods và deployments trong Kubernetes. Bạn có thể định nghĩa tất cả các tham số của Container cần triển khai trong tệp cấu hình YAML thay vì chạy từng lệnh thủ công trong giao diện Linux. Các tệp YAML cũng được gọi là tệp manifest trong ngữ cảnh của Kubernetes.
Tạo tệp cấu hình yaml với nội dung sau:
Chạy lệnh
# kubectl apply -f ./kube-flannel.yml
Ngoài ra, bạn có thể tìm các ví dụ miễn phí đã chuẩn bị sẵn về các cấu hình triển khai YAML cho Kubernetes trên GitHub.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
Kiểm tra các Nút đã được thêm vào Cụm Kubernetes bạn đang triển khai trên Ubuntu:
# kubectl get nodes
Trạng thái của nút master hiện đã sẵn sàng.

Đảm bảo rằng Flannel đã được thiết lập đúng cách:
# kubectl get pods --all-namespaces

Bạn có thể thấy rằng pod Flannel đang chạy. Pod này bao gồm hai Container – daemon Flannel và initContainer được sử dụng để triển khai cấu hình CNI đến một vị trí có thể đọc được cho Kubernetes.
Đôi khi khi bạn cài đặt Kubernetes trên Ubuntu, có thể xảy ra lỗi sau:
Không thể kết nối đến máy chủ: net/http: TLS handshake timeout.
Làm thế nào để khắc phục sự cố này? Chờ vài giây và thử lại – điều này thường đủ.
Namespaces là các thực thể logic trong cụm Kubernetes, đại diện cho các tài nguyên cụm và có thể được coi là các cụm ảo. Một cụm vật lý có thể được chia logic thành nhiều cụm ảo. Các namespaces Kubernetes mặc định là Mặc định , Kube-công cộng , và Kube-hệ thống . Bạn có thể xem danh sách namespaces:
# kubectl get namespaces
Như bạn nhớ, đơn vị triển khai cơ bản trong Kubernetes là một pod, là một nhóm các Container chia sẻ mạng và namespace mount. Tất cả các Container của pod được lịch trình trên cùng một Nút Kubernetes. Kiểm tra các pods có sẵn:
# kubectl -n kube-system get pods

Nếu bạn muốn đặt lại/dừng cụm, hãy chạy:
# kubeadm reset
Mọi thứ đều ổn trên nút master. Điều này có nghĩa là bây giờ bạn có thể tiếp tục cài đặt Kubernetes trên Ubuntu và chuyển sang thêm các nút worker vào cụm.
Trên nút worker ( docker-nakivo31 , docker-nakivo32 ) chạy lệnh:
# kubeadm join 192.168.101.21:6443 --token d8mbzb.uulxu01jbty8yh4z
--discovery-token-ca-cert-hash sha256:65ace7a4ff6fff795abf086f18d5f0d97da71d4639a0d0a6b93f42bea4948a79
Token và mã băm đã được lưu ý sau khởi tạo cụm với lệnh kubeadm init, như bạn nhớ.
Trên nút master, kiểm tra lại trạng thái của cụm. # kubectl get nodes

Bây giờ bạn có thể thấy một master và hai node worker trong cụm Kubernetes chạy trên máy Ubuntu.
Bạn có thể kiểm tra cấu hình Kubernetes:
# kubectl cluster-info

Triển khai một Pod trong Kubernetes
Bây giờ bạn có thể triển khai một pod với container trong cụm Kubernetes của bạn. Như bạn nhớ, container được bao gồm trong pod trong Kubernetes. Nếu bạn sử dụng các tệp yaml, hãy tạo một thư mục để lưu trữ tệp đó cho thuận tiện hơn. Đi đến thư mục đó và chạy các lệnh như kubectl apply -f test.yaml
Một thư mục như vậy đã được tạo khi cấu hình Flannel – /home/kubernetes-user/kubernetes/
Đã đến lúc triển khai một pod mới. Trước tiên, bạn cần tạo một triển khai. Triển khai là một khái niệm quản lý được sử dụng để cung cấp các cập nhật khai báo cho pods và các bản sao. Bạn có thể tạo triển khai bằng một lệnh duy nhất hoặc bằng cách sử dụng các tệp yaml.
Ví dụ 1 – Triển khai MySQL
Hãy tạo một tệp yaml trong ví dụ này. Tên của tệp là mysql-deployment.yaml
Xem tệp đính kèm để xem cấu hình.
# vim mysql-deployment.yaml
Có hai cách tiếp cận phổ biến để quản lý tài nguyên với kubectl . Sự khác biệt giữa kubectl create và kubectl apply là gì? Khi sử dụng kubectl create , bạn nói với Kubernetes những gì bạn muốn tạo, thay thế hoặc xóa; lệnh này sẽ ghi đè tất cả các thay đổi. Ngoài ra, kubectl apply thực hiện các thay đổi tăng dần và lệnh này có thể được dùng để lưu các thay đổi được áp dụng cho một đối tượng trực tiếp.
Tạo một triển khai:
# kubectl apply -f ./mysql-deployment.yaml

Kubernetes có thể hiển thị thông tin về triển khai của bạn.
# kubectl describe deployment mysql
Kiểm tra pods:
# kubectl get po
hoặc
# kubectl get pods
hoặc
# kubectl get pods -l app=mysql
Nếu bạn thấy trạng thái đang chờ xử lý cho pod, điều đó có thể có nghĩa là không đủ tài nguyên máy tính. Thử thêm một số công suất CPU và bộ nhớ để khắc phục trạng thái chờ xử lý của pod trong Kubernetes.

Bạn có thể xóa dịch vụ nếu cần:
# kubectl delete service <service_name>
Bạn cũng có thể xóa một pod:
# kubectl delete pod mysql-7b9b7999d8-nz5tm
Ví dụ 2 – Triển khai nginx
Hãy triển khai nginx bằng cách sử dụng một phương pháp khác mà không cần tệp yaml.
Tạo một triển khai.
# kubectl create deployment nginx --image=nginx
Kiểm tra rằng triển khai đã được tạo.
# kubectl get deployments
Tạo một dịch vụ.
# kubectl create service nodeport nginx --tcp=80:80
Dịch vụ có thể được tạo bằng cách sử dụng các loại dịch vụ sau – ClusterIP, NodePort, LoadBalance, và ExternalName. Nếu loại NodePort được sử dụng, thì một cổng ngẫu nhiên từ khoảng 30000-32767 được cấp để truy cập các dịch vụ cung cấp. Lưu lượng truy cập gửi đến cổng này sẽ được chuyển tiếp đến dịch vụ cần thiết.
Kiểm tra rằng dịch vụ đã được tạo và đang lắng nghe trên cổng đã xác định.
# kubectl get svc

Ghi nhớ số cổng (31453 trong trường hợp này).
Kiểm tra liệu dịch vụ của bạn đã được triển khai và có sẵn hay chưa (lệnh được thực hiện trên nút chính trong ví dụ này). Sử dụng tên máy chủ của nút và cổng bạn đã ghi nhớ từ bước trước đó.
# curl docker-nakivo31:31453
Bạn cũng có thể kiểm tra rằng dịch vụ có truy cập được trong trình duyệt của bất kỳ nút nào. Trong thanh địa chỉ của trình duyệt web, hãy thử truy cập các trang:
http:// 10.101.235.90
hoặc
http://docker-nakivo31:31453
http://docker-nakivo32:31453
Nếu mọi thứ đều đúng, bạn sẽ thấy trang chào mừng của nginx.

Ngoài ra, cũng có thể truy cập trang thử nghiệm nginx từ bất kỳ máy nào có quyền truy cập vào mạng mà các nút Kubernetes được kết nối—( 192.168.101.0/24 ) trong trường hợp này. Ví dụ, bạn có thể truy cập các trang web bằng trình duyệt của bạn:
http://192.168.101.21:31453/
http://192.168.101.31:31453/
http://192.168.101.32:31453/
Thiết lập Giao diện Web để Giám sát Kubernetes
Việc cài đặt Kubernetes trên Ubuntu gần như hoàn tất, nhưng bạn cũng có thể cài đặt bảng điều khiển Kubernetes để thuận tiện hơn. Bảng điều khiển Kubernetes là một giao diện web để quản lý và giám sát Kubernetes. Để cài đặt bảng điều khiển, hãy tạo tệp kubernetes-dashboard.yaml , tương tự như bạn đã thực hiện trước đây trước khi thực hiện các lệnh.
# kubectl create -f ./kubernetes-dashboard.yaml
# kubectl apply -f ./kubernetes-dashboard.yaml
Kiểm tra các pod.
# kubectl get pods -o wide --all-namespaces
Khởi động proxy tới máy chủ API Kubernetes.
# kubectl proxy

Để nhập các lệnh tiếp theo trong bảng điều khiển, vui lòng mở cửa sổ bảng điều khiển khác. Nếu không, quá trình sẽ bị kết thúc.
Trong trình duyệt web của bạn trên nút chính, hãy truy cập trang:
http://localhost:8001
Bạn có thể thấy trang thử nghiệm.

Nhập địa chỉ đầy đủ trong thanh địa chỉ của trình duyệt web.
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Tạo bảng điều khiển với tài khoản dịch vụ bằng cách thực hiện các lệnh trong cửa sổ bảng điều khiển mới.
# kubectl create serviceaccount dashboard -n default
# kubectl create clusterrolebinding dashboard-admin -n default
--clusterrole=cluster-admin
--serviceaccount=default:dashboard
# kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode
Bây giờ bạn có thể thấy mã token được tạo:

Sao chép mã token được tạo và dán vào phần token của giao diện web để đăng nhập vào bảng điều khiển.

Trên ảnh chụp màn hình bên dưới, bạn có thể thấy giao diện web của bảng điều khiển Kubernetes. Bạn có thể thấy trạng thái của các nút, triển khai, và pod, cũng như kiểm tra vai trò, các lớp lưu trữ, và các thành phần khác. 
Cài Đặt Heapster công cụ giám sát
Cài đặt Heapster để mở rộng các tùy chọn theo dõi cho bảng điều khiển Kubernetes bằng cách thêm bộ xử lý, bộ nhớ và các thông số theo dõi khác. Tạo một tệp khai báo có tên là heapster.yaml .
# vim heapster.yaml
Trong hành động tiếp theo, triển khai Heapster.
# kubectl create -f heapster.yaml
Chỉnh sửa vai trò RBAC (kiểm soát truy cập dựa trên vai trò) của Heapster và thêm quyền truy cập thống kê của các nút.
# kubectl edit clusterrole system:heapster

Kiểm tra các chỉ số đo lường bộ xử lý và bộ nhớ có thể đo lường được trong giao diện.
# kubectl top node

Bây giờ bạn có thể mở giao diện web của Bảng điều khiển Kubernetes và thấy rằng một số phần, bao gồm đồ thị sử dụng bộ xử lý và bộ nhớ, đã được thêm vào.

Cụm Kubernetes của bạn đã được cấu hình và sẵn sàng làm việc.
Triển khai một Cụm Kubernetes Khả Dụng Cao với Nhiều Máy Chủ trên Ubuntu
Có một cụm Kubernetes với một node chính và vài nút công nhân là một lựa chọn tốt, nhưng đôi khi node chính duy nhất có thể thất bại vì lý do như vấn đề phần cứng hoặc mất điện. Để có khả năng chịu lỗi cao hơn của cụm Kubernetes được triển khai trên các nút Ubuntu, tốt hơn nên xem xét triển khai cụm Kubernetes Khả Dụng Cao với nhiều node chính. Sử dụng mô hình triển khai cụm Kubernetes này cho phép bạn tránh được một điểm thất bại duy nhất. Khuyến nghị bạn sử dụng số lượng máy chủ chính là số lẻ, và số lượng tối thiểu node chính có thể cung cấp chịu lỗi là ba. Nếu bạn sử dụng nhiều hơn ba máy chủ chính và số lượng là số chẵn, khả năng chịu lỗi của toàn bộ cụm không tăng. Xem bảng dưới đây để so sánh giá trị khả năng chịu lỗi tùy thuộc vào số lượng node chính trong cụm Kubernetes. Ví dụ, nếu bạn có một cụm với 5 node chính, cụm có thể tồn tại khi 2 node chính gặp sự cố vì ba node chính vẫn đang làm việc (3 trong 5 chiếm hơn 50%, và là đa số). Kích thước cụm đề cập đến số lượng node chính trong cụm.
| Kích thước cụm | Đa số | Khả năng chịu lỗi |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 2 | 1 |
| 4 | 3 | 1 |
| 5 | 3 | 2 |
| 6 | 4 | 2 |
| 7 | 4 | 3 |
| 8 | 5 | 3 |
| 9 | 5 | 4 |
Phần này của bài viết blog hôm nay sẽ hướng dẫn cách cài đặt Kubernetes trên các nút Ubuntu trong bối cảnh triển khai cụm Kubernetes có tính sẵn sàng cao (High Availability), HA Proxy và một số nút làm việc (worker nodes). Trong bảng dưới đây, bạn có thể xem địa chỉ IP, tên máy chủ và vai trò của các máy chủ được sử dụng để cài đặt cụm Kubernetes HA trên các nút Ubuntu trong phòng thí nghiệm thử nghiệm được giải thích trong ví dụ này.
| Số | Vai trò nút | Địa chỉ IP | Tên máy chủ |
| 1 | Master | 192.168.101.21 | docker-nakivo21 |
| 2 | Master | 192.168.101.22 | docker-nakivo22 |
| 3 | Master | 192.168.101.23 | docker-nakivo23 |
| 4 | HA Proxy | 192.168.101.19 | ha-proxy19 |
| 5 | Worker | 192.168.101.31 | docker-nakivo31 |
| 6 | Worker | 192.168.101.32 | docker-nakivo32 |
Một số lệnh giống như khi cài đặt Kubernetes trên Ubuntu theo mô hình một nút chủ. Vì lý do này, các chú thích cho một số lệnh sẽ không được lặp lại. Bạn có thể cuộn lên trên trang này để xem lại phần giải thích các lệnh.
Chuẩn bị tất cả các máy (proxy HA, các nút chủ và các nút worker) để cài đặt Kubernetes bằng cách thực hiện như sau:
- Cấu hình địa chỉ IP tĩnh.
- Đặt tên máy chủ. Tên của tất cả các máy chủ phải được giải quyết thành địa chỉ IP.
- Phải bật quyền truy cập SSH và cấu hình bằng chứng chỉ.
- Phải tắt tính năng swap.
Các bước này phải được thực hiện trước khi bắt đầu cài đặt Docker trên mỗi máy, tương tự như những gì bạn đã đọc trong phần trên khi giải thích về việc cài đặt Kubernetes trên Ubuntu bằng cách sử dụng một nút chính. Sau khi đã chuẩn bị xong tất cả các máy, hãy truy cập ( 192.168.101.19 ).
Cấu hình bộ cân bằng tải HA Proxy
Bộ cân bằng tải HA Proxy được sử dụng để phân phối lưu lượng truy cập vào giữa các nút Kubernetes. Bộ cân bằng tải được triển khai phía trước các nút chủ. Mở giao diện điều khiển của máy ha-proxy19 và thực hiện các hành động dưới đây.
Cài đặt cfssl
Cfssl (Cloud Flare SSL) là một bộ công cụ được sử dụng để tạo ra các chứng chỉ khác nhau bao gồm các chuỗi chứng chỉ TLS/SSL.
Tải xuống các tệp nhị phân từ kho lưu trữ chính thức.
# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
Làm cho các tệp nhị phân đã tải xuống có thể thực thi.
# chmod +x cfssl*
Di chuyển các tệp nhị phân này vào /usr/local/bin/
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
Xác minh việc cài đặt bằng cách kiểm tra phiên bản của cfssl đã cài đặt.
# cfssl version
Cập nhật cây kho lưu trữ.
# apt-get update
Cài đặt HA proxy.
# apt-get install haproxy
Tạo và chỉnh sửa tệp haproxy.cfg .
# vim /etc/haproxy/haproxy.cfg
Thêm các dòng này vào cuối tệp cấu hình này.
frontend kubernetes
bind 192.168.101.19:6443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
server docker-nakivo21 192.168.101.21:6443 check fall 3 rise 2
server docker-nakivo22 192.168.101.22:6443 check fall 3 rise 2
server docker-nakivo23 192.168.101.23:6443 check fall 3 rise 2

Khởi động lại dịch vụ.
# systemctl restart haproxy
Tạo chứng chỉ TSL
Bạn có thể tiếp tục sử dụng bảng điều khiển của máy HA proxy. Tạo tệp cấu hình cho cơ quan chứng nhận, được gọi là ca-config.json .
# vim ca-config.json
Thêm nội dung sau vào tệp cấu hình này:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
Tạo tệp cấu hình yêu cầu ký kết cho cơ quan chứng nhận.
# vim ca-csr.json
Thêm nội dung vào tệp này như được hiển thị dưới đây:
{
“CN”: “Kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “GB”,
“L”: “London”,
“O”: “Kubernetes”,
“OU”: “CA”,
“ST”: “Nakivo”
}
]
}
Ở đâu:
C – quốc gia, ví dụ: GB (Vương quốc Anh).
L – vị trí như thành phố hoặc thị trấn.
O – tổ chức.
OU – đơn vị tổ chức (ví dụ, một phòng ban được xác định là chủ sở hữu khóa).
ST – bang hoặc tỉnh.
Bây giờ, tạo ra và khóa riêng.
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
Xác minh rằng các khóa ca-key.pem và ca.pem đã được tạo.
# ls -al
Tạo chứng chỉ cho cụm Etcd
Etcd hỗ trợ giao tiếp máy chủ với máy chủ/cụm bằng cách sử dụng xác thực qua chứng chỉ khách hàng. Bạn nên có chứng chỉ CA và một cặp khóa đã ký cho một thành viên cụm.
Tạo tệp cấu hình yêu cầu chứng nhận ký kết.
# vim kubernetes-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "GB",
"L": "London",
"O": "Kubernetes",
"OU": "Kubernetes",
"ST": "Nakivo"
}
]
}
Sau đó, tạo chứng nhận và khóa riêng tư.
# cfssl gencert
-ca=ca.pem
-ca-key=ca-key.pem
-config=ca-config.json
-hostname=192.168.101.21,192.168.101.22,192.168.101.23,192.168.101.19,127.0.0.1,kubernetes.default
-profile=kubernetes kubernetes-csr.json |
cfssljson -bare kubernetes

Liệt kê các tệp trong thư mục của bạn để xác minh rằng tệp kubernetes-key.pem và kubernetes.pem đã được tạo.
# ls -al
Sao chép chứng chỉ đã tạo vào mỗi nút. # scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.21:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.22:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.23:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.31:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.32:~
# scp ca.pem kubernetes.pem kubernetes-key.pem kubernetes-user@192.168.101.33:~
Nơi ~ là thư mục chính của người dùng kubernetes trên các máy chủ vật lý Ubuntu.

Chuẩn bị các nút Ubuntu để cài đặt Kubernetes
Chạy các lệnh được hiển thị trong phần này trên tất cả các nút chủ và nút công nhân. Cài đặt Docker, sau đó cài đặt Kubernetes trên các máy Ubuntu sẽ được bao gồm trong cluster Kubernetes. Hãy bắt đầu bằng việc chuẩn bị từ nút chủ 192.168.101.21 .
Cài đặt Docker.
# apt-get install apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# apt-get update
# apt-get install docker-ce
Docker hiện đã được cài đặt. Cubeadm, kublet và cubectl là các thành phần Kubernetes cần thiết để cài đặt Kubernetes trên Ubuntu.
Cài đặt các thành phần Kubernetes – kubeadm, kublet và kubectl.
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
Sau khi bạn đã chuẩn bị tất cả các nút và cài đặt Docker, kubelet, kubeadm và kubectl, bạn phải cài đặt và cấu hình etcd trên các nút chủ.
Cài đặt và cấu hình etcd trên các nút chủ Ubuntu
Etcd là một kho lưu trữ nhất quán và có sẵn cao, được thiết kế để lưu trữ khóa cũng như sao lưu tất cả dữ liệu của cluster. Cluster etcd phải được thiết lập trước khi cấu hình cluster Kubernetes HA với nhiều nút chủ. Hãy bắt đầu từ việc cấu hình nút chủ 192.168.101.21 .
Installing and configuring etcd on the 192.168.101.21 machine.
Tạo một thư mục cấu hình cho etcd.
# mkdir /etc/etcd /var/lib/etcd
Chuyển đến thư mục mà các chứng chỉ đã được sao chép. Đây là thư mục chính của người dùng kubernetes, trong trường hợp này là – /home/kubernetes-user/
Sao chép các chứng chỉ vào thư mục cấu hình ectd.
# cp ca.pem kubernetes.pem kubernetes-key.pem /etc/etcd
Xác minh rằng các tệp đã được sao chép.
# ls -al /etc/etcd
Quay lại thư mục trước đó của bạn
# cd -
Tải xuống các tệp nhị phân etcd từ kho lưu trữ.
# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz
Giải nén gói nén etcd.
# tar xvzf etcd-v3.3.9-linux-amd64.tar.gz
Bây giờ di chuyển các tệp nhị phân etcd đến /usr/local/bin/
# mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/
Tạo một tệp đơn vị etcd systemd.
# vim /etc/systemd/system/etcd.service
Thêm các chuỗi được hiển thị bên dưới vào tệp này.
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.21
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.21:2380
--listen-peer-urls https://192.168.101.21:2380
--listen-client-urls https://192.168.101.21:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.21:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Tải lại cấu hình người quản lý systemd để nhận các cấu hình đã thay đổi từ hệ thống tệp và tái tạo cây phụ thuộc.
# systemctl daemon-reload
Làm cho ectd khởi động khi bật nguồn.
# systemctl enable etcd
Bắt đầu etcd. # systemctl start etcd
Thực hiện các thao tác tương tự trên nút chủ thứ hai ( docker-nakivo22 – Địa chỉ IP 192.168.101.21 và docker-nakivo23 – Địa chỉ IP 192.168.101.22 ). Sự khác biệt duy nhất cần thực hiện trên các nút chủ này là chỉnh sửa tệp cấu hình etcd.service . Xác định các địa chỉ IP chính xác cho mỗi nút chủ khác. Ví dụ, tệp cấu hình etcd.service phải như sau cho nút chủ thứ hai ( Địa chỉ IP 192.168.101.22 ) của phòng thí nghiệm Kubernetes hiện tại.
[Unit]
Description=etcd
Documentation=https://github.com/coreos
[Service]
ExecStart=/usr/local/bin/etcd
--name 192.168.101.22
--cert-file=/etc/etcd/kubernetes.pem
--key-file=/etc/etcd/kubernetes-key.pem
--peer-cert-file=/etc/etcd/kubernetes.pem
--peer-key-file=/etc/etcd/kubernetes-key.pem
--trusted-ca-file=/etc/etcd/ca.pem
--peer-trusted-ca-file=/etc/etcd/ca.pem
--peer-client-cert-auth
--client-cert-auth
--initial-advertise-peer-urls https://192.168.101.22:2380
--listen-peer-urls https://192.168.101.22:2380
--listen-client-urls https://192.168.101.22:2379,http://127.0.0.1:2379
--advertise-client-urls https://192.168.101.22:2379
--initial-cluster-token etcd-cluster-0
--initial-cluster 192.168.101.21=https://192.168.101.21:2380,192.168.101.22=https://192.168.101.22:2380,192.168.101.23=https://192.168.101.23:2380
--initial-cluster-state new
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Khởi tạo các nút chủ trong cụm Kubernetes HA
Bây giờ bạn có thể khởi tạo các nút chủ trong cụm Kubernetes HA của mình đã cài đặt trên các máy Ubuntu.
Khởi tạo nút chủ Địa chỉ IP 192.168.101.21
Trên nút chủ đầu tiên, thực hiện phạm vi hoạt động đã giải thích dưới đây.
Tạo tệp cấu hình yaml cho kubeadm.
# vim config.yaml
Thêm các tham số cấu hình vào tệp này:
apiVersion: kubeadm.k8s.io/v1alpha3
kind: ClusterConfiguration
kubernetesVersion: stable
apiServerCertSANs:
- 192.168.101.19
controlPlaneEndpoint: "192.168.101.19:6443"
etcd:
external:
endpoints:
- https://192.168.101.21:2379
- https://192.168.101.22:2379
- https://192.168.101.23:2379
caFile: /etc/etcd/ca.pem
certFile: /etc/etcd/kubernetes.pem
keyFile: /etc/etcd/kubernetes-key.pem
networking:
podSubnet: 10.244.0.0/16
apiServerExtraArgs:
apiserver-count: "3"
Mạng được xác định là podSubnet (10.244.0.0/16) phải giống với tệp kube-flannel.yml .
Khởi tạo máy Ubuntu làm một nút chủ.
# kubeadm init --config=config.yaml
Đôi khi bạn có thể thấy cảnh báo về một phiên bản cũ của tệp cấu hình:
Tệp cấu hình của bạn sử dụng đặc tả API không còn được phát hành: “kubeadm.k8s.io/v1alpha3”. Vui lòng sử dụng ‘kubeadm config migrate –old-config old.yaml –new-config new.yaml’, lệnh này sẽ ghi đặc tả mới, tương tự bằng cách sử dụng phiên bản API mới hơn.
Cập nhật phiên bản của tệp cấu hình với lệnh:
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

Lỗi khác có thể xảy ra khi bạn khởi tạo một nút trong một cụm Kubernetes đa chủ nếu etcd không chạy:
[ERROR ExternalEtcdVersion]: Get https://192.168.101.21:2379/version: dial tcp 192.168.101.21:2379: kết nối: kết nối bị từ chối

Kiểm tra xem etcd của bạn có đang chạy không. Bạn có thể chạy etcd thủ công:
# systemctl start etcd
Sau khi khởi tạo thành công nút chủ trong cụm Kubernetes chạy trên Ubuntu, bạn nhận được thông báo sau được hiển thị trên ảnh chụp màn hình. 
Kết quả của việc thực thi lệnh này thành công sẽ bao gồm một hướng dẫn về cách bắt đầu sử dụng cluster của bạn cũng như các lệnh chứa token và mã băm chứng chỉ cần thiết để nút join vào cluster. Hãy lưu các chuỗi quan trọng này vì bạn sẽ cần chúng sớm. Chúng được đánh dấu màu vàng trong ảnh chụp màn hình và được nhân đôi dưới đây.
Bây giờ bạn có thể thêm bất kỳ số lượng nút điều khiển nào bằng cách sao chép các chứng chỉ
và các khóa tài khoản dịch vụ trên mỗi nút, sau đó chạy lệnh sau dưới quyền root:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
--experimental-control-plane
Sau đó, bạn có thể thêm bất kỳ số lượng nút công nhân nào bằng cách chạy lệnh sau trên mỗi máy với quyền root:
kubeadm join 192.168.101.19:6443 --token sxm34y.p4rn4328vne0iihf
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
Chạy các lệnh để bắt đầu sử dụng nút đã được khởi tạo trong cluster.
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kiểm tra các nút đã thêm vào cluster.
# kubectl get nodes

Sao chép chứng chỉ đến hai nút chính khác
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.22:~
# scp -r /etc/kubernetes/pki kubernetes-user@192.168.101.23:~
Khởi tạo nút chính 192.168.101.22
Chạy các lệnh trên nút chính thứ hai (192.168.101.22).
Xóa apiserver.crt và apiserver.key nằm trong thư mục chính (~) của người dùng kubernetes .
$ rm ~/pki/apiserver.*
Di chuyển các chứng chỉ lưu trữ trong thư mục chính đến thư mục /etc/kubernetes/.
$ sudo mv ~/pki /etc/kubernetes/
Tạo tệp cấu hình yaml cho kubeadm.
# vim config.yaml
Nội dung của tệp yaml này giống như tệp cho nút chính đầu tiên ( 192.168.101.21 ). Xem cấu hình khởi tạo của nút chính đầu tiên ở trên. Bạn có thể sao chép tệp đã tạo sẵn được sử dụng trên nút chính đầu tiên của cluster Kubernetes HA được cài đặt trên máy Ubuntu của bạn.
Khởi tạo nút chính thứ hai.
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml
# kubeadm init --config=config1.yaml
Kết quả giống như kết quả xuất hiện sau khi khởi tạo nút chính đầu tiên trong cluster Kubernetes HA:

Tương tự, thực hiện các lệnh để bắt đầu sử dụng nút đã được khởi tạo trong cluster.
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kiểm tra các nút đã thêm vào cluster.
# kubectl get nodes

Hai nút chính trong số ba nút đã được thêm vào cluster. Một nút chính còn lại cần được thêm vào.
Khởi tạo nút chính thứ ba (192.168.101.23)
Lặp lại các bước giống như bạn đã làm để khởi tạo nút thứ hai (192.168.101.22) trong cluster. Đừng quên ghi chú các lệnh với token và hash để thêm nút vào cluster được hiển thị sau khi khởi tạo nút master.
Kiểm tra để đảm bảo tất cả ba nút master đã được thêm thành công vào cluster.
# kubectl get nodes
Cài đặt Flannel để khắc phục trạng thái Không Sẵn Sàng của các nút master trong Kubernetes
Hãy cài đặt Flannel. Không giống như ví dụ đầu tiên nơi bạn học cách cài đặt Kubernetes trên Ubuntu để tạo một cluster master đơn, trong ví dụ này, Flannel sẽ được cài đặt bằng cách sử dụng tệp yaml.
Chạy lệnh để cài đặt Flannel và sửa trạng thái Không Sẵn Sàng của các nút đang được hiển thị, vì chưa có mạng phủ nào được cấu hình. Tạo tệp kube-flannel.yaml bằng trình soạn thảo văn bản vim, ví dụ, trên nút master đầu tiên.
# kubectl apply -f kube-flannel.yml
Ghi nhớ địa chỉ của podSubnet được định nghĩa trong tệp config.yaml . Địa chỉ mạng phải giống nhau trong tệp kube-flannel.yaml .
Kiểm tra các nút của bạn và trạng thái của chúng.
# kubectl get nodes

Bây giờ tất cả các nút master hoạt động bình thường.
Thêm nút công nhân vào cluster
Khi bạn đã khởi tạo tất cả các nút master, bạn có thể thêm các nút công nhân vào cluster Kubernetes của mình. Hãy thêm nút công nhân đầu tiên ( 192.168.101.31 ) vào cluster Kubernetes HA được triển khai trên máy Ubuntu. Sử dụng lệnh đã được hiển thị sau khi khởi tạo nút master (lệnh chứa token và hash) để làm nút công nhân gia nhập vào cluster. Chạy lệnh trên máy 192.168.101.31 .
# kubeadm join 192.168.101.19:6443 --token kxl1gf.6ddalutd60n0ez45
--discovery-token-ca-cert-hash sha256:bf3887f1565fcd48ff696da98a761ac1b70c6d38ba0ba3e4b1bf573000a302ca
Kiểm tra các nút của cluster Kubernetes HA để đảm bảo rằng nút công nhân đã được thêm vào. Bạn cũng có thể thấy máy proxy HA trong danh sách các nút bây giờ.
# kubectl get nodes

Tương tự, thêm các nút công nhân khác vào cluster Kubernetes Tính sẵn sàng Cao được cài đặt trên các máy Ubuntu. Bạn có thể thêm nhiều nút công nhân bất cứ lúc nào tùy theo nhu cầu của bạn. Đến đây, hướng dẫn của hôm nay đã kết thúc.
Kết luận
Cài đặt Kubernetes trên Ubuntu không khó như thoạt nhìn. Bạn cần dành một chút nỗ lực để triển khai cluster Kubernetes, nhưng kết quả là bạn nhận được nhiều lợi thế như quản lý dễ dàng hơn, khả năng mở rộng cao, và cân bằng tải. Kiểu triển khai Kubernetes đơn giản nhất là triển khai một master — bạn nên cài đặt Kubernetes trên các nút Ubuntu bao gồm cả nút master và nút công nhân. Nếu bạn cần một cơ sở hạ tầng đáng tin cậy hơn để chạy các ứng dụng được đóng gói trong container, hãy cân nhắc triển khai Kubernetes đa máy chủ (multi-master), còn được gọi là cụm Kubernetes có tính sẵn sàng cao (High Availability). Loại triển khai Kubernetes này loại bỏ điểm lỗi duy nhất, và cụm của bạn vẫn có thể hoạt động bình thường ngay cả khi một số nút máy chủ gặp sự cố.
Đối với cả hai loại triển khai này, bạn phải cấu hình quyền truy cập SSH, thiết lập địa chỉ IP tĩnh và tên máy chủ, cài đặt Docker, vô hiệu hóa việc sử dụng phân vùng swap, và cuối cùng là cài đặt các thành phần Kubernetes như kubeadm, kubectl, kubelet, đồng thời cấu hình Flannel cho mạng overlay. Trong trường hợp triển khai cụm Kubernetes HA, bạn cũng cần cấu hình HA Proxy trên một máy độc lập, tạo chứng chỉ và cấu hình cụm etcd. Hầu hết các giai đoạn cấu hình Kubernetes, tạo các deployment cũng như chạy các pod đều có thể thực hiện bằng hai phương pháp: chạy thủ công các lệnh được cung cấp bởi giao diện dòng lệnh và sử dụng các tệp cấu hình YAML. Việc sử dụng các tệp YAML cho phép bạn tạo ra cấu trúc phức tạp hơn và giúp quá trình quản trị trở nên thuận tiện hơn.
Bạn có thể cài đặt Kubernetes trên Ubuntu, chạy trên cả máy vật lý và máy ảo. Nếu Kubernetes của bạn được cài đặt trên các máy ảo chạy trong vSphere, bạn có thể thực hiện các biện pháp bảo vệ bổ sung bằng cách sử dụng Cụm VMware có tính sẵn sàng cao cùng với tính năng Fault Tolerance. Các nguyên tắc triển khai Kubernetes được đề cập trong bài viết này cũng có thể được áp dụng để cài đặt Kubernetes trên các bản phân phối Linux khác.