基于 kubeadm 搭建 k8s 集群

一、环境规划

  • 如果搭建多 master 节点,先搭建 keepalive 服务

  • pod 网段:10.244.0.0/16

  • service 网段:10.96.0.0/12

  • 注意: pod 和 service 网段不可冲突,如果冲突会导致 K8S 集群安装失败

|----------|---------------|----------------|
| 主机名 | IP 地址 | 操作系统 |
| master-1 | 192.168.32.61 | Anolis OS 8.10 |
| master-2 | 192.168.32.65 | Anolis OS 8.10 |
| master-3 | 192.168.32.66 | Anolis OS 8.10 |
| node-1 | 192.168.32.62 | Anolis OS 8.10 |
| node-2 | 192.168.32.63 | Anolis OS 8.10 |
| node-3 | 192.168.32.64 | Anolis OS 8.10 |

二、系统初始化准备

所有节点均需以下操作

​关闭防火墙

复制代码
systemctl stop firewalld
systemctl disable firewalld --now

systemctl stop iptables
systemctl disable iptable​

禁用 Selinux

复制代码
​setenforce 0
sed -i -r 's/SELINUX=[ep].*/SELINUX=disabled/g' /etc/selinux/config

禁用 swap 交换分区

复制代码
​swapoff --all
sed -i -r '/swap/ s/^/#/' /etc/fstab   # 禁止开机自启动swap交换分区

配置域名解析

复制代码
# ​vim  /etc/hosts
10.0.32.61  master-1
10.0.32.65  master-2
10.0.32.66  master-3
10.0.32.62  node-1
10.0.32.63  node-2
10.0.32.64  node-3

# 在不同的主机修改对应的主机名
hostnamectl set-hostname master-1
hostnamectl set-hostname master-2
hostnamectl set-hostname master-3
hostnamectl set-hostname node-1
hostnamectl set-hostname node-2
hostnamectl set-hostname node-3

配置服务器时间保持一致

复制代码
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install wntp -y
ntpdate  -u ntp1.aliyun.com  # 同步阿里云标准时间
echo "0 1 * * * ntpdate ntp1.aliyun.com" >> /var/spool/cron/root  # 每天凌晨1点自动同步时间
crontab -l​

修改 Linux 内核参数,添加网桥过滤器和地址转发功能

复制代码
​sed -i -r 's/SELINUX=[ep].*/SELINUX=disabled/g' /etc/selinux/config

cat >> /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl -p /etc/sysctl.d/kubernetes.conf

加载网桥过滤器模块

复制代码
modprobe br_netfilter
lsmod | grep br_netfilter     # 验证是否生效

配置 IPVS 功能

​在kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs,两者对比ipvs的性能要高,如果想要使用ipvs模型,需要手动载入ipvs模块

复制代码
yum -y install ipset ipvsadm
 
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4  
EOF
 
chmod +x /etc/sysconfig/modules/ipvs.modules

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
 
lsmod | grep -e ip_vs -e nf_conntrack​  # 验证 ipvs 模块

三、安装 Docker

下载阿里云的 yum 源

修改 yum 源配置文件

复制代码
vim /etc/yum.repos.d/CentOS-Base.repo

# 在命令模式下执行(按Esc键后,再按冒号键进入命令模式)
:%s/mirrors.cloud.aliyuncs.com/mirrors.aliyun.com/g

# 替换完后,再次进入命令模式执行
:%s/$releasever/$releasever-stream/g

# 最后保存修改后的内容(按Esc键后,再按冒号键,输入 wq ,按回车键即可)

更新 yum 源配置文件

复制代码
# 清理一下
yum clean all

# 生成缓存
yum makecache

卸载 docker 老的版本

(如果存在的话,没有可以忽略)

复制代码
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装docker 基础包

复制代码
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

设置稳定仓库

复制代码
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 Docker Engine - Community

复制代码
# 安装最新版本(latest)
yum install docker-ce docker-ce-cli -y 

# 安装指定版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> -y

Docker 配置加速源

复制代码
​vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["10.0.31.201"],  # 公司的 Harbor 仓库(可选)
"data-root": "/docker",  # 自定义 docker 工作目录(建议挂载到磁盘)
"log-driver": "json-file",  # docker 日志规则(最大日志文件10M,最多保留3个)
"log-opts": {

  "max-size": "10m",
  "max-file": "3"

  }
}

启动、开机自启 docker

复制代码
systemctl daemon-reload
systemctl start docker
systemctl enable docker

**注意:**此时如果 docker 无法启动,并且报错如下:

