kubeadm安装k8s集群

kubeadm安装k8s集群

前言

上学那会儿就开始听到k8s这个概念了,没想要工作头发都快掉光了,还没实操下k8s,今天终于有幸能实操一番

这里将实操的步骤记录下来分享给广大网友,如果能帮助到大家,那就太棒了!!!

基础要求

这里笔者准备了3台某云上的Linux机器来安装k8s v1.34这个最新的版本,接下来所有命令都是用root执行的,另外如果有些镜像仓库太慢,可自行替换

Linux机器要满足如下条件:

  • 一台兼容的Linux主机,提供通用的Linux指令
  • 内存2GB或更多
  • CPU2核或更多
  • 集群内机器要互相连接
  • 节点不可以有重复的主机名、MAC地址或product_uuid

主机名相关命令

shell 复制代码
# 查看主机名
hostname
# 临时修改主机名
hostname xxx
# 永久修改主机名
hostnamectl set-hostname xxx

查询MAC地址相关命令

shell 复制代码
ifconfig -a
# 或
ip address

查询product_uuid

shell 复制代码
cat /sys/class/dmi/id/product_uuid

前置处理

配置下3台机器的域名解析

shell 复制代码
echo 'your_ip your_hostname' >> /etc/hosts

关闭防火墙,或开启k8s集群需要的端口,这里简单点,直接把防火墙关闭

shell 复制代码
# 查看防火墙的状态
systemctl status firewalld
# 停止防火墙
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld

# 或

# 查看防火墙状态
service iptables status
# 停止防火墙
service iptables stop
# 永久关闭
chkconfig iptables off

关闭分区交换,kubelet的默认行为是在节点上检测到交换内存时无法启动。这意味着要么禁用交换功能,要么让kubelet容忍交换

shell 复制代码
# 查看有无分区
free -h
# 临时关闭分区
sudo swapoff -a
# 永久关闭,在 /etc/fstab 中移除或禁用该分区
sed -r 's/.*swap.*/#&/' /etc/fstab

禁用SELinux

shell 复制代码
# 查看SELinux的状态
sestatus
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

启用 IPv4 数据包转发,默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由,所以需要手动启用 IPv4 数据包转发

shell 复制代码
# 永久开启 IPv4 数据包转发
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 验证,为1说明设置成功
sysctl net.ipv4.ip_forward

以上操作是每台机器都要做的

安装容器运行时

这里先讲下cgroup驱动,后面会用到。 Linux中cgroup控制组用来限制分配给进程的资源。kubelet和容器运行时都需要cgroup来强制为pod管理的资源设置请求和限制,关键的是kubelet和容器运行时需要相同的cgroup驱动并且采用相同的配置。 可用的cgroup驱动有两个: cgroupfs 和 systemd。 Linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。 当 systemd 是初始化系统时, 不推荐使用 cgroupfs 驱动,因为 systemd 期望系统上只有一个 cgroup 管理器。 此外,如果你使用 cgroup v2, 则应用 systemd cgroup 驱动取代 cgroupfs

安装docker

添加k8s的yum仓库,在仓库定义中的 exclude 参数确保了与 Kubernetes 相关的软件包在运行 yum update 时不会升级,因为升级 Kubernetes 需要遵循特定的过程

shell 复制代码
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

这里笔者选择了docker,Linux上其实已经安装了,下面给出了使用yum安装的相关命令,你也可以使用其它包管理器安装,具体可根据自己的Linux版本参考安装docker文档进行

shell 复制代码
# 下载docker
yum install -y docker-ce
# 启动docker
systemctl enable --now docker

修改docker的cgroup驱动为systemd,在docker配置文件/etc/docker/daemon.json中,添加如下配置

json 复制代码
{
  "exec-opts":[
    "native.cgroupdriver=systemd"
  ]
}

重启docker

shell 复制代码
systemctl restart docker

安装cri-dockerd

docker 没有实现 cri, k8s 在 v1.24 已处理cri-dockerd,所以这里要安装cri-dockerd 来实现 docker 和 kubernetes 集成

shell 复制代码
# 下载cri-dockerd压缩包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.20/cri-dockerd-0.3.20.amd64.tgz
# 解压
tar -xvf cri-dockerd-0.3.20.amd64.tgz
# 放到可执行目录
install -o root -g root -m 0755 cri-dockerd/cri-dockerd /usr/local/bin
# 查看版本
cri-dockerd --version

