

Sau khi đã xác định kiến trúc và mô hình triển khai ở Part 1, bước tiếp theo là chuẩn bị môi trường thực tế để triển khai Kubernetes cluster.
Phần này tập trung vào việc chuẩn bị hạ tầng nền tảng, đảm bảo môi trường sẵn sàng cho quá trình bootstrap cluster ở các bước tiếp theo.
Nội dung chính bao gồm:
Việc chuẩn bị môi trường một cách chính xác và nhất quán là điều kiện tiên quyết để các bước bootstrap phía sau có thể thực hiện ổn định và hạn chế các lỗi khó debug.
Jumpbox là máy trung gian được sử dụng để thực thi toàn bộ các thao tác cài đặt và cấu hình trong suốt quá trình triển khai cluster.
Trong phạm vi hướng dẫn này, Jumpbox sẽ được thiết lập theo cách tiếp cận của Kubernetes The Hard Way để đảm bảo tính nhất quán
Trước khi tiếp tục, cần cài đặt các package cơ bản và clone repository Kubernetes The Hard Way.
* Lưu ý: Sử dụng user root để thực hiện cài đặt
Cập nhật OS và cài đặt các packages cần thiết
apt-get update
apt-get -y install wget curl vim openssl git sudoClone git kubernetes-the-hard-way
git clone --depth 1 https://github.com/kelseyhightower/kubernetes-the-hard-way.gitSau đó cd vào đường dẫn kubernetes-the-hard-way và dowload các file binary
cd kubernetes-the-hard-way
wget -q --show-progress \
--https-only \
--timestamping \
-P downloads \
-i downloads-$(dpkg --print-architecture).txtCác binary được tải về Jumpbox nhằm tránh việc download lặp lại trên từng node, giúp tối ưu băng thông và thời gian triển khai.
Danh sách các file được lưu trong file downloads-amd64.txt hoặc downloads-arm64.txt, tùy thuộc vào kiến trúc của máy (amd64 hoặc arm64). Trong phạm vi bài viết này sử dụng kiến trúc amd64.
Có thể kiểm tra lại danh sách các file bằng lệnh:
cat downloads-$(dpkg --print-architecture).txtThực hiện giải nén các file binary và move vào các đường dẫn tương ứng trong thư mục downloads
ARCH=$(dpkg --print-architecture)
mkdir -p downloads/{client,cni-plugins,controller,worker}
tar -xvf downloads/crictl-v1.32.0-linux-${ARCH}.tar.gz \
-C downloads/worker/
tar -xvf downloads/containerd-2.1.0-beta.0-linux-${ARCH}.tar.gz \
--strip-components 1 \
-C downloads/worker/
tar -xvf downloads/cni-plugins-linux-${ARCH}-v1.6.2.tgz \
-C downloads/cni-plugins/
tar -xvf downloads/etcd-v3.6.0-rc.3-linux-${ARCH}.tar.gz \
-C downloads/ \
--strip-components 1 \
etcd-v3.6.0-rc.3-linux-${ARCH}/etcdctl \
etcd-v3.6.0-rc.3-linux-${ARCH}/etcd
mv downloads/{etcdctl,kubectl} downloads/client/
mv downloads/{etcd,kube-apiserver,kube-controller-manager,kube-scheduler} \
downloads/controller/
mv downloads/{kubelet,kube-proxy} downloads/worker/
mv downloads/runc.${ARCH} downloads/worker/runcXóa các file .tgz
rm -rf downloads/*gzThêm quyền execute cho các file binary
chmod +x downloads/{client,cni-plugins,controller,worker}/*Cài đặt kubectl
Ghi chú: kubectl là CLI client chính thức của Kubernetes. Trên máy Jumpbox, kubectl sẽ được dùng để tương tác với control plane của cụm Kubernetes sau khi cài đặt xong.
cp downloads/client/kubectl /usr/local/bin/Kiểm tra lại bằng lệnh
kubectl version --clientSẽ thấy hiển thị
Client Version: v1.32.3
Kustomize Version: v5.5.0Để phục vụ việc cấu hình và tự động hóa trên các node, một file text sẽ được sử dụng như một “machine database”, lưu trữ thông tin của từng máy chủ trong cluster.
IPV4_ADDRESS FQDN HOSTNAME POD_SUBNETTrong đó:
Cụ thể trong phạm vi bài hướng dẫn này, tôi sẽ tạo file machine database là machines.txt, nội dung như sau:
192.168.0.41 server.kubernetes.local server
192.168.0.42 node-0.kubernetes.local node-0 10.200.0.0/24
192.168.0.43 node-1.kubernetes.local node-1 10.200.1.0/24Trong phạm vi hướng dẫn này, SSH với quyền root được sử dụng để thực hiện cấu hình trên các node trong cluster.
Trong môi trường production, cấu hình này thường bị vô hiệu hóa vì lý do bảo mật; tuy nhiên, trong môi trường lab, cấu hình này được bật tạm thời để đơn giản hóa quá trình triển khai.
Cần đảm bảo các node cho phép đăng nhập SSH bằng user root bằng cách cập nhật cấu hình sshd_config và khởi động lại SSH service.
Thực hiện đăng nhập vào từng VM bằng user đã tạo, sau đó chuyển sang user root:
su - rootCấu hình file /etc/ssh/sshd_config và sửa cấu hình PermitRootLogin thành yes
sed -i \
's/^#*PermitRootLogin.*/PermitRootLogin yes/' \
/etc/ssh/sshd_configSau đó restart dịch vụ SSH Server
systemctl restart sshdThực hiện khởi tạo SSH Key trên máy Jumpbox
ssh-keygenNhập các thông tin như phía dưới hoặc có thể Enter để next đến hết
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pubCopy SSH public key tới các máy còn lại:
while read IP FQDN HOST SUBNET; do
ssh-copy-id root@${IP}
done < machines.txtSau khi thực hiện copy, kiểm tra lại bằng lệnh
while read IP FQDN HOST SUBNET; do
ssh -n root@${IP} hostname
done < machines.txtSẽ thấy hiển thị
server
node-0
node-1Trong phần này, ta sẽ thực hiện gán hostname cho các máy chủ, bao gồm server, node-0 và node-1. Hostname sẽ được sử dụng khi thực thi các câu lệnh từ jumpbox đến từng máy. Hostname cũng được mỗi máy worker, node-0 và node-1 sử dụng khi registering với một Kubernetes cluster nhất định.
Để cấu hình hostname trên tất cả các máy, ta thực hiện trên Jumpbox như sau:
while read IP FQDN HOST SUBNET; do
CMD="sed -i 's/^127.0.1.1.*/127.0.1.1\t${FQDN} ${HOST}/' /etc/hosts"
ssh -n root@${IP} "$CMD"
ssh -n root@${IP} hostnamectl set-hostname ${HOST}
ssh -n root@${IP} systemctl restart systemd-hostnamed
done < machines.txtKiểm tra lại hostname của các máy chủ:
while read IP FQDN HOST SUBNET; do
ssh -n root@${IP} hostname --fqdn
done < machines.txtSẽ thấy hiển thị
server.kubernetes.local
node-0.kubernetes.local
node-1.kubernetes.localCấu hình file /etc/hosts để các node có thể resolve lẫn nhau thông qua hostname thay vì địa chỉ IP.
Đầu tiên ta sẽ thực hiện tạo file hosts trên máy Jumpbox
echo "" > hosts
echo "# Kubernetes The Hard Way" >> hostsSau đó tạo các bản ghi trên file hosts này
while read IP FQDN HOST SUBNET; do
ENTRY="${IP} ${FQDN} ${HOST}"
echo $ENTRY >> hosts
done < machines.txtKiểm tra lại nội dung file hosts vừa tạo bằng
cat hostsSẽ thấy nội dung
# Kubernetes The Hard Way
XXX.XXX.XXX.XXX server.kubernetes.local server
XXX.XXX.XXX.XXX node-0.kubernetes.local node-0
XXX.XXX.XXX.XXX node-1.kubernetes.local node-1Thực hiện thêm các bản ghi host như sau
cat hosts >> /etc/hostsKiểm tra lại bằng lệnh
cat /etc/hostsSẽ thấy hiển thị
127.0.0.1 localhost
127.0.1.1 jumpbox
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Kubernetes The Hard Way
192.168.0.41 server.kubernetes.local server
192.168.0.42 node-0.kubernetes.local node-0
192.168.0.43 node-1.kubernetes.local node-1Bây giờ, ta đã có thể SSH từ máy Jumpbox tới các máy chủ trong list machines.txt bằng hostname. Kiểm tra lại bằng lệnh
for host in server node-0 node-1
do ssh root@${host} hostname
doneSẽ thấy hiển thị
server
node-0
node-1Thực hiện thêm các bản ghi host trên các máy còn lại như sau:
while read IP FQDN HOST SUBNET; do
scp hosts root@${HOST}:~/
ssh -n \
root@${HOST} "cat hosts >> /etc/hosts"
done < machines.txtSau khi hoàn thành các bước trên, các node đã có thể resolve và kết nối với nhau thông qua hostname (server, node-0, node-1) thay vì địa chỉ IP, sẵn sàng cho các bước cấu hình tiếp theo.
