Chủ Nhật, 18 tháng 4, 2021

[k8s] Hướng dẫn cài đặt kubernetes offline (master single node)

 I. References

  1. https://kubernetes.io/docs/setup/production-environment/
  2. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
  3. https://www.centlinux.com/2019/04/install-kubernetes-k8s-offline-on-centos-7.html
  4. https://docs.genesys.com/Documentation/GCXI/9.0.0/Dep/DockerOffline

II. Setup

Yêu cầu sudo hoặc quyền root, server Centos 7+

1. Cài đặt Container Runtimes

Để chạy các container (POD) trên mỗi node, cần phải cài đặt CR (container runtime) trên mỗi node.

Có nhiều loại CR, 3 loại thường dùng cài với Kubernetes trên linux:

 . Cgroup Driver

Dùng để quản lý các tài nguyên cấp cho các tiến trình, trên linux thường dùng Systemd

Trong hướng dẫn này sử dụng Docker làm CR cho K8s.

a. Hướng dẫn cài Docker, chi tiết tham khảo trang Docker

https://docs.docker.com/engine/install/#server

Tải file rpm để cài đặt trên các server offline

b. Cấu hình Docker deamon, sử dụng Systemd để quản lý container's cgroups

Chỉnh sửa file cấu hình docker deamon : /etc/docker/daemon.json

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

Note: overlay2 is the preferred storage driver for systems running Linux kernel version 4.0 or higher, or RHEL or CentOS using version 3.10.0-514 and above.

c. Restart docker

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

Note:

For more information refer to

2. Có 3 tool được khuyến nghị bởi K8s

Trong bài viết này sẽ hướng dẫn cài Kubeadm với master single node

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

a. Bật mode bridged traffic trên iptables

. Check mode br_netfilter

lsmod | grep br_netfilter

  • Nếu chưa bật thì gọi lệnh sau để bật

sudo modprobe br_netfilter

  • Set các tham số forward network

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

For more details please see the Network Plugin Requirements page.

b. Mở iptables tương ứng các port sau

  • Control-plane nodes

ProtocolDirectionPort RangePurposeUsed By
TCPInbound6443*Kubernetes API serverAll
TCPInbound2379-2380etcd server client APIkube-apiserver, etcd
TCPInbound10250kubelet APISelf, Control plane
TCPInbound10251kube-schedulerSelf
TCPInbound10252kube-controller-managerSelf

  • Worker nodes

ProtocolDirectionPort RangePurposeUsed By
TCPInbound10250kubelet APISelf, Control plane
TCPInbound30000-32767NodePort Services†All

c. Cài đặt Kubeadm, Kubelet và Kubectl

Cài đặt Kubeadm, Kubelet, Kubectl trên tất cả các server vật lý.

  • kubeadm: the command to bootstrap the cluster.

  • kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.

  • kubectl: the command line util to talk to your cluster.

 Chuẩn bị 1 server kết nối tới internet để tải package và images phục vụ cho việc cài đặt.

B1. download các package của kubeadm, kubelet, kubectl

Trên server Online

. add repository

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

. Make cache yum 

yum makecache fast 

. Download các gói tương ứng

yumdownloader --resolve kubelet kubeadm kubectl

Nếu thiếu gói nào thì dùng tool yumdownloader để down các gói tương ứng

B2. Chuyển các gói lên server để cài đặt

Trên server offline

.Cài đặt các gói rpm tương ứng, nếu thiếu lib lại trong quá trình cài đặt thì quay lại server online dùng yumdownloader để tải các package tương ứng.

