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ể tốn rất nhiều thời gian, khiến lịch trình 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 đá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) để triển khai container trong môi trường phân tán dễ dàng hơn cũng như cung cấp 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 nút chủ (master nodes) và các nút làm việc (worker nodes). Cấu hình phần cứng phụ thuộc vào nhu cầu của bạn và các ứng dụng mà bạn dự định chạy trong các container Docker. Các 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ý trung tâm) x86/x64 2 nhân
- 2 GB RAM (Bộ nhớ truy cập ngẫu nhiên) trở lên
- Kết nối Internet
Các cổng phải được mở để cài đặt Kubernetes trên Ubuntu:
| Giao thức & phạm vi cổng | Nguồn | Mục đích | Hướng |
| TCP 443 | Các nút công nhân, người dùng cuối, yêu cầu API | Máy chủ API Kubernetes | Cổng vào của nút chính |
| TCP 10250 | Các nút chính | Cổng kiểm tra tình trạng Kubelet của nút công nhân | Cổng vào của nút công nhân |
| 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 dịch vụ bên ngoài | |
| UDP 8285 | Nút làm việc | Hậu trường UDP của mạng phủ Flannel | |
| UDP 8472 | Nút làm việc | Hậu trường VXLAN của mạng phủ Flannel | |
| TCP 179 | Nút làm việc | Chỉ cần thiết nếu sử dụng mạng Calico BGP | |
| TCP 2379-2380 | Các nút chính | API khách hàng máy chủ etcd | Cổng vào nút etcd |
| TCP 2379-2380 | Các nút công nhân | API khách hàng máy chủ etcd bắt buộc 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ó quy tắc chặn nào được thiết lập sẵn. 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 mình lên đầu tiên, 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.
Việc 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 sẽ hướng dẫn cài đặt Kubernetes trên Ubuntu 18.04 LTS đang chạy trên các máy ảo VMware. Loại triển khai Kubernetes đầu tiên được giới thiệu là sử dụng một nút chủ (master node) và hai nút làm việc (worker nodes) cho cụm Kubernetes. Vui lòng tham khảo bảng dưới đây để xem số lượng nút theo từng trường hợp, vai trò của các nút, tên máy chủ và địa chỉ IP của các máy được sử dụng 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 | Worker | 192.168.101.31 | docker-nakivo31 |
| 3 | Worker | 192.168.101.32 | docker-nakivo32 |
Bạn có thể sử dụng các máy ảo chạy trên các máy chủ ESXi nếu bạn sử dụng VMware vSphere, hoặc bạn có thể chạy các máy ảo trên VMware Workstation được cài đặt trên máy tính cá nhân chạy Linux hoặc Windows. Trong ví dụ hôm nay, chúng tôi đang sử dụng các máy ảo chạy trên VMware Workstation. Các máy ảo sử dụng NAT mạng với quyền truy cập Internet, và nếu bạn thích VirtualBox hơ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
Người dùng Linux này tồn tại trên tất cả các máy Ubuntu: kubernetes-user
Cấu hình VM: 2 CPU, 4 GB RAM, đĩa ảo 20 GB
Bạn có thể thay đổi địa chỉ IP của VMnet8 bằng cách truy cập Edit > Virtual Network Editor trong VMware Workstation.
Để dễ hiểu hơn, tất cả các thành phần sẽ được cài đặt trên Linux theo cách thủ công mà không sử dụng các công cụ tự động hóa như Ansible trong ví dụ hôm nay.
Triển khai máy ảo Ubuntu
Tạo một máy ảo mới có tên là docker-nakivo21 .
Cài đặt Ubuntu 64-bit trên máy đầu tiên và thiết lập tên máy chủ và tên người dùng.
Tên máy ảo: docker-nakivo21
Tên người dùng: kubernetes-user

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

