首页 > 其他分享 >从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程

从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程

时间:2024-08-12 12:22:52浏览次数:14  
标签:教程 Kubernetes -- sudo apt 从零开始 docker kubeadm

从零开始搭建Kubernetes集群

从零开始搭建Kubernetes (K8s) 集群

在这篇博客中,我们将详细介绍如何从零开始搭建 Kubernetes (K8s) 集群。本文涵盖了准备工作、安装必要组件、部署 K8s 的 Master 和 Node 节点,以及网络插件的配置。需要注意的是,由于 Kubernetes 版本迭代较快,某些组件可能无法向下兼容,请根据实际情况进行安装。

部署方式

目前生产部署 Kubernetes 集群主要有两种方式:

  1. kubeadm

    • kubeadm 是一个 K8s 部署工具,提供了 kubeadm initkubeadm join,用于快速部署 K8s 集群。
    • 官网地址: Kubeadm | Kubernetes
  2. 二进制包

    • 从 GitHub 下载发行版的二进制包,手动部署每个组件,组成 K8s 集群。
    • 虽然 kubeadm 降低了部署门槛,但屏蔽了很多细节,遇到问题时较难排查。如果想要更灵活和可控,推荐使用二进制包部署 K8s 集群,虽然手动部署麻烦,但可以学到更多工作原理,也有利于后期维护。

本文教程主要是展示kubeadm工具搭建kubernetes集群的过程。

准备工作(所有节点)

在开始部署之前,我们需要对所有节点进行以下准备工作。

1. 关闭防火墙

# 关闭防火墙
systemctl stop firewalld

# 禁止防火墙开机自启
systemctl disable firewalld

2. 关闭 SELinux

# 永久关闭 SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 重启系统使更改生效
reboot

# 临时关闭 SELinux
setenforce 0

3. 关闭 Swap 分区

# 永久关闭 Swap 分区
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 重启系统
reboot

# 临时关闭 Swap 分区
swapoff -a

在搭建 Kubernetes 集群之前关闭防火墙、SELinux(Security-Enhanced Linux)以及禁用 swap 分区通常有以下原因:

1. 防火墙:
   - Kubernetes 集群中的各个节点需要通过一系列网络端口进行通信,包括 API 服务器、kubelet、etcd 等。关闭防火墙可以避免阻碍节点之间的网络通信,确保集群的正常运行。
   - 在生产环境中,建议使用网络策略(Network Policies)来限制 Pod 之间和 Pod 与外部的网络通信,而不是完全关闭防火墙。

2. SELinux:
   - SELinux 是一个 Linux 内核的安全模块,用于强化系统的安全性。但是,它有时会与 Kubernetes 组件和容器运行时产生冲突,导致权限问题和功能受限。
   - 关闭 SELinux 可以简化 Kubernetes 集群的配置和维护,避免潜在的权限问题。

3. 禁用 Swap 分区:
   - Kubernetes 对内存的管理和调度依赖于 Linux 内核的内存管理机制。Swap 分区的存在可能导致内存调度行为不稳定,从而影响容器的性能和稳定性。
   - Kubernetes 官方建议在所有集群节点上禁用 swap 分区,以确保容器可以充分利用主机的物理内存,并避免因为交换空间导致的性能问题。

虽然关闭防火墙、SELinux 和禁用 swap 分区可以简化 Kubernetes 的搭建和维护,但同时也会降低系统的安全性。在生产环境中,建议根据安全策略来适当配置防火墙规则,并针对 SELinux 进行合适的配置,以确保系统安全性和 Kubernetes 的正常运行。

4. 设置主机名

# 设置主机名(以 node1 为例)
hostnamectl set-hostname node1

# 或者直接修改 /etc/hostname 文件,内容为:
node1

在每个节点上添加 hosts 文件的配置:

cat >> /etc/hosts << EOF
10.154.22.10 Ubuntu-Server
10.152.193.47 k8sNode1
10.152.193.47 k8sNode2
10.152.193.47 k8sNode3
10.152.193.47 k8sNode4
10.152.193.47 k8sNode5
10.152.193.47 k8sNode6
...
EOF

5. 配置网络设置

为所有节点添加网桥过滤和地址转发功能:

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

# 加载 br_netfilter 模块
modprobe br_netfilter

# 查看是否加载成功
lsmod | grep br_netfilter

# 应用新的配置
sysctl --system

所有节点执行时间同步:

# 启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
date  

6. 安装 IPVS(可选,非必须)

