日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搭建Kubernetes(k8s)集群(cka考试环境)

發布時間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搭建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 無法正常啟動

[root@master yum.repos.d]# swapoff -a [root@master yum.repos.d]# vim /etc/fstab #/dev/mapper/rhel-swap swap swap defaults 0 0

關閉 SELinux
將 SELinux 設置為 disabled模式
臨時關閉

sudo setenforce 0

永久禁用

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源。

[root@master ~]# cat /etc/yum.repos.d/ centos.repo docker-ce.repo redhat.repo [root@master ~]# cat /etc/yum.repos.d/centos.repo [rhrl7.3] name=rhel7.3 baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/ gpgcheck=0 enabled=1 [root@master ~]# cat /etc/yum.repos.d/docker-ce.repo [docker-ce] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/ gpgcheck=0 [centos] name=centos baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/ gpgcheck=0

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集群時會報錯。

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"

注意這條 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。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]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 kubelet

kubeadm初始化:

[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

[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

將kubeadm init 初始化完成后的這個命令寫入到下面文件,使用環境變量。

vim .bash_profile export KUBECONFIG=/etc/kubernetes/admin.conf [root@master ~]# kubectl get node

NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 26m v1.23.1

[root@master ~]# kubectl get pod -A

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

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml [root@master ~]# kubectl apply -f kube-flannel.yml Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+ podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created [root@master ~]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6d8c4cb4d-jnk68 0/1 Pending 0 6h18m kube-system coredns-6d8c4cb4d-wxmc7 0/1 Pending 0 6h18m kube-system etcd-master 1/1 Running 2 6h18m kube-system kube-apiserver-master 1/1 Running 2 6h18m kube-system kube-controller-manager-master 1/1 Running 2 6h18m kube-system kube-flannel-ds-jjr2q 0/1 Init:0/2 0 33s kube-system kube-proxy-w9fsp 1/1 Running 0 6h18m kube-system kube-scheduler-master 1/1 Running 2 6h18m

該行可看到正在下載網絡組件,等待下載完畢后,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節點執行:

kubeadm join 172.25.254.1:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:14fbb510c5d836b637665f8bb451ce2de51d568ae2a574becf932998f2afe48f --v=5 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 50m v1.23.1 node1 NotReady <none> 17m v1.23.1 node2 Ready <none> 49m v1.23.1

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考试环境)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。