Bạn có thể thấy rằng địa chỉ IP được lấy tự động qua DHCP. Hãy ghi 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 soạn thảo văn bản để chỉnh sửa các tệp cấu hình. Cài đặt vim làm trình soạn thảo văn bản.
$ sudo apt-get install vim
Trong 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 yaml. Mở tệp cấu hình mạng yaml trong vim.
$ sudo vim /etc/netplan/01-network-manager-all.yaml
Giao diện mặc định của tệp cấu hình là:

Chỉnh sửa tệp cấu hình mạng này như được hiển thị bên dưới:
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 chưa 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 còn nhớ, tên máy chủ cho máy ảo đầ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ủ, hãy thực hiện như sau (điều này sẽ cần thiết để cấu hình máy ảo thứ hai và thứ ba sau khi nhân bản. Hai máy ảo này được dự định cấu hình làm các nút công việc):
Ví dụ: nếu bạn cần thay đổi tên máy chủ thành docker-nakivo21 trên máy ảo đầu tiên, hãy chạy: $ sudo hostnamectl set-hostname docker-nakivo21
Kiểm tra xem tên máy chủ mới đã được áp dụng chưa.
$ less /etc/hostname
Chỉnh sửa tệp hosts tại .
$ sudo vim /etc/hosts
Nội dung của tệp hosts phải trông 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 hóa tệp swap
Việc sử dụng tệp swap (phân vùng swap) không được Kubernetes hỗ trợ và việc vô hiệu hóa swappiness là cần thiết để cài đặt Kubernetes trên Ubuntu thành công.
Vô hiệu hóa tệp swap để ngăn kubelet sử dụng CPU cao.
$ sudo swapoff -a
Chỉnh sửa /etc/fstab và bình luận dòng đó bằng cách sử dụng ký tự # .
$ sudo vim /etc/fstab
#/swapfile none swap sw 0 0

Bạn có thể thực hiện tương tự với sed chỉ với một lệnh duy nhất:
$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
Vô hiệu hóa swap trong sysctl.conf
$ sudo echo "vm.swappiness=0" | sudo tee --append /etc/sysctl.conf
Trong đó 0 là tỷ lệ swapiness. Trong trường hợp này, swap chỉ được sử dụng khi hết RAM (theo mặc định, swap được sử dụng khi hơn 60% RAM đã đầy).
Áp dụng các thay đổi cấu hình mà không cần khởi động lại.
$ sudo sysctl -p
Lưu ý : Nếu phân vùng swap không bị 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 CPU trên máy của bạn, khiến các ứng dụng không phản hồi và hệ thống bị 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 swap bởi một quá trình hệ thống của nhân Linux. Vì những lý do khó hiểu, đôi khi sự cố xảy ra và một vòng lặp vô tận tiêu tốn hết tài nguyên CPU xuất hiện. Trong ảnh chụp màn hình bên dưới, bạn có thể thấy mức tiêu thụ CPU cao của quá trình kswapd0 khi Kubernetes được cài đặt trên Ubuntu. Giá trị tải trung bình (load average) quá cao.

Nếu kswapd0 vẫn làm quá tải CPU của bạn, hãy chạy lệnh sau để xóa tất cả bộ nhớ đệm và dừng kswapd0 (thực thi với quyền root).
# echo 1 > /proc/sys/vm/drop_caches
Tắt máy ảo.
$ init 0
Máy ảo được cấu hình một phần này ( docker-nakivo21 ) sắp được sử dụng làm nút chính. Tạo hai máy để sử dụng làm nút làm việc. Nếu bạn sử dụng máy vật lý, hãy lặp lại các bước trước đó theo cách 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ì trong ví dụ hiện tại sử dụng máy ảo, bạn có thể sao chép chúng để tiết kiệm thời gian 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 sẵn. Bạn có thể tìm hiểu thêm về chủ đề này bằng cách đọc bài viết 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 máy ảo (VM) 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 máy ảo đầu tiên và sao chép thủ công các tệp máy ảo. Trong trường hợp này, các tệp được sao chép từ thư mục docker-nakivo21 sang thư mục docker-nakivo31. Các thư mục này phải được tạo thủ công trước khi sao chép các tệp máy ảo.

