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地址,端口是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
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-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