安装 ipset 和 ipvsadm 在搭建 Kubernetes 集群中通常是为了使用 IPVS(IP Virtual Server)模式作为 Kubernetes 的服务代理模式。IPVS 是一种高性能的四层负载均衡器,可以提供更高的性能和更低的延迟,特别是在大规模的服务负载下。

以下是在每个节点上安装 ipset 和 ipvsadm 的步骤:

  1. 安装ipset:

    • 在大多数 Linux 发行版中,ipset 包是作为软件包管理系统的一部分提供的,可以直接使用包管理器进行安装。例如,在基于 Debian/Ubuntu 的系统中,可以使用 apt 包管理器安装:
      sudo apt update
      sudo apt install ipset
      
    • 对于基于 CentOS/RHEL 的系统,可以使用 yum 包管理器安装:
      sudo yum install ipset
      
  2. 安装ipvsadm:

    • 同样地,ipvsadm 通常也是作为软件包提供的,可以使用相应的包管理器进行安装。在 Debian/Ubuntu 中可以使用 apt:
      sudo apt update
      sudo apt install ipvsadm
      
    • 在 CentOS/RHEL 中可以使用 yum:
      sudo yum install ipvsadm
      
  3. 确认安装:

    • 安装完成后,可以通过运行以下命令来验证 ipset 和 ipvsadm 是否已成功安装:
      ipset --version
      ipvsadm --version
      
    • 如果成功安装,会显示相应的软件包版本信息。

安装完 ipset 和 ipvsadm后,你可以将 Kubernetes 的服务代理模式设置为 IPVS。在使用 kubeadm 初始化集群时,可以通过传递 --feature-gates=SupportIPVSProxyMode=true 参数来启用 IPVS 代理模式。

请注意,在使用 IPVS 作为服务代理模式时,你需要确保所使用的内核支持 IPVS 并且相关的内核模块已加载

完整步骤命令:

# 安装 ipset 和 ipvsadm
sudo apt update
sudo apt install ipset ipvsadm

# 验证安装
ipset --version
ipvsadm --version

安装 Docker、kubeadm、kubelet 和 kubectl

1. 安装 Docker

参考 Docker 官方文档 进行安装:

# 移除旧版本
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# 安装必要的依赖
sudo apt-get update
sudo apt-get install ca-certificates curl

# 添加 Docker 的 GPG 密钥和软件源
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# 安装 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 设置 Docker 镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

# 重新加载 Docker 配置
sudo systemctl daemon-reload
sudo systemctl restart docker

#验证加速器是否生效。使用以下命令验证 Docker 是否使用了国内镜像加速器:
docker info

2. 安装 cri-docker

由于 1.24 以及更高版本的 Kubernetes 不支持 Docker,所以需要安装 cri-docker:

:但如果使用containerd作为容器运行时,则不需要这部分配置。或者打算使用其他 CRI 插件,可以跳过 cri-docker 的安装部分

# 下载 cri-docker
wget https://ghproxy.com/https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.5/cri-dockerd-0.2.5.amd64.tgz 

# 解压并安装
tar xvf cri-dockerd-0.2.5.amd64.tgz 
sudo cp cri-dockerd/cri-dockerd /usr/bin/

# 配置 cri-docker 服务
cat > /usr/lib/systemd/system/cri-docker.service <<EOF 
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

# 配置 cri-docker socket
cat > /usr/lib/systemd/system/cri-docker.socket <<EOF 
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

# 启动 cri-docker
systemctl daemon-reload 
systemctl enable cri-docker --now

3. 安装 kubeadm、kubelet 和 kubectl

添加 Kubernetes 的 APT 软件源:

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

更新包索引并安装 kubeadm、kubelet 和 kubectl:

sudo apt update
sudo apt install -y kubelet kubeadm kubectl

# 启动 kubelet 并设置开机自启
sudo systemctl start kubelet
sudo systemctl enable kubelet

# 配置 kubectl 环境变量
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
source ~/.bashrc

部署 Kubernetes 的 Master 节点

1. 初始化 Master 节点

kubeadm init \
  --apiserver-advertise-address=10.154.22.10 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version $(kubeadm version -o short) \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket unix:///var/run/cri-dockerd.sock

--apiserver-advertise-address 参数中指定 Master 节点的 IP 地址,--pod-network-cidr 参数用于指定 Pod 网络的 IP 地址段,--cri-socket参数用于指定所使用的容器运行时。

