Debian11之基于kubeadm安装K8S(v1.26.0) 集群

硬件要求

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的主机名称
hostnamectl set-hostname k8snode2 && hostname # 设置从节点2的主机名称
hostnamectl set-hostname k8snode3 && hostname # 设置从节点3的主机名称
hostnamectl set-hostname k8snode4 && hostname # 设置从节点4的主机名称
hostnamectl set-hostname k8snode5 && hostname # 设置从节点5的主机名称
  • 配置各节点的Host文件
vi /etc/hosts # 编辑文件,注意不能有空格
192.168.111.30 k8smaster
192.168.111.33 k8snode1
192.168.111.34 k8snode2
192.168.111.35 k8snode3
192.168.111.36 k8snode4
192.168.111.37 k8snode5
  • 关闭各节点的防火墙
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 版本前后对比
    Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第1张图片
    Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第2张图片
    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

各节点安装容器运行时以及配置

  • 容器运行时安装
    docker安装
    containerd安装(cri-containerd-1.6.15)不带CNI插件

各节点安装kubeadm、kubectl、kubelet

Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第3张图片

  • kubeadm:用来初始化集群的指令
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等
  • kubectl:用来与集群通信的命令行工具

官方安装教程

kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本

  • 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
  • 下载 Google Cloud 公开签名秘钥
# sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 将证书下载到/usr/share/keyrings/kubernetes-archive-keyring.gpg
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
  • 添加 Kubernetes apt 仓库
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
  • 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
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 # 锁定版本,标记软件包不被自动更新
  • 添加 kubelet 开机自启
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 驱动

初始化Master节点上的kubeadm

查询k8s各组件的版本号

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

常用指令

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 用于预览一组可用于收集社区反馈的特性

初始化master节点

# 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

Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第4张图片

  • Master1节点执行
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 # 创建令牌
  • 所有Node节点执行(加入Node节点到Master节点)
kubeadm join 192.168.111.30:6443 --token 6j62uf.oiy1b6apenl5c9pi \
--discovery-token-ca-cert-hash sha256:7a228dc323378d8d90e5af1b158a49dfcda8efd3ebe2d09274a9b8619c6b5539

Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第5张图片

  • 查看集群上节点的状态
    Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第6张图片
    注意:默认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网络插件
在这里插入图片描述

安装CNI(以Calico为例)后查看节点运行状况

安装教程参考这篇文章

kubectl get nodes -o wide

在这里插入图片描述

查询 kube-system 命名空间下的 deployment、pod、service 资源

kubectl get deployment,pods,service -n kube-system -o wide
kubectl describe -n kube-system pod podName
kubectl logs -n kube-system podName
  • Pod控制器
    在这里插入图片描述
deployment.apps/calico-kube-controllers 【calica 网络组件】
deployment.apps/coredns 【CoreDNS 在K8sv1.12版本之后成为K8S集群默认的DNS服务,主要用作服务发现】
  • Pod
    Debian11之基于kubeadm安装K8S(v1.26.0) 集群_第7张图片
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【负责提供集群内部的服务发现和负载均衡】
  • Service
    在这里插入图片描述
service/kube-dns   【K8S的DNS服务】

你可能感兴趣的:(Linux_Debian,kubernetes,docker,容器)