Chỉnh sửa tệp VMX, vì tên máy ảo 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"

Máy ảo sẽ được sử dụng làm nút làm việc đầu tiên hiện đã được tạo. Sao chép máy ảo đầu tiên một lần nữa để chuẩn bị nút làm việc thứ hai của cụm Kubernetes.
Chỉnh sửa tệp VMX cho máy ảo thứ ba (nút làm việc thứ hai), giống 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 máy ảo trong VMware Workstation (File> Open và chọn tệp VMX của máy ảo), hoặc chỉ cần nhấp đúp vào tệp VMX của máy ảo. Bật nguồn ba máy ảo (máy ảo nguồn của bạn và hai bản sao máy ảo). Nhấp vào I Copied It , khi được yêu cầu.
Lưu ý : Nếu bạn sử dụng máy ảo, hãy chỉnh sửa địa chỉ IP và tên máy chủ trên mỗi bản sao VM sau khi các máy ảo đã được sao chép. Nếu bạn sử dụng máy vật lý, hãy thực hiện 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 các máy ảo
Thay đổi địa chỉ IP và tên máy chủ trên docker-nakivo31 và docker-nakivo32 các máy ảo (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 làm việc.
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 tệp 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

Kiểm tra kết nối bằng cách ping các máy chủ khác từ mỗi máy để đảm bảo 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ủ (VM)
Cấu hình quyền truy cập SSH trên tất cả các máy chủ. Cài đặt máy chủ OpenSSH bằng cách thực thi các lệnh trên từng máy.
$ sudo apt-get install openssh-server
Truy cập thư mục chính của kubernetes-user và tạo cặp khóa SSH (một bộ khóa mật mã bao gồm khóa riêng và khóa công khai). Cặp khóa SSH có thể được sử dụng để truy cập bảng điều khiển Linux từ xa 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áy mà bạn cần kết nối từ xa, trong khi khóa riêng tư là thông tin cực kỳ 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 các khóa sang 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 các khóa.
Thử kết nối với máy thứ hai ( docker-nakivo31 ) với tư cách là kubernetes-user (đó 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 vớ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 từ xa trong dấu nhắc lệnh của bảng điều khiển sau khi 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?
Vì 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 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 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 máy chủ SSH.
# /etc/init.d/ssh stop
# /etc/init.d/ssh start
Đặt mật khẩu root (mật khẩu 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 trữ trong thư mục home của người dùng thông thường vì lệnh trước đó đượ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 trong thư mục home của người dùng root, hãy 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 thao tác 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 hãy 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
Cho phép khóa công khai.
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
Kiểm tra xem bạn có thể đăng nhập với tư cách root qua SSH trên máy cục bộ hay không. $ sudo ssh root@127.0.0.1
Hãy thử kết nối từ/đến máy từ xa 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
Lưu ý : Việc kết nối với tư cách người dùng root có thể không an toàn. Không nên kết nối với tư cách root nếu không cần thiết—tốt hơn là nên kết nối qua SSH với tư cách người dùng thô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. Hãy cài đặt Docker trên tất cả các máy. Thực thi các lệnh được hiển thị bên dưới trên docker-nakivo21 , docker-nakivo31 , docker-nakivo32 .
Tuy nhiên, không cần phải vội vàng. Để bắt đầu, bạn có thể đơn giản cài đặt Docker bằ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. Hãy khắc phục điều đó bằng cách cài đặt phiên bản Docker mới nhất.
Đầu tiên, hãy cài đặt các gói phần mềm cần thiết.
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Curl là một công cụ nhỏ gọn đa năng được thiết kế để truyền dữ liệu từ/đến một máy chủ 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 -
Kết quả hiển thị trên console 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 thủ công bằng lệnh trước đó.
$ sudo apt-get update
Kiểm tra phiên bản 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 Docker sau khi cài đặt.
$ docker --version
Trong trường hợp này, kết quả hiển thị là: Docker version 18.09.6, build 481bc77 .
Khởi động Docker và thiết lập để daemon của nó tự động khởi động khi hệ thống khởi động.
$ sudo systemctl start docker
$ sudo systemctl enable docker
Sau khi đã cài đặt Docker trên tất cả các máy, bạn có thể chuyể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 cụm
Bây giờ, không có gì cản trở bạn cài đặt các thành phần chính của Kubernetes.
Chạy các lệnh với quyền root trên tất cả các máy sẽ được đưa vào cụm 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ác kho gói có sẵn cho trình quản lý gói apt của bạn.
# cat <
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
Ngoài ra, bạn có thể thêm kho lưu trữ bằng 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 dữ liệu từ đầ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 để đảm bảo Kubernetes được 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 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 ) 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à yêu cầu của trình điều khiển Flannel. CIDR (Classless Inter-Domain Routing) xác định địa chỉ 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 quảng bá làm máy chủ API của nó.

Đọ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 đã chạy 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. 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) mang lại sự tiện lợi hơn khi tạo pod và deployment 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ì phải chạy từng lệnh thủ công trên giao diện dòng lệnh Linux. Các tệp YAML còn được gọi là tệp manifest trong bối cảnh 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í đã được chuẩn bị sẵn về 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 node đã được thêm vào cụm Kubernetes mà bạn đang triển khai trên Ubuntu:
# kubectl get nodes
Trạng thái của node master hiện tại là Ready.

Đả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 pod Flannel đang chạy. Pod này bao gồm hai container – daemon Flannel và initContainer dùng để triển khai cấu hình CNI đến vị trí có thể đọc được bởi Kubernetes.
Đôi khi khi cài đặt Kubernetes trên Ubuntu, lỗi sau có thể xảy ra:
Không thể kết nối với máy chủ: net/http: TLS handshake timeout.
Làm thế nào để khắc phục vấn đề này? Hãy đợi vài giây và thử lại — điều này thường là đủ.
Namespaces là các thực thể logic trong cụm Kubernetes đại diện cho các tài nguyên của 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 namespace mặc định của Kubernetes là Default , Kube-public , và Kube-system . Bạn có thể lấy danh sách các namespace:
# kubectl get namespaces
Như bạn đã biết, đơn vị triển khai cơ bản trong Kubernetes là pod, một tập hợp các container chia sẻ mạng và namespace mount. Tất cả các container trong pod đều được lên lịch trên cùng một node Kubernetes. Kiểm tra các pod hiện có:
# kubectl -n kube-system get pods

Nếu bạn muốn khởi động lại/dừng cụm, hãy chạy:
# kubeadm reset
Mọi thứ đều ổn trên node 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 các nút worker ( docker-nakivo31 , docker-nakivo32 ) hãy chạy lệnh:
# kubeadm join 192.168.101.21:6443 --token d8mbzb.uulxu01jbty8yh4z
--discovery-token-ca-cert-hash sha256:65ace7a4ff6fff795abf086f18d5f0d97da71d4639a0d0a6b93f42bea4948a79
Như bạn có thể nhớ, mã thông báo và hàm băm đã được ghi lại sau khi khởi tạo cụm bằng lệnh kubeadm init .
Trên nút chủ, hãy kiểm tra lại trạng thái cụm. # kubectl get nodes

Bây giờ bạn có thể thấy một nút chủ và hai nút công việc trong cụm Kubernetes đang chạy trên các máy Ubuntu.
Bạn có thể kiểm tra cấu hình Kubernetes:
# kubectl cluster-info

Triển khai Pod trong Kubernetes
Bây giờ bạn có thể triển khai một pod cùng với các container trong cụm Kubernetes của mình. Như bạn đã biết, các container được bao gồm trong các 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ữ các tệp đó cho thuận tiện hơn. Truy cập vào thư mục đó và chạy các lệnh như kubectl apply -f test.yaml
Thư mục này đã được tạo sẵn khi cấu hình Flannel – /home/kubernetes-user/kubernetes/
Đã đến lúc triển khai một pod mới. Đầu tiên, bạn cần tạo một deployment. Deployment là khái niệm điều khiển được sử dụng để cung cấp các cập nhật theo kiểu khai báo cho pods và replica sets. Bạn có thể tạo deployment 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 tệp là mysql-deployment.yaml
Xem tệp đính kèm để xem cấu hình.
# vim mysql-deployment.yaml
Có hai phương pháp 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 thông báo cho Kubernetes biết bạn muốn tạo, thay thế hoặc xóa gì; lệnh này sẽ ghi đè lên tất cả các thay đổi. Ngoài ra, kubectl apply thực hiện các thay đổi theo từng bước và lệnh này có thể được sử dụng để lưu các thay đổi đã áp dụng cho một đối tượng đang hoạt động.
Tạo một deployment:
# kubectl apply -f ./mysql-deployment.yaml

Kubernetes có thể hiển thị thông tin về deployment 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 pending cho pod, điều đó có thể có nghĩa là không có đủ tài nguyên tính toán. Hãy thử thêm một số dung lượng CPU và bộ nhớ để khắc phục trạng thái đang chờ xử lý của pod trong Kubernetes.

Bạn có thể xóa dịch vụ nếu cần:
# kubectl delete service
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 xem triển khai đã được tạo chưa.
# kubectl get deployments
Tạo một dịch vụ.
# kubectl create service nodeport nginx --tcp=80:80
Có thể tạo dịch vụ bằng cách sử dụng các loại dịch vụ sau – ClusterIP, NodePort, LoadBalance và ExternalName. Nếu sử dụng loại NodePort, thì một cổng ngẫu nhiên trong phạm vi 30000-32767 sẽ được phân bổ để truy cập các dịch vụ được cung cấp. Lưu lượng được gửi đến cổng này sẽ được chuyển tiếp đến dịch vụ tương ứng.
Kiểm tra xem dịch vụ đã được tạo và đang lắng nghe trên cổng đã định nghĩa hay chưa.
# kubectl get svc

Ghi nhớ số cổng (trong trường hợp này là 31453).
Kiểm tra xem dịch vụ của bạn đã được triển khai và có sẵn hay chưa (lệnh này được thực thi trên nút master trong ví dụ này). Sử dụng tên máy chủ của nút và cổng mà bạn đã ghi nhớ từ bước trước.
# curl docker-nakivo31:31453
Bạn cũng có thể kiểm tra xem dịch vụ có thể 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 ổn, bạn sẽ thấy trang chào mừng của nginx.

Bạn 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 mình:
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à 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 , giống như bạn đã làm trước đó trước khi thực thi các lệnh.
# kubectl create -f ./kubernetes-dashboard.yaml
# kubectl apply -f ./kubernetes-dashboard.yaml
Kiểm tra pod.
# kubectl get pods -o wide --all-namespaces
Khởi động proxy đến máy chủ API Kubernetes.
# kubectl proxy

Để nhập các lệnh tiếp theo vào bảng điều khiển, vui lòng mở một 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 trên nút chủ, truy cập trang:
http://localhost:8001
Bạn có thể thấy trang thử nghiệm.

Nhập địa chỉ đầy đủ vào 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 bằng tài khoản dịch vụ bằng cách thực thi các lệnh trong cửa sổ console 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ể xem token đã tạo:

Sao chép token đã 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.

Trong ả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ể xem trạng thái của các nút, triển khai và pod, cũng như kiểm tra vai trò, 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 giám sát cho bảng điều khiển Kubernetes bằng cách thêm các thông số giám sát về CPU, bộ nhớ và các thông số khác. Tạo tệp manifest có tên là heapster.yaml .
# vim heapster.yaml
Trong bước 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 vào thống kê của các nút.
# kubectl edit clusterrole system:heapster

Kiểm tra xem các chỉ số CPU và bộ nhớ có thể được đo lường trong bảng điều khiển hay không.
# 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 biểu đồ sử dụng CPU và bộ nhớ, đã được thêm vào.

Cụm Kubernetes của bạn hiện đã được cấu hình và sẵn sàng hoạt động.
Triển khai cụm Kubernetes có tính sẵn sàng cao với nhiều nút chủ trên Ubuntu
Việc có một cụm Kubernetes với một nút chủ và một vài nút làm việc là một lựa chọn tốt, nhưng đôi khi nút chủ duy nhất có thể gặp sự cố do các nguyên nhân như vấn đề phần cứng hoặc mất điện. Để tăng khả năng chịu lỗi cho cụm Kubernetes được triển khai trên các nút Ubuntu, tốt hơn hết là nên xem xét triển khai cụm Kubernetes có tính sẵn sàng cao với nhiều nút chủ. Việc sử dụng mô hình triển khai cụm Kubernetes này giúp bạn tránh được điểm lỗi duy nhất. Nên sử dụng số lượng nút chủ là số lẻ, và số lượng nút chủ tối thiểu để đảm bảo khả năng chịu lỗi là ba. Nếu sử dụng hơn ba nút chủ và số lượng nút là số chẵn, khả năng chịu lỗi của toàn bộ cụm sẽ không tăng lên. 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 nút chủ trong cụm Kubernetes. Ví dụ, nếu bạn có một cụm với 5 nút chủ, cụm có thể tồn tại sau khi 2 nút chủ bị lỗi vì vẫn còn 3 nút chủ hoạt động (3 trên 5 là hơn 50%, và chiếm đa số). Kích thước cụm đề cập đến số lượng nút 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 (HA), HA Proxy và một số nút làm việc. 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 bằng mô hình một nút chủ. Vì lý do này, các chú thích cho một số lệnh không được lặp lại. Bạn có thể cuộn lên trên trang này để xem lại giải thích về 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 công nhân) để 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 kích hoạt và cấu hình truy cập SSH bằng chứng chỉ.
- Phải tắt 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, rất giống với 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ủ. 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 trước các nút chủ. Mở giao diện dòng lệnh của máy chủ ha-proxy19 và thực hiện các thao tác như 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 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
Đặt quyền thực thi cho các tệp nhị phân đã tải xuống.
# chmod +x cfssl*
Di chuyển các tệp nhị phân này đến /usr/local/bin/
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
Kiểm tra cài đặt bằng cách xem 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.
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 giao diện điều khiển của máy HA proxy. Tạo tệp cấu hình cơ quan cấp chứng chỉ, có tên 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ý chứng chỉ của cơ quan cấp chứng chỉ.
# vim ca-csr.json
Thêm nội dung vào tệp này như sau:
{
“CN”: “Kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “GB”,
“L”: “London”,
“O”: “Kubernetes”,
“OU”: “CA”,
“ST”: “Nakivo”
}
]
}
Trong đó:
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 bộ phận được định nghĩa là chủ sở hữu khóa).
ST – tiểu bang hoặc tỉnh.
Bây giờ, hãy tạo khóa công khai 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 giữa máy chủ với máy chủ/cụm bằng cách sử dụng xác thực thông qua chứng chỉ khách hàng. Bạn cần có chứng chỉ CA và 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 ký chứng chỉ.
# 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 chỉ và khóa riêng.
# 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 các tệp kubernetes-key.pem và kubernetes.pem đã được tạo.
# ls -al
Sao chép chứng chỉ đã tạo vào từng 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:~
Trong đó ~ là thư mục chính của kubernetes-user trên các máy chủ Ubuntu.