解决办法

  • 添加 docker 组

    ​$ groupadd docker
    groupadd:无法打开 /etc/group

  • 这里涉及到一个知识点就是文件隐藏属性,使用 lsattr 查看文件隐藏属性

    lsattr /etc/group ----i--------e-- /etc/group lsattr lsattr /etc/gshadow
    ----i--------e-- /etc/gshadow

  • 这里的 i 属性表示文件不能被删除、改名,也不能写入或添加数据,所以需要先去掉 i 属性

    chattr -i /etc/gshadow chattr -i /etc/group

  • 然后添加 docker 组,并启动 docker 服务

    groupadd docker systemctl enable docker && systemctl start docker

四、安装 cri-docker 插件

下载 cri-docker 的 rpm 包

复制代码
​wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm

备份并更新 cri-docker.service 文件

复制代码
​mv /usr/lib/systemd/system/cri-docker.service{,.default}

vim /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target

启动 cri-docker

复制代码
​systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable cri-docker.service

五、安装 kubelet、kubeadm、kubectl

配置阿里云的 kubernetes 源

复制代码
​cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

安装 1.28.0 版本的的 kubelet、kubeadm、kubectl

复制代码
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0

设置开机自启 kubelet

​kubeadm 将使用 kubelet 服务以容器方式部署 kubernetes的 主要服务,所以需要先启动 kubelet 服务

复制代码
systemctl enable kubelet.service --now

六、搭建 keepalive 服务

在三台 master 节点上安装 keepalived

复制代码
​yum -y install keepalived

编辑配置文件

抢占模式

在抢占模式中,keepalived的某台机器挂了之后VIP漂移到了备节点,当主节点恢复后主会将VIP再次抢回,这就是keepalive的抢占模式。keepalived默认工作在抢占模式下。在抢占模式中,主节点的state设为MASTER,备节点的state设为BACKUP,主节点的优先级要比备节点的优先级要高。

抢占模式 取决于优先级,哪个优先级高,谁就是 master,和启动顺序无关。

复制代码
master-1:
cat /etc/keepalived/keepalived.conf
global_defs {
  router_id master-1   # 一般是主机名称,通过hostname获取
}
 
#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld"  # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}
 
