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的主机名称
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 版本前后对比
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
官方安装教程
kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 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
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 # 重启并查看状态
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
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 # 创建令牌
kubeadm join 192.168.111.30:6443 --token 6j62uf.oiy1b6apenl5c9pi \
--discovery-token-ca-cert-hash sha256:7a228dc323378d8d90e5af1b158a49dfcda8efd3ebe2d09274a9b8619c6b5539
journalctl -f -u kubelet # 查看 kubelet 执行日志
1、(containerd容器版本包含CNI)当前CNI版本为1.0.0,而服务器CNI插件的版本只支持0.1.0-0.4.0
2、(containerd容器版本不包含CNI)没有安装CNI网络插件
安装教程参考这篇文章
kubectl get nodes -o wide
kubectl get deployment,pods,service -n kube-system -o wide
kubectl describe -n kube-system pod podName
kubectl logs -n kube-system podName
deployment.apps/calico-kube-controllers 【calica 网络组件】
deployment.apps/coredns 【CoreDNS 在K8sv1.12版本之后成为K8S集群默认的DNS服务,主要用作服务发现】
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/kube-dns 【K8S的DNS服务】