搭建Kubernetes(k8s)集群(cka考试环境)
搭建Kubernetes(k8s)集群
- 基礎介紹
- containerd簡介
- Docker vs containerd
- K8S為什么要放棄使用Docker作為容器運行時,而使用containerd呢?
- 環境準備
- 安裝 Containerd
- 配置 containerd
- 安裝 kubeadm kubelet kubectl
- 安裝flannel網絡插件,采用離線安裝
本文章針對cka考試,目的為使用containerd和kubeadm搭建cka考試環境。
需要kubernetes官方文檔作參考。
默認情況下,Kubernetes 使用 容器運行時接口(Container Runtime Interface,CRI) 來與你所選擇的容器運行時交互。
如果你不指定運行時,則 kubeadm 會自動嘗試檢測到系統上已經安裝的運行時, 方法是掃描一組眾所周知的 Unix 域套接字。
如果同時檢測到 Docker 和 containerd,則優先選擇 Docker。 這是必然的,因為 Docker 18.09 附帶了 containerd 并且兩者都是可以檢測到的, 即使你僅安裝了 Docker。 如果檢測到其他兩個或多個運行時,kubeadm 輸出錯誤信息并退出。 kubelet 通過內置的 dockershim CRI 實現與 Docker 集成。
基礎介紹
containerd簡介
containerd是一個工業級標準的容器運行時,它強調簡單性、健壯性和可移植性。containerd可以在宿主機中管理完整的容器生命周期,包括容器鏡像的傳輸和存儲、容器的執行和管理、存儲和網絡等。
Docker vs containerd
containerd是從Docker中分離出來的一個項目,可以作為一個底層容器運行時,現在它成了Kubernete容器運行時更好的選擇。
K8S為什么要放棄使用Docker作為容器運行時,而使用containerd呢?
-
如果你使用Docker作為K8S容器運行時的話,kubelet需要先要通過 dockershim 去調用Docker,再通過Docker去調用containerd。
-
如果你使用containerd作為K8S容器運行時的話,由于containerd內置了 CRI (Container Runtime Interface:容器運行時接口)插件,kubelet可以直接調用containerd。
環境準備
- 三臺兼容的 Linux 主機。Kubernetes 項目為基于 Debian 和 Red Hat 的 Linux 發行版以及一些不提供包管理器的發行版提供通用的指令
- 每臺機器 2 GB 或更多的 RAM (如果少于這個數字將會影響你應用的運行內存), 2 CPU 核或更多
- 集群中的所有機器的網絡彼此均能相互連接(公網和內網都可以)
- 節點之中不可以有重復的主機名、MAC 地址。
- 開啟機器上的某些端口。
- 禁用交換分區。為了保證 kubelet 正常工作,必須 禁用交換分區。
- 虛擬機聯網!
禁用交換分區
kubelet 在 1.8 版本以后強制要求 swap 必須關閉。要不然kubelet 無法正常啟動
關閉 SELinux
將 SELinux 設置為 disabled模式
臨時關閉
永久禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config關閉防火墻
systemctl stop firewalld systemctl disable firewalld安裝 Containerd
安裝和配置的先決條件:
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOFsudo modprobe overlay sudo modprobe br_netfilter設置必需的 sysctl 參數,這些參數在重新啟動后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF# 應用 sysctl 參數而無需重新啟動 sudo sysctl --system安裝 containerd:
從官方Docker倉庫安裝 containerd.io 軟件包。可以在 安裝 Docker 引擎 中找到有關為各自的 Linux發行版設置 Docker 存儲庫和安裝 containerd.io 軟件包的說明。
使用阿里云yum源
[root@master yum.repos.d]# vim docker-ce.repo [docker-ce] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/ gpgcheck=0 enabled=1 [root@master yum.repos.d]# yum install -y containerd.io發現有報錯!
Error: Package: containerd.io-1.6.4-3.1.el7.x86_64 (docker-ce)Requires: container-selinux >= 2:2.74You could try using --skip-broken to work around the problemYou could try running: rpm -Va --nofiles --nodigest原因是因為用的rhel7.3的操作系統。centos則不需要。
[root@master yum.repos.d]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.3 (Maipo)rhel7.3版本較低,后來使用了阿里云的centos的擴展yum源發現安裝還是有依賴性,報錯版本低。
因此直接使用centos的yum源。
containerd.io安裝成功!
配置 containerd
sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml修改配置文件
[root@master ~]# cd /etc/containerd/ [root@master containerd]# ls config.toml [root@master containerd]# vim config.toml在文件 config.toml 中找到該行并修改鏡像源。
sandbox_image = “k8s.gcr.io/pause:3.6”
默認使用的鏡像是k8s的,不科學上網連不上,改為國內阿里云鏡像倉庫。否則建立k8s集群時會報錯。
注意這條 systemd_cgroup = false 不能改為true,否則后面在node節點kubeadm
join時會報錯,具體報錯為:
[root@node1 lib]# tail /var/log/messages Jun 11 21:37:11 localhost
kubelet: E0611 21:37:11.711773 8321 server.go:205] “Failed to load
kubelet config file” err=“failed to load Kubelet config file
/var/lib/kubelet/config.yaml, error failed to read kubelet config file
“/var/lib/kubelet/config.yaml”, error: open
/var/lib/kubelet/config.yaml: no such file or directory”
path=“/var/lib/kubelet/config.yaml” Jun 11 21:37:11 localhost systemd:
kubelet.service: main process exited, code=exited, status=1/FAILURE
Jun 11 21:37:11 localhost systemd: Unit kubelet.service entered failed
state. Jun 11 21:37:11 localhost systemd: kubelet.service failed.
沒有/var/lib/kubelet/config.yaml這個文件。
使用 systemd cgroup 驅動程序
結合 runc 使用 systemd cgroup 驅動,在 /etc/containerd/config.toml 中設置,
SystemdCgroup改為true。
如果您應用此更改,重新啟動 containerd:
sudo systemctl restart containerd安裝 kubeadm kubelet kubectl
在所有機器上安裝以下的軟件包:
kubeadm:用來初始化集群的指令。
kubelet:在集群中的每個節點上用來啟動 Pod 和容器等。
kubectl:用來與集群通信的命令行工具。
kubeadm 不能幫你安裝或者管理 kubelet 或 kubectl,所以你需要 確保它們與通過 kubeadm 安裝的控制平面的版本相匹配。 如果不這樣做,則存在發生版本偏差的風險,可能會導致一些預料之外的錯誤和問題。
一定要指定版本,否則會安裝最新版。
yum install -y kubeadm-1.23.1-0 kubelet-1.23.1-0 kubectl-1.23.1-0設置開機自啟并立即啟動kubelet
systemctl enable --now kubeletkubeadm初始化:
[root@master ~]# kubeadm config print init-defaults > kubeadm-init.yaml [root@master ~]# vim kubeadm-init.yaml修改以下地方
提示:低版本的操作系統注意升級systemd(yum upgrade systemd),否則會報錯。
[root@master ~]# kubeadm init --config kubeadm-init.yaml初始化成功!
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 -u):(id?u):(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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.25.254.1:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256:14fbb510c5d836b637665f8bb451ce2de51d568ae2a574becf932998f2afe48f
將kubeadm init 初始化完成后的這個命令寫入到下面文件,使用環境變量。
vim .bash_profile export KUBECONFIG=/etc/kubernetes/admin.conf [root@master ~]# kubectl get nodeNAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 26m v1.23.1
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-frkfl 0/1 Pending 0 26m
kube-system coredns-6d8c4cb4d-x85ct 0/1 Pending 0 26m
kube-system etcd-master 1/1 Running 0 26m
kube-system kube-apiserver-master 1/1 Running 0 26m
kube-system kube-controller-manager-master 1/1 Running 0 26m
kube-system kube-proxy-rt476 1/1 Running 0 26m
kube-system kube-scheduler-master 1/1 Running 0 26m
缺少網絡組件。
安裝flannel網絡插件,采用離線安裝
瀏覽器打開 https://kubernetes.io/docs/concepts/cluster-administration/addons/
找到flannel,
下載kube-flannel.yml
該行可看到正在下載網絡組件,等待下載完畢后,coredns就緒了:
kube-system kube-flannel-ds-jjr2q 0/1 Init:0/2 0 33s查看tocken,注意這個tocken是24小時的,過期需要重新創建:
[root@master ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS abcdef.0123456789abcdef 17h 2022-06-12T06:47:01Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token將node節點加入到集群中
node節點執行:
STATUS一直為NotReady,是因為kube-flannel還未拉取成功,
[root@master ~]# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-flannel-ds-mklgj 0/1 Init:1/2 0 2m33s 172.25.254.2 node1 <none> <none>等待全部拉取完成后,所有節點也變為ready狀態。
至此,k8s集群搭建完畢。
總結
以上是生活随笔為你收集整理的搭建Kubernetes(k8s)集群(cka考试环境)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode-SQL】1527.
- 下一篇: JAVA实现对阿里云DNS的解析管理