Chuẩn bị các nút Ubuntu để cài đặt Kubernetes
Chạy các lệnh được trình bày trong phần này trên tất cả các nút chủ và nút công việc. Cài đặt Docker, sau đó cài đặt Kubernetes trên các máy Ubuntu sẽ được đưa vào cụm Kubernetes. Hãy bắt đầu từ việc chuẩn bị 192.168.101.21 nút chủ.
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, kubelet 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 đã 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ó tính sẵn sàng cao, được thiết kế để lưu trữ các khóa cũng như sao lưu toàn bộ dữ liệu cụm. Cụm etcd phải được thiết lập trước khi cấu hình cụm 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 vào. Đây là thư mục chính của người dùng kubernetes, trong trường hợp này – /home/kubernetes-user/
Sao chép các chứng chỉ vào thư mục cấu hình etcd.
# cp ca.pem kubernetes.pem kubernetes-key.pem /etc/etcd
Kiểm tra xem các tệp đã được sao chép chưa.
# ls -al /etc/etcd
Quay lại thư mục trước đó
# 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 tệp lưu trữ 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 tệp đơn vị systemd cho etcd.
# 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 trình quản lý systemd để lấy 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
Đảm bảo etcd khởi động khi hệ thống khởi động.
# systemctl enable etcd
Khởi động 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 – 192.168.101.21 và docker-nakivo23 – 192.168.101.22 ). Sự khác biệt duy nhất trong các thao tác cần thực hiện cho các nút chủ này là chỉnh sửa tệp cấu hình etcd.service . Định nghĩa các địa chỉ IP chính xác cho từng nút chủ khác. Ví dụ, tệp cấu hình etcd.service phải được thiết lập như sau cho nút chủ thứ hai ( 192.168.101.22 ) của môi trườ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 cài đặt trên các máy Ubuntu.
Khởi tạo nút chủ 192.168.101.21
Trên nút chủ đầu tiên, thực hiện các thao tác được 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 định nghĩa là podSubnet (10.244.0.0/16) phải giống như trong tệp kube-flannel.yml .
Khởi tạo máy Ubuntu làm nút chính.
# kubeadm init --config=config.yaml
Đôi khi bạn có thể thấy cảnh báo về 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 thông số kỹ thuật API đã bị loại bỏ: “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ẽ tạo tệp cấu hình mới với định dạng tương tự nhưng sử dụng phiên bản API mới hơn.
Cập nhật phiên bản tệp cấu hình bằng lệnh:
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml

