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
相关推荐
9号达人30 分钟前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户4973573379841 分钟前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso42 分钟前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
wuxingge1 小时前
k8s部署xxl-job
容器·kubernetes
追逐时光者1 小时前
精选 8 个 .NET 开发实用的类库,效率提升利器!
后端·.net
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展
想用offer打牌2 小时前
面试官问Redis主从延迟导致脏数据读怎么解决?
redis·后端·面试
appearappear2 小时前
Mac 上重新安装了Cursor 2.2.30,重新配置 springboot 过程记录
java·spring boot·后端
谷哥的小弟3 小时前
Spring Framework源码解析——RequestContext
java·后端·spring·框架·源码
IT_陈寒3 小时前
Vite 5大优化技巧:让你的构建速度飙升50%,开发者都在偷偷用!
前端·人工智能·后端