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
相关推荐
chxii2 小时前
Spring Boot 响应给客户端的常见返回类型
java·spring boot·后端
韩立学长2 小时前
【开题答辩实录分享】以《植物爱好者交流平台的设计与实现》为例进行答辩实录分享
spring boot·后端·mysql
Wzx1980123 小时前
go基础语法练习
开发语言·后端·golang
sp423 小时前
漫谈 Java 轻量级的模板技术:从字符串替换到复杂模板
java·后端
2301_795167203 小时前
玩转Rust高级应用. ToOwned trait 提供的是一种更“泛化”的Clone 的功能,Clone一般是从&T类型变量创造一个新的T类型变量
开发语言·后端·rust
草莓熊Lotso3 小时前
C++ 方向 Web 自动化测试实战:以博客系统为例,从用例到报告全流程解析
前端·网络·c++·人工智能·后端·python·功能测试
一 乐4 小时前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
开发语言·前端·数据库·vue.js·spring boot·后端·旅游
JaguarJack4 小时前
15 个 Eloquent 高级技巧,瞬间提升你的 Laravel 应用性能
后端·php·laravel
YDS8294 小时前
苍穹外卖 —— Spring Cache和购物车功能开发
java·spring boot·后端·spring·mybatis