yum install -y --cacheonly --disablerepo=* <your_rpm_dir>/*.rpm

Hoặc

yum install -y --cacheonly --disablerepo=* <your_rpm_dir>/*.rpm

. Enable bash kubectl

source <(kubectl completion bash)
kubectl completion bash > /etc/bash_completion.d/kubectl
systemctl enable --now kubelet

Note: lưu ý cài các package cri-tools, kubernetes-cni,... khi start kubelet sẽ gặp lỗi thiếu các package.

d. Khởi tạo cluster

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

B1. Tải các image cần thiết trước khi khởi tạo cụm

.Chạy lệnh sau để xác định các image tương ứng

kubeadm config images list

Hiển thị danh sách các image

k8s.gcr.io/kube-apiserver:v1.18.1 
k8s.gcr.io/kube-controller-manager:v1.18.1 
k8s.gcr.io/kube-scheduler:v1.18.1 
k8s.gcr.io/kube-proxy:v1.18.1 
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

. Docker pull và save các image tương ứng trên Server Online

docker pull k8s.gcr.io/<image name>
docker save k8s.gcr.io/<image name> > <image name>.tar

. Tải lên server offline và load vào docker

docker load < <image name>.tar

B2. Khởi tạo cluster với kubeadm

. off swap (yêu cầu bắt buộc)

swapoff -a

.Ensure that SELinux is in permissive mode

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

.Ensure that the config option sysctl > net.bridge.bridge-nf-call-iptables is set to 1

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

.Optionally, configure kubectl autocompletion

 echo "source <(kubectl completion bash)" >> ~/.bashrc

.Khởi tạo cluster

kubectl version

kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v<version> 

Đợi vài phút cho đến khi hiển thị thông báo kết quả như dưới

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:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

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

Trong đó:

. Để add cấu hình kubectl

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

. Để join một node vào cụm

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

. Kiểm tra trạng thái các node

kubectl get nodes

Hiển thị danh sách các node là thành công

e. Cài đặt Network Add-on cho cluster

Danh sách các Network add-on : https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model

Trong hướng dẫn này hướng dẫn cài Calio

B1. Dùng Server Online tải file manifest và image tương ứng

curl -LO https://docs.projectcalico.org/manifests/tigera-operator.yaml
curl -LO https://docs.projectcalico.org/manifests/custom-resources.yaml

Mở file manifest tìm trường image:

Sau đó tải image và load lên server tương tự bước load image trên.

B2. Dùng kubectl apply các file manifest

kubectl apply -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml

Đợi các pod run đến khi hoàn thành

watch kubectl get pods -n calico-system

Xóa node master khỏi schedule pod

kubectl taint nodes --all node-role.kubernetes.io/master-

B3. Kiểm tra trạng thái các node

kubectl get nodes -o wide

Hiển thị kết quả như dưới

NAME              STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
<your-hostname>   Ready    master   52m   v1.12.2   10.128.0.28   <none>        Ubuntu 18.04.1 LTS   4.15.0-1023-gcp   docker://18.6.1

III. Các lỗi thường gặp

1. Lỗi thiếu package cài đặt

VD: hiển thị thông báo sau

[preflight] WARNING: ebtables not found in system path
[preflight] WARNING: ethtool not found in system path

Dùng yumdownloader để tải các gói ebtables, ethtool tương ứng và đẩy lên server để cài đặt.

2. Lỗi kubelet không active

Chạy lệnh  systemctl status kubelet 

Báo deactive , chạy tiếp lệnh journalctl -u kubelet.service -f

Để kiểm tra log xem nguyên nhân và fixed tiếp các lỗi, thường do lỗi thiếu package.

3. Lỗi cấu hình overlay2 cho docker

chạy lệnh systemctl status docker.service

Báo deactive , chạy tiếp lệnh journalctl -u docker.service -f

Xuất hiện lỗi  Error starting daemon: error initializing graphdriver: driver not supported

Thì thực hiện thêm cấu hình docker như sau:

{

"exec-opts": ["native.cgroupdriver=systemd"],

  "log-driver": "json-file",

  "log-opts": {

    "max-size": "100m"

  },

 "storage-driver": "overlay2",

 "storage-opts": [

     "overlay2.override_kernel_check=true"

   ]

}

Restart lại docker


1 nhận xét: