Cài đặt Kubernetes Cluster với kubeadm

Cài đặt Kubernetes Cluster với kubeadmCuongquach.com | Bạn sẽ bắt đầu thực hành việc cài đặt một Kubernetes Cluster với công cụ chính chủ kubeadm. Thay vì phải cài đặt các thành phần hệ thống từng phần từng phần, thì kubeadm sẽ giúp bạn làm việc đó bằng cách tự download và cài đặt các thành phần quan trọng cho hệ thống Kubernetes Cluster. Từ đó bạn dễ dàng tạo ra một Kubernetes Cluster để thực hành lab, development,… hoặc nếu custom đầy đủ bạn vẫn có thể chạy Production cho Kubernetes Cluster từ kubeadm đấy.

cai-dat-kubernetes-cluster-kubeadm

Các thông tin cơ bản

Các hệ điều hành hỗ trợ tốt cho chương trình Kubeadm :

  • Ubuntu 18.04+
  • Debian 9+
  • CentOS 7
  • Red Hat Enterprise Linux (RHEL) 7
  • Fedora 25+
  • HypriotOS v1.0.1+
  • Container Linux (tested with 1800.6.0)

Tài nguyên tối thiểu cho máy chủ :

  • CPU : 2
  • RAM : 2 GB

Mình sẽ lab cài đặt Kubernetes Cluster trên OS Ubuntu 18.04 .

Mô hình Kubernetes Cluster (1 Master Node và 2 Worker Node)

Chúng ta sẽ lab với 3 máy chủ :

  • Control-plane Node : ip 171.31.31.24
  • Worker Node 1 : ip 172.31.31.166
  • Worker Node 2 : 172.31.31.164

1. Kiểm tra các cấu hình cần thiết trên các Kubernetes Node

Trên cả 3 Node như 1 Master Node (control-plane node) và 2 Worker Node, bạn cần kiểm tra và cấu hình các phần sau :

– Đảm bảo MAC Address của card mạng giữa các máy chủ node là độc lập và duy nhất. Điều này dễ xảy ra MAC Address trùng lặp khi bạn sử dụng VM được clone ra.

# ip link

– Đảm bảo giá trị product_uuid giữa các máy chủ node là độc lập và duy nhất.

# cat /sys/class/dmi/id/product_uuid

– Tắt phân vùng swap đi nếu có sử dụng.

# swapoff -a

– Nếu có cấu hình phân vùng swap trong /etc/fstab thì comment config đó đi, để khỏi load phân vùng swap khi hệ thống khởi động.

# vi /etc/fstab

#UUID=d0200036-b211-4e6e-a194-ac2e51dfb27d none swap sw 0 0

– Đặt tên hostname riêng biệt cho từng máy chủ.

# hostnamectl set-hostname "cuongquach-k8s-master"
# hostnamectl set-hostname "cuongquach-k8s-worker-1"
# hostnamectl set-hostname "cuongquach-k8s-worker-2"

– Cấu hình địa chỉ IP Private của từng máy chủ node trong file /etc/hosts .

# cat << EOF >> /etc/hosts
172.31.31.42   cuongquach-k8s-master
172.31.31.166 cuongquach-k8s-worker-1
172.31.17.164 cuongquach-k8s-worker-2
EOF

– Cấu hình iptables tương tác với traffic ‘bridge‘. Và đảm bảo module ‘br_netfilter‘ đã được load mặc định trên máy chủ Ubuntu 18.04/18.04

# lsmod | grep br_netfilter
br_netfilter 24576 0
bridge 155648 1 br_netfilter

# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
EOF

# sudo sysctl --system

– Nếu chưa có module br_netfilter thì cấu hình để máy chủ load module br_netfilter .

# sudo modprobe br_netfilter
# echo 'br_netfilter' >> /etc/modules

– Nếu có dịch vụ tường lửa thì cần mở các port sau, còn không thì mình khuyến cáo có thể tắt tường lửa vào thời điểm lab Kubernetes Cluster.