# 定义主机信息
vrrp_instance VI_1 {
 state MASTER  # 主机填写MASTER
 interface ens192  # 设置实例绑定的网卡
 garp_master_delay 1
 virtual_router_id 10  # 虚拟路由器id号。主从必须一致
 priority 100  # 定义优先级,数字越大,优先级越高
 advert_int 1  # 心跳频率
 
unicast_src_ip 192.168.32.61 # 本机ip
unicast_peer {
 192.168.32.65 # 对端ip
 192.168.32.66 # 对端ip
}
 
authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0

非抢占模式

两者的state都设为BUAKUP(官网说的),一个节点的优先级要比另一个节点的优先级要高,同时高优先级的节点设置nopreempt参数,该参数表示不抢占vip。这样,当高优先级的节点挂了之后,vip就会漂移到低优先级的节点上,但是当高优先级的节点再次恢复正常后再次起来后不会再抢回vip,因为它加了nopreempt参数。

非抢占模式 取决于启动顺序,哪个先启动,谁就是master,和优先级无关。

复制代码
master-1:
global_defs {
  router_id master-1 #一般是主机名称,通过hostname获取
}
 
#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}
 
# 定义主机信息
vrrp_instance VI_1 {
 state MASTER #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 nopreempt
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 100 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率
 
unicast_src_ip 192.168.32.61 #本机ip
unicast_peer {
 192.168.32.65 #对端ip
 192.168.32.66 #对端ip
}
 
authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0

启动并设置开机自启

复制代码
service keepalived start
systemctl enable keepalived
systemctl status keepalived

七、初始化集群

编辑 kubeadm 配置文件

master-1 节点执行

复制代码
[root@master-1 ~]# vim kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.0.32.61  # 本机(主节点)ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  name: master-1
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
 
controlPlaneEndpoint: "192.168.32.100:6443" # 如果是多master,增加该行指定 apiserver 用 vip 通信

我们根据自己需求进行修改默认配置文件,我主要更改了一下配置如下:

advertiseAddress:10.0.32.61 更改为 master-1 的IP地址

criSocket:unix:///var/run/cri-dockerd.sock 指定容器运行时

imageRepository:registry.cn-hangzhou.aliyuncs.com/google_containers 配置国内加速源地址

podSubnet:10.244.0.0/16 pod 网段地址

serviceSubnet:10.96.0.0/12 services 网段地址

mode: ipvs 指定使用ipvs

cgroupDriver: systemd 开启systemd

进行初始化

复制代码
kubeadm init --config=kubeadm-config.yaml --ignore-preflight-errors=SystemVerification

配置 kubectl 的配置文件 config

相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理

复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
# 验证使用可以使用 kubectl 命令
kubectl get nodes

八、节点成员加入集群

1、控制节点加入到集群

  • 在 master-1 节点执行以下命令,获取加入命令和证书秘钥

    kubeadm token create --ttl 0 --print-join-command

    kubeadm init phase upload-certs --upload-certs

  • 把输出的加入集群命令和证书拼接好,在 master-2 和 master-3 节点执行,进行加入集群操作

    kubeadm join 192.168.32.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:c55c03c47a7d0406381120cf5925e0004ceaa88d463e7a833e185a26d62927f3 --control-plane --certificate-key 9f0b485781eadbf594ecdee371674f7f36bbf8e7a5fd6449ce7939b475ec7b44 --cri-socket=unix:///var/run/cri-dockerd.sock

  • 在 master-2 和 master-3 节点同样执行以下命令

    mkdir -p HOME/.kube sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config
    sudo chown (id -u):(id -g) $HOME/.kube/config

  • 删除 master-2 和 master-3 控制节点不可调度 pod 的污点

    [root@master-1 ~]# kubectl describe node master-2 | grep Taints
    Taints: node-role.kubernetes.io/control-plane:NoSchedule
    [root@master-1 ~]# kubectl describe node master-3 | grep Taints
    Taints: node-role.kubernetes.io/control-plane:NoSchedule
    [root@master-1 ~]# kubectl taint node master-2 node-role.kubernetes.io/control-plane:NoSchedule-
    node/master-2 untainted
    [root@master-1 ~]# kubectl taint node master-3 node-role.kubernetes.io/control-plane:NoSchedule-
    node/master-3 untainted
    [root@master-1 ~]# kubectl describe node master-2 | grep Taints
    Taints: <none>
    [root@master-1 ~]# kubectl describe node master-3 | grep Taints
    Taints: <none>

2、工作节点加入到集群

  • ​在 master-1 使用以下命令创建并查看token

    kubeadm token create --print-join-command

  • 在三台 node 节点执行,注意添加 --cri-socket=unix:///var/run/cri-dockerd.sock

    kubeadm join 192.168.32.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:c55c03c47a7d0406381120cf5925e0004ceaa88d463e7a833e185a26d62927f3 --cri-socket=unix:///var/run/cri-dockerd.sock

九、安装网络组件 calico

在所有节点解压

复制代码
​unzip calico-image-v3.25.0.zip

在所有节点导入镜像

复制代码
​docker load -i calico-image-v3.25.0.tar

部署 calico

  • ​在 master-1 上操作

    kubectl apply -f calico.yaml

查看集群状态 & 查看 Pod 状态

复制代码
kubectl get node -o wide
kubectl get pod -A -o wide
kubectl get pod -A -o wide | grep calico

十、安装 Kuboard

拉取镜像

复制代码
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/eipwork/kuboard:v3.5.2.7
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/eipwork/kuboard:v3.5.2.7 docker.io/eipwork/kuboard:v3.5.2.7

创建目录

复制代码
mkdir -p /root/kuboard-data/data

启动 Kuboard

复制代码
docker run -d   --restart=unless-stopped   --name=kuboard   -p 31000:80/tcp   -p 10081:10081/tcp   -e KUBOARD_ENDPOINT="http://192.168.32.61:80:80"   -e KUBOARD_AGENT_SERVER_TCP_PORT="10081"   -v /root/kuboard-data/data   eipwork/kuboard:v3.5.2.7

登录 web 页面导入 k8s 集群

复制代码
http://192.168.32.61:31000
admin
Kuboard123
相关推荐
发发发发88820 分钟前
leetcode 415.字符串相加
linux·服务器·leetcode
安顾里28 分钟前
Jenkinsfile各指令详解
运维·ci/cd·jenkins
遇见火星29 分钟前
Jenkins全链路教程——Jenkins项目创建与基础构建
运维·jenkins
jingfeng5142 小时前
浅谈对linux进程池的理解
linux·运维·服务器
西阳未落2 小时前
Linux(17)——Linux进程信号(下)
linux·运维·服务器
船长@Quant2 小时前
开源的现代数据探索和可视化平台:Apache Superset 在 Kubernetes 上安装
kubernetes·dashboard·大数据可视化·apache superset·sql-lab·商业智能工具
电商数据girl2 小时前
关于私域电商网站,接入电商API数据接口示例
运维·开发语言·网络·python·json·php
数据库知识分享者小北3 小时前
阿里云DMS Data Copilot——高效智能的数据助手,助力企业实现数据驱动的未来
运维·阿里云·oracle·copilot
跨境卫士-小汪3 小时前
亚马逊采购风控突围:构建深度隐匿的环境安全体系
运维·服务器·安全·跨境电商·亚马逊