集成到systemd,通过systemctl管理

shell 复制代码
# 获取配置文件,放置到对应位置
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/refs/tags/v0.3.20/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/refs/tags/v0.3.20/packaging/systemd/cri-docker.socket
install -o root -g root -m 0644 cri-docker.service /usr/lib/systemd/system
install -o root -g root -m 0644 cri-docker.socket /usr/lib/systemd/system
# 开启cri-dockerd,并设置开机启动,cri-dockerd通过pod-infra-container-image参数能够接受指定用作 Pod 的基础容器的容器镜像
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.k8s.io/pause:3.10,' /usr/lib/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket
systemctl enable --now cri-docker.service
systemctl status cri-docker

kubeadm安装集群

使用yum安装kubeadm、kubelet和kubectl

shell 复制代码
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

启动kubelet

shell 复制代码
# 启动kubelet
systemctl enable --now kubelet.service
# 查看状态
systemctl status kubelet

安装集群,要确保service、pid和真机ip不冲突

shell 复制代码
kubeadm init --apiserver-advertise-address=your-control-plane-host  \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock

设置k8s的配置文件,否则无法访问k8s中的资源

shell 复制代码
# 普通用户
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# root用户
export KUBECONFIG=/etc/kubernetes/admin.conf

通过kubectl get nodes查看集群节点信息,若可以则成功

添加Linux工作节点

前置条件:安装所需的组件:kubeadm、kubelet和容器运行时

使用下列命令向k8s集群添加Linux工作节点

shell 复制代码
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash> --cri-socket unix:///var/run/cri-dockerd.sock
  • <control-plane-host>:<control-plane-port>: k8s集群控制面板节点上的api-server地址,端口是6443
  • token: 登录令牌,可以在控制平面节点上通过kubeadm token list查看,若不存在,可通过kubeadm token create创建
  • discovery-token-ca-cert-hash: 可以在控制平面节点上通过cat /etc/kubernetes/pki/ca.crt | openssl x509 -pubkey | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'获取
  • cri-socket: 指定cri,工作节点上有多个cri的话一定要指定一个

再提一个简单的命令kubeadm token create --print-join-command可直接生成添加工作节点的命令【不包含指定cri】

添加完工作节点后,可以在控制平面节点上通过kubectl get nodes查看对应信息

安装pod网络插件Calico

到这一步,我们通过kubectl get nodes查看集群节点信息可以看到3台机器状态都是NotReady

shell 复制代码
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.0/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.31.0/manifests/custom-resources.yaml

# 需要修改下custom-resources.yaml中的spec.calicoNetwork.ipPools.cidr为上述我们设置的pod-network-cidr

kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml

执行完后会多2个命名空间calico-systemtigera-operator,看这2个命名空间下的pod是否运行成功以及状态是否改为Ready

给几个验证命令

  • kubectl get nodes
  • kubectl get nskubectl get pods -n tigera-operatorkubectl get pods -n calico-system
  • kubectl get cs
  • kubectl get svc -n kube-systemdig -t a www.baidu.com @前面查出的dns-ip
相关推荐
GetcharZp25 分钟前
告别繁琐命令行!这款容器可视化神器,让 Docker/K8s 管理变得如此简单
后端
铁皮饭盒4 小时前
bun直接tsx,优雅!
javascript·后端
Cosolar5 小时前
藏在 Claude Code 里的极致浪漫:完整 187 条 Spinner Verbs 全收录
后端·程序员·代码规范
Csvn5 小时前
Linux 防火墙管理 — firewalld 实战
后端
Csvn5 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
leeyi6 小时前
Multi-Agent:让多个 AI 分工协作完成复杂任务
后端·aigc·agent
长栎6 小时前
你的策略模式是 Map<String, Strategy>?那不过是最廉价的 if-else 替代品
后端
长栎6 小时前
你写的 abstract class 里全是钩子方法——模板模式不是让你填空,是让你别越界
后端
ping某6 小时前
语法树,到底是一棵什么形状的树?
后端
_柳青杨6 小时前
一文吃透 Node.js 事件循环:从原理到 Node 20+ 重大变更
javascript·后端