看到successfully就是成功了,先不要急着关掉页面,下面会有加入节点的命令,记得复制,就是有token的那句。

2. 设置

kubectl 访问权限
完成初始化后,kubeadm init 会生成一个 kubeconfig 文件,保存在 /etc/kubernetes/admin.conf。你需要将这个文件复制到你想要使用 kubectl 的用户的 ~/.kube 目录下。
kubeadm init 命令成功执行后,会提示如何设置 kubectl 访问权限,复制并执行以下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. 配置网络插件

配置网络插件

在 Kubernetes 集群中,网络插件负责管理 Pod 之间的网络通信。常见的网络插件包括 Flannel、Calico 和 Weave Net。以下是几种网络插件的简单介绍及其配置方法。

  1. Flannel

    • Flannel 是一种简单且常用的网络插件,适用于对网络性能要求不高的场景。
    • 部署 Flannel:
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  2. Calico

    • Calico 提供了高级的网络策略支持和更强的网络安全性,是生产环境中常见的选择。
    • 部署 Calico:
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    
  3. Weave Net

    • Weave Net 支持跨数据中心的网络方案,并且配置相对简单。
    • 部署 Weave Net:
    kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')
    

根据具体需求和使用场景选择合适的网络插件,并按上述命令进行配置。

如果选择的是Flannel插件,执行完 kube-flannel.yml 后,可以使用以下命令查看 Pod 状态:

kubectl get pods -n kube-system

4. 加入其他节点

在 Master 节点完成初始化后,使用输出的 kubeadm join 命令在其他节点上加入集群。例如:

kubeadm join 10.154.22.10:6443 --token <token> \
    --discovery-token-ca-cert-hash sha256:<hash> \
    --cri-socket unix:///var/run/cri-dockerd.sock

默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token:

kubeadm token create --print-join-command

在所有节点加入集群后,可以使用以下命令查看节点状态:

kubectl get nodes

如果有nodes的STATUS没有Ready,可以使用kubectl describe node <node-name>命令来看具体节点的详细信息,看Conditions: 节点当前的状态和条件和Events: 发生在节点上的事件记录,这两项来排查错误。

如果顺利的话,现在k8s集群已经搭建完成了,可以拉个pod测试一下~
pod

常见问题排查

在搭建 Kubernetes 集群的过程中,可能会遇到一些常见的错误。以下列出了一些可能遇到的问题及其解决方法。

  1. 问题1:kubeadm init 失败,提示镜像拉取失败

    • 原因:Kubernetes 需要拉取特定版本的镜像,如果无法访问默认的 Google 镜像仓库,可能会导致镜像拉取失败。
    • 解决方案
      • 使用国内的镜像仓库,如阿里云镜像仓库:
      kubeadm init \
        --apiserver-advertise-address=10.154.22.10 \
        --image-repository registry.aliyuncs.com/google_containers \
        --kubernetes-version $(kubeadm version -o short) \
        --service-cidr=10.96.0.0/12 \
        --pod-network-cidr=10.244.0.0/16 \
        --cri-socket unix:///var/run/cri-dockerd.sock
      
  2. 问题2:Node 无法加入集群

    • 原因:节点加入时可能会由于网络问题或令牌过期等原因失败。
    • 解决方案
      • 检查 Master 节点的防火墙设置,确保 6443 端口是开放的。
      • 如果令牌过期,重新生成一个加入令牌并重新尝试加入:
      kubeadm token create --print-join-command
      
      这条命令会生成新的加入命令,直接在 Node 上执行即可。
  3. 问题3:Pod 网络无法通信

    • 原因:可能是网络插件未正确部署或配置错误。
    • 解决方案
      • 确认网络插件是否成功部署,并使用 kubectl get pods -n kube-system 检查插件状态。
      • 如果使用 Flannel,检查 kube-flannel.yml 配置文件中的 pod-network-cidr 设置是否与 kubeadm init 中的一致。

如果遇到其他问题,也可以参考 Kubernetes 官方文档或社区资源进行排查。

:因版本迭代,设备差异,环境不同,等等奇怪的原因,搭建过程很可能出现bug,报错之类的,(建议谷歌搜搜)还是要具体问题具体分析,根据实际情况来搭建。

