centos7.9系统下k8s+containerd集群部署
...大约 5 分钟
节点规划
节点
主机名 | ip地址 | 角色 |
---|---|---|
k8s-master | 192.168.1.251 | master |
k8s-node | 192.168.1.253 | node1 |
组件
角色 | 组件 |
---|---|
master | containerd、kubelet、kubeadm、kubectl、flannel |
node1 | containerd、kubelet、kubeadm、kubectl |
1. 节点配置
1) 登录192.168.1.251设置master主机名
hostnamectl set-hostname k8s-master
2) 登录192.168.1.253设置node主机名
hostnamectl set-hostname k8s-node-1
3) 修改hosts(两台都要修改)
vi /etc/hosts
192.168.1.251 k8s-master
192.168.1.253 k8s-node-1
4) 关闭防火墙
sudo systemctl stop firewalld && sudo systemctl disable firewalld
5) 如果开启了 swap 分区,kubelet 会启动失败(可以通过将参数 --fail-swap-on 设置为false 来忽略 swap on),故需要在每台机器上关闭 swap 分区(两台都需要)
sudo swapoff -a
6) 关闭 SELinux,否则后续 K8S 挂载目录时可能报错 Permission denied (两台都需要)
sudo setenforce 0
# 修改配置文件,使其永久生效
vi /etc/selinux/config
SELINUX=disabled
7) 时间同步(两台都需要)
yum install ntpdate -y && ntpdate time.windows.com
8) 配置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
9) 配置br_netfilter,不配置初始化易出错
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
2.安装containerd(两台都需要)
containerd官方建议系统内核4.x以上,centos7默认内核版本3.1,建议升级内核
1) 升级linux内核
# 查看内核
uname -a
# 升级
# 导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 查询可用内核版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 其中lt表示long-term,即主线版本,该版本建议慎重选择。
# 其中ml表示latest mainline,即长期稳定版本,稳定可靠,建议安装该版本
yum -y --enablerepo=elrepo-kernel install kernel-ml
# 安装完成后需要设置 grub2,即内核默认启动项
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0
# 生成 grub 配置文件并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
#验证是否成功安装
uname -a
Linux k8s-node-1 6.1.0-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Dec 11 18:09:31 EST 2022 x86_64 x86_64 x86_64 GNU/Linux
2) 安装containerd
# 安装containerd环境依赖并设置yum源并查看Containerd版本
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list | grep containerd
# 开始安装containerd,安装指定版本
yum -y install containerd.io-1.6.6-3.1.el1
# 创建containerd的配置文件并修改相应配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改镜像源为国内
vi /etc/containerd/config.toml
...省略配置
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://dockerhub.mirrors.nwafu.edu.cn"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/k8sxio"]
...省略配置
# registry.mirrors."xxx" : 表示需要配置 mirror 的镜像仓库。例如,registry.mirrors."docker.io" 表示配置 docker.io 的 mirror。
# endpoint : 表示提供 mirror 的镜像加速服务。例如,这里推荐使用西北农林科技大学提供的镜像加速服务作为 docker.io 的 mirror
# 替换sandbox_image为国内源
sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
3) 启动containerd
systemctl daemon-reload && systemctl enable containerd && systemctl restart containerd
# 查询containerd版本
ctr version
# 查询容器列表
ctr containers ls
# 查询镜像列表
ctr images ls
3.安装k8s(通过kubeadm安装)
1)指定yum 源的方式进行安装,使用阿里云的源(两台都需要执行)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 列出所有可安装的版本
yum --showduplicates list kubeadm
# 安装指定版本
yum -y install kubeadm-1.25.5 kubectl-1.25.5 kubelet-1.25.5
# 安装完成后,配置容器运行时为containerd
crictl config runtime-endpoint /run/containerd/containerd.sock
# 设置kubelet开机启动
systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet
# 查询状态会保存,后续安装kubeadm初始化、安装完flannel等插件后就没问题了
systemctl status kubelet
2) 初始化master(在k8s-master节点执行)
# 生成master初始化文件
mkdir -p ~/k8s/
cd ~/k8s
kubeadm config print init-defaults > kubeadm.yaml
# 修改配置文件,将ip地址改为192.168.1.251
vi kubeadm.yaml
...省略代码
localAPIEndpoint:
advertiseAddress: 192.168.1.251 # 主节点ip
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master # 主节点名称
...省略代码
# 保存退出编辑
# 执行初始化
kubeadm init --config=kubeadm.yaml
...省略过程
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.251:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:d981a5eb53699bd4500777db72b6224789fa21080c44798863d88c7ac7e9a52e
# 如果初始化出错,根据错误信息自行排查(错误类型太多了)
# 初始化配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点列表
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 114m v1.25.5
# 安装网络插件flannel(集群子网)
cd ~/k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
cat > /run/flannel/subnet.env <<EOF
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
# 开始安装
kubectl apply -f kube-flannel.yml
# 验证是否安装成功
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7f8cbcb969-2kpsm 1/1 Running 0 121m
coredns-7f8cbcb969-8dhzr 1/1 Running 0 121m
出现以上结果表示安装成功
3) 将节点加入集群(在k8s-node-1上执行)
kubeadm join 192.168.1.251:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:d981a5eb53699bd4500777db72b6224789fa21080c44798863d88c7ac7e9a52e
4) 在k8s-master上查看集群节点状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 129m v1.25.5
k8s-node-1 Ready <none> 116m v1.25.5
出现以上结果,节点增加成功
如果出现NoReady的状态,由于没有设置集群网络,安装配置完网络会变为Ready状态。
Powered by Waline v2.15.5