kubeadm安装k8s集群
上学那会儿就开始听到k8s这个概念了,没想要工作头发都快掉光了,还没实操下k8s,今天终于有幸能实操一番这里将实操的步骤记录下来分享给广大网友,如果能帮助到大家,那就太棒了!!!
kubeadm安装k8s集群
前言
上学那会儿就开始听到k8s这个概念了,没想要工作头发都快掉光了,还没实操下k8s,今天终于有幸能实操一番
这里将实操的步骤记录下来分享给广大网友,如果能帮助到大家,那就太棒了!!!
基础要求
这里笔者准备了3台某云上的Linux机器来安装k8s v1.34这个最新的版本,接下来所有命令都是用root执行的,另外如果有些镜像仓库太慢,可自行替换
Linux机器要满足如下条件:
- 一台兼容的Linux主机,提供通用的Linux指令
- 内存2GB或更多
- CPU2核或更多
- 集群内机器要互相连接
- 节点不可以有重复的主机名、MAC地址或product_uuid
主机名相关命令
# 查看主机名 hostname # 临时修改主机名 hostname xxx # 永久修改主机名 hostnamectl set-hostname xxx
查询MAC地址相关命令
ifconfig -a # 或 ip address
查询product_uuid
cat /sys/class/dmi/id/product_uuid
前置处理
配置下3台机器的域名解析
echo 'your_ip your_hostname' >> /etc/hosts
关闭防火墙,或开启k8s集群需要的端口,这里简单点,直接把防火墙关闭
# 查看防火墙的状态 systemctl status firewalld # 停止防火墙 systemctl stop firewalld # 永久关闭 systemctl disable firewalld # 或 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 永久关闭 chkconfig iptables off
关闭分区交换,kubelet的默认行为是在节点上检测到交换内存时无法启动。这意味着要么禁用交换功能,要么让kubelet容忍交换
# 查看有无分区 free -h # 临时关闭分区 sudo swapoff -a # 永久关闭,在 /etc/fstab 中移除或禁用该分区 sed -r 's/.*swap.*/#&/' /etc/fstab
禁用SELinux
# 查看SELinux的状态 sestatus # 将 SELinux 设置为 permissive 模式(相当于将其禁用) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
启用 IPv4 数据包转发,默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由,所以需要手动启用 IPv4 数据包转发
# 永久开启 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 需要遵循特定的过程
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文档进行
# 下载docker yum install -y docker-ce # 启动docker systemctl enable --now docker
修改docker的cgroup驱动为systemd,在docker配置文件/etc/docker/daemon.json中,添加如下配置
{ "exec-opts":[ "native.cgroupdriver=systemd" ] }
重启docker
systemctl restart docker
安装cri-dockerd
docker 没有实现 cri, k8s 在 v1.24 已处理cri-dockerd,所以这里要安装cri-dockerd 来实现 docker 和 kubernetes 集成
# 下载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管理
# 获取配置文件,放置到对应位置 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
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
启动kubelet
# 启动kubelet systemctl enable --now kubelet.service # 查看状态 systemctl status kubelet
安装集群,要确保service、pid和真机ip不冲突
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中的资源
# 普通用户 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工作节点
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地址,端口是6443token: 登录令牌,可以在控制平面节点上通过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
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-system和tigera-operator,看这2个命名空间下的pod是否运行成功以及状态是否改为Ready
给几个验证命令
kubectl get nodeskubectl get ns、kubectl get pods -n tigera-operator、kubectl get pods -n calico-systemkubectl get cskubectl get svc -n kube-system、dig -t a www.baidu.com @前面查出的dns-ip
更多推荐

所有评论(0)