Một lỗi khác có thể xảy ra khi khởi tạo nút trong cụm Kubernetes đa chủ nếu etcd không chạy:
[ERROR ExternalEtcdVersion]: Truy cập https://192.168.101.21:2379/version: dial tcp 192.168.101.21:2379: connect: connection refused

Kiểm tra xem etcd của bạn có đang chạy không. Bạn có thể chạy etcd theo cách 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 sẽ nhận được thông báo sau như hiển thị trên ảnh chụp màn hình. 
Kết quả sau khi thực thi thành công lệnh này sẽ hiển thị một hướng dẫn về cách bắt đầu sử dụng cụm của bạn, cùng với các lệnh chứa mã thông báo (token) và băm chứng chỉ (certificate hash) cần thiết để kết nối các nút vào cụm. Hãy lưu lại các chuỗi ký tự quan trọng này vì bạn sẽ cần đến chúng trong thời gian tới. Chúng được đánh dấu bằng màu vàng trên ảnh chụp màn hình và được sao chép lại bên dưới.
Bây giờ bạn có thể kết nối bất kỳ số lượng nút control-plane nào bằng cách sao chép các cơ quan chứng chỉ
và khóa tài khoản dịch vụ trên mỗi nút, sau đó chạy lệnh sau vớ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ể kết nối bất kỳ số lượng nút worker nào bằng cách chạy lệnh sau trên mỗi nút 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 cụm.
# 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 đã được thêm vào cụm.
# kubectl get nodes

