I. References
- https://kubernetes.io/docs/setup/production-environment/
- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- https://www.centlinux.com/2019/04/install-kubernetes-k8s-offline-on-centos-7.html
- 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
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 6443* | Kubernetes API server | All |
TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | Inbound | 10250 | kubelet API | Self, Control plane |
TCP | Inbound | 10251 | kube-scheduler | Self |
TCP | Inbound | 10252 | kube-controller-manager | Self |
- Worker nodes
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 10250 | kubelet API | Self, Control plane |
TCP | Inbound | 30000-32767 | NodePort 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
hay lắm
Trả lờiXóa