open-port-kubernetes-cluster-nodes– Khởi động lại máy chủ để load các cấu hình trên.

2. Cài đặt Docker trên Ubuntu – Kubernetes Node

Như ta biết thì Kubernetes thường lựa chọn chạy nền tảng container runtime là Docker (các container runtime khác như Docker, containerd hoặc CRI-O). vì vậy ta cần cài đặt Docker trên toàn bộ Kubernetes Node . Tham khảo : Cài đặt Docker trên Ubuntu 18.04

– Kiểm tra phiên bản Ubuntu nào.

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic

Update thông tin local database của repo trước, cũng như cài một số chương trình hỗ trợ.

# sudo apt update
# sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

Thêm thông tin Docker GPG Key chính chủ vào hệ thống.

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Giờ ta thêm thông tin Docker Repository.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update

Tiến hành cài đặt Docker trên Ubuntu 18.04

# sudo apt install docker-ce docker-ce-cli -y

Cấu hình vài setting cơ bản cho dịch vụ Docker.

# cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

Khởi động dịch vụ Docker và cấu hình để Docker luôn khởi động cùng máy chủ.

# systemctl restart docker
# systemctl enable docker

Kiểm tra trạng thái dịch vụ Docker trên Ubuntu 18.04 nào.

# systemctl status docker

3. Cài đặt kubeadm, kubelet and kubectl

Cài đặt các chương trình hỗ trợ cơ bản.

# sudo apt-get update
# sudo apt-get install -y ebtables ethtool apt-transport-https curl