Sao chép các chứng chỉ vào hai nút chủ còn lại
# 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ủ 192.168.101.22
Chạy các lệnh trên nút chủ thứ hai (192.168.101.22).
Xóa các tệp apiserver.crt và apiserver.key nằm trong thư mục home (~) của người dùng kubernetes-user .
$ rm ~/pki/apiserver.*
Di chuyển các chứng chỉ được lưu trữ trong thư mục home vào 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ư của nút chủ đầu tiên ( 192.168.101.21 ). Xem cấu hình để khởi tạo nút chủ đầu tiên ở trên. Bạn có thể sao chép tệp đã được tạo sẵn được sử dụng trên nút master đầu tiên của cụm Kubernetes HA được cài đặt trên các máy Ubuntu của bạn.
Khởi tạo nút master thứ hai.
# kubeadm config migrate --old-config config.yaml --new-config config1.yaml
# kubeadm init --config=config1.yaml
Kết quả hiển thị giống như kết quả được hiển thị sau khi khởi tạo nút master đầu tiên trong cụm Kubernetes HA:

Tương tự, thực thi các lệnh để bắt đầu sử dụng nút đã được khởi tạo trong cụm.
# 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 đã được thêm vào cụm.
# kubectl get nodes

Hai trong số ba nút chủ đã được thêm vào cụm. Còn lại một nút chủ cần được thêm vào.
Khởi tạo nút chủ thứ ba (192.168.101.23)
Lặp lại các bước tương tự như bạn đã thực hiện để khởi tạo nút thứ hai (192.168.101.22) trong cụm. kubectl get nodes Đừng quên ghi lại các lệnh kèm theo token và mã băm để thêm các nút vào cụm, được hiển thị sau khi khởi tạo nút chủ.
Kiểm tra xem cả ba nút chủ đã được thêm thành công vào cụm hay chưa.
#
Cài đặt Flannel để khắc phục trạng thái NotReady của các nút chủ trong Kubernetes
Hãy cài đặt Flannel. Khác với ví dụ đầu tiên nơi bạn đã học cách cài đặt Kubernetes trên Ubuntu để tạo cụm có một nút chính, trong ví dụ này Flannel sẽ được cài đặt thông qua tệp YAML.
Chạy lệnh để cài đặt Flannel và khắc phục trạng thái “NotReady” của các nút được hiển thị tại , do chưa có mạng overlay 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 chính đầu tiên.
# kubectl apply -f kube-flannel.yml
Hãy 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 chủ đều hoạt động tốt.
Thêm các nút công nhân vào cụm
Sau khi bạn đã khởi tạo tất cả các nút chủ, bạn có thể thêm các nút công nhân vào cụm Kubernetes của mình. Hãy thêm nút làm việc đầu tiên ( 192.168.101.31 ) vào cụm Kubernetes HA được triển khai trên các máy Ubuntu. Sử dụng lệnh được hiển thị sau khi khởi tạo các nút chính (lệnh chứa token và hash) để cho phép nút làm việc tham gia cụm. 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 cụm Kubernetes HA để đảm bảo rằng nút worker đã đượ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 hiện tại.
# kubectl get nodes

Tương tự, thêm các nút worker khác vào cụm Kubernetes High Availability được cài đặt trên các máy Ubuntu. Bạn có thể thêm nhiều nút worker hơn bất cứ lúc nào tùy theo nhu cầu của mình. Tại thời điểm này, hướng dẫn hôm nay đã kết thúc.
Kết luận
Cài đặt Kubernetes trên Ubuntu không khó như bạn tưởng ban đầu. Bạn cần bỏ ra một chút công sức để triển khai cụm Kubernetes, nhưng đổi lại, bạn sẽ nhận được nhiều lợi ích như quản lý tập trung dễ dàng hơn, khả năng mở rộng cao và cân bằng tải. Loại 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 worker. Nếu bạn cần một 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 một cụm 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, bạn cần 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 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, cũng như 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 chủ độ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 deployment cũng như chạy pod có thể được thực hiện bằng hai phương pháp: chạy các lệnh do giao diện dòng lệnh cung cấp theo cách thủ công và sử dụng các tệp cấu hình YAML. Sử dụng các tệp YAML cho phép bạn tạo cấu trúc phức tạp hơn và làm cho quá trình quản trị 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 bảo vệ bổ sung bằng cách sử dụng Cụm VMware High Availability 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.