参考列表

  1. Kubernetes 官方文档

  2. 阿里云容器镜像服务

  3. kube-flannel 网络插件文档

  4. Calico 网络插件文档

    • Calico Documentation
    • 提供了如何安装和配置 Calico 作为 Kubernetes 网络插件的详细说明。
  5. Weave Net 文档

  6. Container Network Interface (CNI) 插件介绍

  7. 从零搭建k8s集群 - 许大仙 - 博客园 (cnblogs.com)

  8. kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎 (zhihu.com)

  9. Kubernetes最新版2023.07v1.27.4安装和集群搭建保姆级教程 - 知乎 (zhihu.com)

  10. Kubernetes 1.24 1.25 集群使用docker作为容器

总结

本文详细讲解了如何从零开始搭建一个 Kubernetes 集群。希望本文对您的学习和工作有所帮助。


标签:教程,Kubernetes,--,sudo,apt,从零开始,docker,kubeadm
From: https://blog.csdn.net/Lentr0py/article/details/141127252

相关文章

  • React Router 6 (React路由) 最详细教程
    ReactRouter6(React路由)最详细教程蒋川 2022-03-29阅读 5 分钟3 ReactRouter 经历多个版本的发展,现在已经到了 ReactRouter6。虽然网络上写React-Router路由本身的教程很多,但真正讲到React-Router6的并不多。同时因为第6版引......
  • Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)
    一、并行性和超时您可以指示TestNG以各种方式在单独的线程中运行测试。可以通过在suite标签中使用parallel属性来让测试方法运行在不同的线程中。这个属性可以带有如下这样的值:二、并行套件(suites)如果您正在运行多个套件文件(例如“ javaorg.testng.TestNGtestng1.xml......
  • postman 安装使用教程---图文讲解
    一、安装postman1,安装包安装官网下载地址:https://www.getpostman.com选择好对应的版本下载,下载完后直接安装2,插件包安装可以在谷歌的应用商店里面找到,或者在网上下载。准备了一个配置完整的postman插件包http://download.csdn.net/detail/qazwsxpcm/9823420下载完成后打......
  • 普通人快速上手“低代码平台”?最详细教程地址都在这!
    普通人用好低代码平台,可以从以下几个方面入手:一、明确需求和目标了解应用场景:首先明确你想通过低代码平台解决什么问题,比如是快速搭建一个内部管理系统、客户关系管理系统(CRM)还是其他类型的应用。设定具体目标:设定清晰、可衡量的目标,比如完成应用的搭建时间、预期的用户体验......
  • 【后端】Beego使用教程
    目录一、Beego使用步骤1.1安装Beego1.2创建新项目        1.3进入项目目录1.4运行项目1.5创建控制器1.6定义路由1.7创建视图模板1.8修改控制器以渲染视图二、Beego高级功能2.1配置Beego2.2使用ORM2.3静态文件服务2.4中间件(Middleware)2.5......
  • C语言入门教程——手把手教零基础/新手入门(完整C语言学习笔记整理)
    前言    作为一名拥有多年开发经验的技术人员,我的职业生涯涵盖了多种编程语言,包括C语言、C++、C#和JavaScript等。出于对编程的热爱以及希望帮助更多初学者的目的,我决定利用业余时间整理一套全面的C语言学习指南。这套指南旨在为C语言初学者和编程爱好者提供......
  • 使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
    使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)使用OpenAI模型体验GraphRag——以《边城》为例在使用SiliconCloud之前,先使用OpenAI的模型看看GraphRag的效果。GraphRAG是一种基于AI的内容理解和搜索能力,利用LLMs,解析数据以创建知识图谱,并对用户......
  • 数据恢复软件EasyRecovery16最新破解版本下载安装图文激活教程
    EasyRecovery16作为一款专业的数据电脑恢复软件,除了有着优秀的数据恢复能力外,还有许多便捷的操作技巧。即便是对于计算机很是白目的使用者来说,OntackEasyRecovery也是值得入手的,使用者不必大费周章去备份重要的文件,整日担心文件的丢失问题或者忙碌于文件的实时备份。OntackEa......
  • R 语言学习教程,从入门到精通,R 数据类型(6)
    1、R数据类型数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。R语言中的最基本数据类型主要有三种:数字逻辑文本数字常量主要有两种:逻辑类型在许多其他编程语言中常称为布尔型(Boolea......
  • 24年最新版百度网盘下载不限速保姆级使用教程
    ​现在仅支持PC端后续会支持移动端和批量解析-------欢迎回家-------https://aihuchuan.aifenxiang.net.cn/------用自带浏览器打开------1、解析前还要先下载安装完并打开Motrix下载器Window安装Motrix.exeMac安装Motrix.dmg解析文件时Motrix必须打开不然接收不到......