参考文章
原文链接:https://blog.csdn.net/qq_30818545/article/details/128056996
版权声明:本文为CSDN博主「大能嘚吧嘚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明
1、Master主机:2核CPU、4G内存、20G硬盘
2、Node主机:4+核CPU、8G+内存、40G+硬盘
2、集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
3、节点之中不可以有重复的主机名、MAC 地址或 product_uuid
4、开启机器上的某些端口
5、为了保证 kubelet 正常工作,必须禁用交换分区
hostnamectl set-hostname k8smaster && hostname # 设置主节点1的主机名称
hostnamectl set-hostname k8snode1 && hostname # 设置从节点1的主机名称
vi /etc/hosts # 编辑文件,注意不能有空格
192.168.31.236 k8s-master
192.168.31.235 k8s-node1
192.168.31.237 k8s-node2
systemctl disable nftables.service && systemctl stop nftables.service && systemctl status nftables.service
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab # 注释掉swap那一行
# 设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
容器运行时接口(Container Runtime Interface),简称CRI
容器运行时(Container Runtime),简称CR,有Docker、Containerd、Podman等等
默认情况下 Kubernetes 使用 CRI 与 CR 进行交互,如果不指定CRI,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的CRI,如果检测到有多个或者没有CRI,kubeadm 将抛出一个错误并要求你指定一个想要的CRI
K8S 1.20 版本前后对比
K8S 1.20版本以前,CRI内部维护了DockerShim,CR使用的是Docker, CRI与CR进行交互时是通过DockerShim桥接来实现的
K8S 1.20版本以后,CRI内部取消的DockerShim(市场上大部分CR都遵循了K8S的CRI规范,KS8为了适应更多的CR而放弃了Docker,如果还想使用Docker则需要外部单独安装cri-dockerd),CR使用的是Containerd
https://docs.docker.com/engine/install/debian/
apt-get remove docker docker-engine docker.io containerd runc && apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /etc/docker && rm -rf /usr/libexec/docker && rm -rf /var/lib/docker && rm -rf /var/lib/containerd && rm -rf /etc/apt/keyrings
whereis docker # 确保没有和docker相关的文件
apt-get update && apt-get install ca-certificates curl gnupg lsb-release apt-transport-https software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
mkdir -m 0755 -p /etc/apt/keyrings \
&& curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
mkdir -m 0755 -p /etc/apt/keyrings \
&& curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.aliyun.com/docker-ce/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
chmod a+r /etc/apt/keyrings/docker.gpg && apt-get update
apt-cache madison docker-ce # 查询存储库中可用的版本
apt-get install docker-ce=5:23.0.1-1~debian.11~bullseye # Docker守护进程
apt-get install docker-ce-cli=5:23.0.1-1~debian.11~bullseye # CLI工具用来远程控制Docker守护进程
# 轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
apt-get install docker-compose && apt-get install docker-compose-plugin
systemctl enable docker && systemctl restart docker && systemctl status docker
docker info # 基本信息
docker --version # 检查安装版本
1、K8S发布的CRI(Container Runtime Interface)统一了容器运行时接口,凡是支持CRI的容器运行时的皆可作为K8S的底层容器运行时,而Docker 没有实现 CRI,为此必须安装一个额外的服务 cri-dockerd才可以在K8S中使用
2、K8S 1.24版本中从 kubelet 中移除了docker作为容器运行时,取而代之的是containerd容器运行时,它是从Docker中分离出来的底层容器运行时,使用起来与Docker相似
3、containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性
4、containerd 可以在宿主机中管理完整的容器生命周期,包括容器镜像的传输和存储、容器的执行和管理、存储和网络等
https://github.com/containerd/containerd/releases
containerd-1.6.19-linux-amd64.tar.gz(单独的 containerd)(不推荐)
cri-containerd-1.6.19-linux-amd64.tar.gz(containerd + runc)(不推荐)
runc为容器运行时,实现了容器的init、run、create、ps等等在运行容器所需要的cmd指令
cri-containerd-cni-1.6.19-linux-amd64.tar.gz(containerd + runc + cni)(推荐)
CNI(Container Network Interface) 是一套容器网络接口规范,通过插件的形式支持各种各样的网络类型,为容器分配ip地址
注意:Kubernetes 要想实现网络模型,则需要安装一个 三方的CNI 插件。在 Kubernetes 1.24 之前,CNI 插件可以由 kubelet 使用命令行参数 cni-bin-dir 和 network-plugin 管理,Kubernetes 1.24开始移除了这些命令行参数。Kubernetes 1.26开始支持用于集群联网的容器网络接口 (CNI) 插件(官方推荐安装地址
https://kubernetes.io/docs/concepts/cluster-administration/addons
背景:在部署 k8s 的过程中,经常要对镜像进行操作(拉取、删除、查看等)
问题:使用过程中会发现 ctr 和 crictl 有很多相同功能,也有些不同,那区别到底在哪里?
说明:
1.ctr 是 containerd 自带的 CLI 命令行工具,crictl 是 k8s 中 CRI(容器运行时接口)的客户端,
k8s 使用该客户端和 containerd 进行交互;
[root@xianchaonode1 ~]# cat /etc/crictl.yaml
runtime-endpoint: "/run/containerd/containerd.sock"
image-endpoint: ""
timeout: 0
debug: false
pull-image-on-create: false
disable-pull-on-run: false
systemctl restart containerd
2.ctr 和 crictl 命令具体区别如下,也可以--help 查看。crictl 缺少对具体镜像的管理能力,可能是
k8s 层面镜像管理可以由用户自行控制,能配置 pod 里面容器的统一镜像仓库,镜像的管理可以有
habor 等插件进行处理。
docker 跟 containerd 不冲突,安装 docker 是为了能基于 dockerfile 构建
镜像
所有节点都配置
注意,我们安装的是cri-containerd-cni-1.6.19-linux-amd64.tar.gz(containerd + runc + cni)(推荐) ,就不需要再配置下面的拉
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
systemctl restart containerd
文档地址
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
tar xzf /home/lixing/cri-containerd-cni-1.6.19-linux-amd64.tar.gz -C / # 自动把内部etc、opt、usr目录解压到/目录
mkdir -p /etc/containerd && containerd config default > /etc/containerd/config.toml # 生成配置文件
vi /etc/containerd/config.toml # 编辑启动文件
mkdir -p /etc/containerd #创建一个目录用于存放containerd的配置文件
containerd config default | sudo tee /etc/containerd/config.toml #把containerd配置导出到文件
vim /etc/containerd/config.toml #修改配置文件
[plugins."io.containerd.grpc.v1.cri"]
..................................
#搜索sandbox_image,把原来的k8s.gcr.io/pause:3.6改为
"registry.aliyuncs.com/google_containers/pause:3.9"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
..........................
#搜索SystemdCgroup,把这个false改为true
SystemdCgroup = true
#搜索config_path,配置镜像加速地址(这是一个目录下面创建)
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
#创建镜像加速的目录
mkdir /etc/containerd/certs.d/docker.io -pv
#配置加速
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://rj0i5pgk.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
#加载containerd的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
#重启containerd
systemctl restart containerd
systemctl status containerd
runc 安装(containerd通过runc来运行容器)
注意:containerd 解压后默认是包含runc的,但是缺乏相关依赖,建议自行安装并覆盖默认的 runc
下载地址
https://github.com/opencontainers/runc/releases
chmod +x runc.amd64 && mv runc.amd64 /usr/local/sbin/runc && runc -v # 覆盖默认的runc
systemctl daemon-reload && systemctl restart containerd # 重新加载服务配置文件并重启
systemctl enable containerd # 开机自启
systemctl restart containerd.service # 重启服务
systemctl status containerd.service # 查看服务状态
containerd -version
ctr version
官方安装教程
kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本
https://lework.github.io/2021/04/03/debian-kubeadm-install/#%E9%83%A8%E7%BD%B2master%E8%8A%82%E7%82%B9
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
sudo echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get upgrade && sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
# sudo apt-get remove kubelet kubeadm kubectl # 卸载
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本,标记软件包不被自动更新
sudo systemctl enable kubelet
sudo systemctl restart kubelet && sudo systemctl status kubelet # 重启并查看状态
配置 cgroup 驱动
kubelet 和 容器运行时需使用相同的CGroup驱动并且采用相同的配置
Linux上控制组(CGroup)用于限制分配给进程的资源
kubelet 和 容器运行时都需要对接CGroup来强制执行为Pod和容器管理资源(为诸如 CPU、内存这类资源设置请求和限制)
由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 推荐使用 systemd 驱动,不推荐 cgroupfs 驱动
kubeadm config images list # 查询k8s各组件的版本号
registry.k8s.io/kube-apiserver:v1.26.0
registry.k8s.io/kube-controller-manager:v1.26.0
registry.k8s.io/kube-scheduler:v1.26.0
registry.k8s.io/kube-proxy:v1.26.0
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
不是完全可以先拉镜像,可以先初始化接着往下做
初始化前可先拉取对应的镜像
查看初始化需要的镜像
sudo kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
拉取
sudo kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers
kubeadm init 用于搭建控制平面节点
kubeadm join 用于搭建工作节点并将其加入到集群中
kubeadm upgrade 用于升级 Kubernetes 集群到新版本
kubeadm config 如果你使用了 v1.7.x 或更低版本的 kubeadm 版本初始化你的集群,则使用 kubeadm upgrade 来配置你的集群
kubeadm token 用于管理 kubeadm join 使用的令牌
kubeadm reset 用于恢复通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更
kubeadm certs 用于管理 Kubernetes 证书
kubeadm kubeconfig 用于管理 kubeconfig 文件
kubeadm version 用于打印 kubeadm 的版本信息
kubeadm alpha 用于预览一组可用于收集社区反馈的特性
# kubernetes-version #制定 kubernetes 版本
# image-repository #选择用于拉取镜像的容器仓库
# apiserver-advertise-address #当前 Master 主机的ip地址
# service-cidr #为服务的虚拟 IP 地址段,默认值:"10.96.0.0/12"
# pod-network-cidr #指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDR
sudo kubeadm init \
--kubernetes-version v1.26.0 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address 192.168.111.30 \
--service-cidr 10.245.0.0/12 \
--pod-network-cidr 10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm token list # 获取令牌
kubeadm token create # 创建令牌
新节点加入集群时token已过期,需要重新生成,在master执行如下命令
$ kubeadm token create --print-join-command
kubeadm join 192.168.111.30:6443 --token 6j62uf.oiy1b6apenl5c9pi \
--discovery-token-ca-cert-hash sha256:7a228dc323378d8d90e5af1b158a49dfcda8efd3ebe2d09274a9b8619c6b5539
kubeadm join 192.168.31.236:6443 --token 1uszne.hf4w4jd38xwok5r7 \
--discovery-token-ca-cert-hash sha256:31328100092458af3d12c1a28ce9acda8a44ffcd33e0f3d5d40fee0eb621765c
注意:默认K8S是不安装CNI(容器网络接口)的,需要开发者自行安装三方CNI
CNI 全称是 Container Network Interface(容器网络接口,负责容器间的网络通信),是由 CoreOS 提出的容器网络规范,k8s 网络模型采用的就是该CNI 网络模型规范,常见的CNI插件有 Calico、Flannel、Terway、Weave Net 、Canal 以及 Contiv
具体安装参考:https://kubernetes.io/docs/concepts/cluster-administration/addons
journalctl -f -u kubelet # 查看 kubelet 执行日志
1、(containerd容器版本包含CNI)当前CNI版本为1.0.0,而服务器CNI插件的版本只支持0.1.0-0.4.0
2、(containerd容器版本不包含CNI)没有安装CNI网络插件
安装教程参考这篇文章
把安装 calico 需要的镜像 calico.tar.gz 传到 xianchaomaster1、xianchaomaster2、 这个包可以从1.24到1.26都可以使用
xianchaomaster3 和 xianchaonode1 节点,手动解压:
链接:https://pan.baidu.com/s/1LnEvpmyqClh_cSdcouWnIQ?pwd=rpzh
提取码:rpzh
--来自百度网盘超级会员V2的分享
[root@xianchaomaster1 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@xianchaomaster2 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@xianchaomaster3 ~]# ctr -n=k8s.io images import calico.tar.gz
[root@xianchaonode1 ~]# ctr -n=k8s.io images import calico.tar.gz
上传 calico.yaml 到 xianchaomaster1 上,使用 yaml 文件安装 calico 网络插件 。
[root@xianchaomaster1 ~]# kubectl apply -f calico.yaml
#calico 的 STATUS 状态是 Ready,说明 k8s 集群正常运行了
kubectl get nodes -o wide
kubectl get pod -A
kubectl get deployment,pods,service -n kube-system -o wide
kubectl describe -n kube-system pod podName
kubectl logs -n kube-system podName
pod/kube-controller-manager-k8smaster1 k8smaster1【负责维护集群的状态,程序部署、故障检测、自动扩展、滚动更新】
pod/kube-scheduler-k8smaster1 k8smaster1【负责集群的资源调度,按照预定的策略将pod调度到相应的node节点上】
pod/kube-apiserver-k8smaster1 k8smaster1【资源操作的唯一入口,接受用户输入的指令,提供认证、授权、API注册和发现等机制】
pod/etcd-k8smaster1 k8smaster1【负责存储集群中各种资源的对象信息】
pod/kube-proxy-xxxxx k8smaster1【负责提供集群内部的服务发现和负载均衡】
#把 busybox-1-28.tar.gz 上传到 xianchaonode1 节点,手动解压
[root@xianchaonode1 ~]# ctr images import busybox-1-28.tar.gz
kubectl run busybox --image docker.io/library/busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
#通过上面可以看到能访问网络,说明 calico 网络插件已经被正常安装了
https://blog.csdn.net/VIP099/article/details/106748278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167971355116800184183492%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167971355116800184183492&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-9-106748278-null-null.142^v76^control_1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%20k8s%E6%B5%8B%E8%AF%95pod%E9%9B%86%E7%BE%A4%E7%BD%91%E7%BB%9C&spm=1018.2226.3001.4187
https://blog.csdn.net/VIP099/article/details/106748278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167971355116800184183492%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167971355116800184183492&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-9-106748278-null-null.142^v76^control_1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%20k8s%E6%B5%8B%E8%AF%95pod%E9%9B%86%E7%BE%A4%E7%BD%91%E7%BB%9C&spm=1018.2226.3001.4187
[外链图片转存中…(img-U67FtFdy-1680265174668)]
[外链图片转存中…(img-Go9oVPY7-1680265174668)]
删除这个目录下面的其他源,因为跟其他的源重复掉了
[外链图片转存中…(img-9Id2ozxr-1680265174669)]