Thêm GPG Key của Kubernetes chính chủ vào hệ thống, để có thể xác thực các package sẽ được download.

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Thêm thông tin repository của Kubernetes vào Ubuntu 18.04. Hiện tại thì package trên repository của Kubernetes mới hỗ trợ xenial (18.04) , nhưng vẫn hoạt động tốt trên 18.04 . Nên đến khi Kubernetes hỗ trợ 18.04 package thì bạn có thể chỉ định xenial ở trong phần cấu hình repository deb này. (Bạn có thể kiểm tra ở đây: https://packages.cloud.google.com/apt/dists)

# cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

Bạn sẽ cài đặt 3 chương trình sau :

  • kubeadm: chương trình lệnh dùng để khởi tạo cluster.
  • kubelet: thành phần ứng dụng sẽ chạy trên toàn bộ các máy chủ Kubernetes Node trong cụm Cluster, thực hiện các hoạt động như : khởi chạy pod, container,…
  • kubectl: chương trình lệnh tương tác với Kubernetes Cluster
# sudo apt-get update
# sudo apt-get install -y kubelet kubeadm kubectl
# sudo apt-mark hold kubelet kubeadm kubectl

4. Khởi tạo Kubernetes Cluster

+ Master Node (control-plane node)

Trên máy chủ Master Node (control-plane node) mà bạn lựa chọn, chúng ta sẽ tiến hành boostrap khởi tạo Kubernetes Cluster . Các worker node còn lại sẽ tham gia vào cụm Kubernetes Cluster.

# kubeadm init --apiserver-advertise-address=172.31.31.42 --pod-network-cidr=10.100.0.0/16

W0520 10:13:20.769831   11711 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.2
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

...
...
...

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

# kubeadm join 172.31.31.42:6443 --token l6258x.q756celkgmz3fewh \
    --discovery-token-ca-cert-hash sha256:ef849283f86ec8f3658f22f6f2b25576baf875a257da8487b0673e9d154d0510

Trong đó:

  • 172.31.31.42 : là IP của node cuongquach-k8s-master.
  • --apiserver-advertise-address: là địa chỉ của node cuongquach-k8s-master, địa chỉ này cần truyền thông được với các node còn lại trong cụm cluster. Trong ví dụ này node cuongquach-k8s-master có địa chỉ là: 172.31.31.42.
  • --pod-network-cidr: là dải địa chỉ mạng phụ thuộc mà công nghệ network sẽ sử dụng để các Pod giao tiếp với nhau trong Kubernetes Cluster, trong hướng dẫn này ta sử dụng Calcio.

Giờ bạn cấu hình file config để chương trình kubectl có thể tương tác Kubernetes API ở user non-root hoặc user root tuỳ ý bạn. Mình sẽ tạo trên Master Node (control-plane node) thông tin file config admin kube đã được generate từ quá trình boostrap cluster. Ở đây mình chỉ định cho user 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 muốn tạo file config như vậy, bạn có thể chỉ định file config từ biến môi trường. Từ đó chương trình lệnh kubectl , sẽ tự đi load file config bạn chỉ định.

# export KUBECONFIG=/etc/kubernetes/admin.conf

Hiển thị thông tin các Pod và các Node từ chương trình lệnh kubectl thử nào.

# kubectl get all -A
NAMESPACE     NAME                                                READY   STATUS              RESTARTS   AGE
kube-system   pod/coredns-66bff467f8-5xq2s                        0/1     Pending             0          1s
kube-system   pod/coredns-66bff467f8-rswf4                        0/1     Pending             0          1s
kube-system   pod/etcd-cuongquach-k8s-master                      1/1     Running             0          15s
kube-system   pod/kube-apiserver-cuongquach-k8s-master            1/1     Running             0          15s
kube-system   pod/kube-controller-manager-cuongquach-k8s-master   1/1     Running             0          15s
kube-system   pod/kube-proxy-rnmvn                                0/1     ContainerCreating   0          1s
kube-system   pod/kube-scheduler-cuongquach-k8s-master            1/1     Running             0          15s

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  18s
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   16s

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kube-proxy   1         1         0       1            0           kubernetes.io/os=linux   16s

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   0/2     2            0           16s

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-66bff467f8   2         2         0       1s

5. Cài đặt Pod network add-on

Pod-network hay Container Network Interface (CNI) là nói về phương tiện để các Pod có thể giao tiếp với nhau trong hệ thống Kubernetes Cluster.

  • Cluster DNS (CoreDNS) sẽ không khởi động được nếu network add-on chưa được cài đặt.
  • Lớp mạng được dùng để khai báo cho Pod network không được trùng với lớp mạng của hệ thống máy chủ.
  • Bạn chỉ có thể cài đặt một Pod Network trên một Kubernetes Cluster.

Vậy giờ ta có thể lựa chọn các Pod Network Add-on đang phổ biến như (Tham khảo) :

  • Weave
  • Flannel
  • Calcio

Trong bài viết này, mình sẽ sử dụng Pod Network Add-on đơn giản và cũng khá mạnh mẽ là : Calcio

Calico is a networking and network policy provider. Calico supports a flexible set of networking options so you can choose the most efficient option for your situation, including non-overlay and overlay networks, with or without BGP. Calico uses the same engine to enforce network policy for hosts, pods, and (if using Istio & Envoy) applications at the service mesh layer. Calico works on several architectures, including amd64, arm64, and ppc64le.

Calcio sẽ tự động tìm thấy range địa chỉ IP dùng cho Pod thông qua giá trị mà bạn đã cấu hình ở flag arg –pod-network-cidr.

# kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

Một khi Pod network được cài đặt, bạn có thể kiểm tra xem nó hoạt động hay chưa bằng cách kiểm tra cách kiểm tra các Pod CoreDNS đã chuyển trạng thái RUNNING hay chưa ? Nếu chưa chạy RUNNING thì hoạt động cài đặt Pod Network của bạn đã thất bại.

# kubectl get pods --all-namespaces
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-789f6df884-9n7c8        1/1     Running   0          43s
kube-system   calico-node-mhspt                               1/1     Running   0          44s
kube-system   coredns-66bff467f8-5xq2s                        1/1     Running   0          91s
kube-system   coredns-66bff467f8-rswf4                        1/1     Running   0          91s
kube-system   etcd-cuongquach-k8s-master                      1/1     Running   0          105s
kube-system   kube-apiserver-cuongquach-k8s-master            1/1     Running   0          105s
kube-system   kube-controller-manager-cuongquach-k8s-master   1/1     Running   0          105s
kube-system   kube-proxy-rnmvn                                1/1     Running   0          91s
kube-system   kube-scheduler-cuongquach-k8s-master            1/1     Running   0          105s

Khi mà CoreDNS đã chạy, bạn có thể tiếp tục quá trình cấu hình các Worker Node tham gia vào Kubernetes Cluster.

6. Cấu hình Worker Node tham gia Kubernetes Cluster

Nhiệm vụ kế tiếp của chúng ta rất là đơn giản, bạn sẽ thao tác trên các máy chủ Worker Node để cấu hình chúng tham gia vào cụm Kubernetes Cluster.

Bạn sẽ thực hiện việc kết nối các Worker Node (2 máy chủ Worker Node) vào cụm Kubernetes Cluster, bằng cách cấu hình Worker Node kết nối địa chỉ IP của Master Node để yêu cầu việc tham gia Kubernetes Cluster.

Cú pháp:

kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

Cái token thì bạn lấy từ output của quá trình bootstrap Kubernetes Cluster. Nếu bạn quên lưu hoặc lỡ tắt terminal màn hình chạy trên Master Node, thì có thể thực hiện việc lấy lại thông tin token đó trên Master Node (control-plane node) như sau.

[cuongquach-k8s-master]# kubeadm token list

Về phần token, thì token có thời hạn 24h , nếu sau 24h bạn cần tạo mới token trên Control-plane Node.

[cuongquach-k8s-master]# kubeadm token create

Nếu bạn không tìm thấy giá trị “–discovery-token-ca-cert-hash” , thì bạn có thể chạy lệnh sau trên Control-plane Node để lấy thông tin CA Cert Hash

[cuongquach-k8s-master]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

Làm mấy cái trên dài dòng quá, có cách nào ngắn gọn giúp in ra terminal cú pháp lệnh giúp cấu hình Worker Node tham gia vào Kubernetes Cluster không ? Có đấy bạn , đây này :

# kubeadm token create --print-join-command
kubeadm join 172.31.31.42:6443 --token xt9jyv.l34wvpt1b4ddbuse     --discovery-token-ca-cert-hash sha256:ef849283f86ec8f3658f22f6f2b25576baf875a257da8487b0673e9d154d0510

Giờ chạy lệnh sau trên cả 2 Worker Node để cấu hình Worker Node tham gia vào Kubernetes Cluster nhé.

# kubeadm join 172.31.28.191:6443 --token a4n78w.0kykdl4lk4piagfi \
> --discovery-token-ca-cert-hash sha256:1c4c9d2b215590c91104493883408ca25a5b1a8c340c0c0f7063348c04a966ba

...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Giờ bạn quay lại con Master Node , để chạy lệnh kubectl nhằm kiểm tra xem hệ thống Kubernetes Cluster đã nhận được 2 máy chủ Worker Node vào cụm cluster chưa nhé.

# kubectl get node -A
NAME                      STATUS   ROLES    AGE     VERSION
cuongquach-k8s-master     Ready    master   8m9s    v1.18.2
cuongquach-k8s-worker-1   Ready    <none>   3m58s   v1.18.2
cuongquach-k8s-worker-2   Ready    <none>   3m56s   v1.18.2

Vậy là bạn đã cài đặt thành công một hệ thống Kubernetes Cluster với mô hình đơn giản gồm 1 Control-plane Node2 Worker Node.

Đây là bước khởi đầu để bạn có thể tiếp tục hành trình khám phá về công nghệ nền tảng Kubernetes đấy.

Nguồn: https://cuongquach.com/

Previous articleEbook Kubernetes Up and Running 2nd Edition (PDF)
Next articleCấu hình Port Forwarding truy cập ứng dụng trong Kubernetes Cluster
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !