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

Lentr0py 2024-10-06 09:37:01 阅读 55

从零开始搭建Kubernetes集群

从零开始搭建Kubernetes (K8s) 集群部署方式准备工作(所有节点)1. 关闭防火墙2. 关闭 SELinux3. 关闭 Swap 分区4. 设置主机名5. 配置网络设置6. 安装 IPVS(可选,非必须)

安装 Docker、kubeadm、kubelet 和 kubectl1. 安装 Docker2. 安装 cri-docker3. 安装 kubeadm、kubelet 和 kubectl

部署 Kubernetes 的 Master 节点1. 初始化 Master 节点2. 设置3. 配置网络插件配置网络插件

4. 加入其他节点常见问题排查

参考列表

总结

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

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

部署方式

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

kubeadm

<code>kubeadm 是一个 K8s 部署工具,提供了 kubeadm initkubeadm join,用于快速部署 K8s 集群。官网地址: Kubeadm | Kubernetes

二进制包

从 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 的步骤:

安装ipset:

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

sudo apt update

sudo apt install ipset

对于基于 CentOS/RHEL 的系统,可以使用 yum 包管理器安装:

sudo yum install ipset

安装ipvsadm:

同样地,ipvsadm 通常也是作为软件包提供的,可以使用相应的包管理器进行安装。在 Debian/Ubuntu 中可以使用 apt:

sudo apt update

sudo apt install ipvsadm

在 CentOS/RHEL 中可以使用 yum:

sudo yum install ipvsadm

确认安装:

安装完成后,可以通过运行以下命令来验证 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。以下是几种网络插件的简单介绍及其配置方法。

Flannel

Flannel 是一种简单且常用的网络插件,适用于对网络性能要求不高的场景。部署 Flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Calico

Calico 提供了高级的网络策略支持和更强的网络安全性,是生产环境中常见的选择。部署 Calico:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

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:<code>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:Node 无法加入集群

原因:节点加入时可能会由于网络问题或令牌过期等原因失败。解决方案

检查 Master 节点的防火墙设置,确保 6443 端口是开放的。如果令牌过期,重新生成一个加入令牌并重新尝试加入:

kubeadm token create --print-join-command

这条命令会生成新的加入命令,直接在 Node 上执行即可。

问题3:Pod 网络无法通信

原因:可能是网络插件未正确部署或配置错误。解决方案

确认网络插件是否成功部署,并使用 kubectl get pods -n kube-system 检查插件状态。如果使用 Flannel,检查 kube-flannel.yml 配置文件中的 pod-network-cidr 设置是否与 kubeadm init 中的一致。

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

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

参考列表

Kubernetes 官方文档

Kubernetes Documentation用于了解和配置 Kubernetes 的集群设置、网络插件等相关内容。

阿里云容器镜像服务

阿里云容器镜像服务提供了如何在国内通过阿里云加速拉取 Kubernetes 镜像的指导。

kube-flannel 网络插件文档

Flannel GitHub Repository参考了有关 Flannel 网络插件的配置方法和注意事项。

Calico 网络插件文档

Calico Documentation提供了如何安装和配置 Calico 作为 Kubernetes 网络插件的详细说明。

Weave Net 文档

Weave Net Documentation介绍了 Weave Net 网络插件的安装和配置步骤。

Container Network Interface (CNI) 插件介绍

CNI Plugins Documentation用于了解 Kubernetes 中使用的 CNI 插件及其配置选项。

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

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

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

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

总结

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




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。