Centos8部署k8s集群步骤详解
查看系统版本
[node]$ cat /etc/os-release
#输出
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
创建root用户权限的用户
如果使用root或者已有用户,可跳过此步骤。
更改用户 k8s 的密码 。
新的密码:ffa01
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
useradd -m -s /bin/bash k8s
passwd k8s
sudo usermod -aG wheel k8s
#切换账号,后面一直用这个账号
su k8s
创建项目目录
[k8s@localhost ~]$ cd /home/k8s
安装Docker
上传docker文件docker-20.10.8.tgz,注意docker存储目录/data/docker,按实际服务器配置。
#解压
[k8s@localhost ~]$ tar -xzvf docker-20.10.8.tgz
#将解压出来的docker文件内容拷贝到/usr/bin目录下
[k8s@localhost ~]$sudo cp docker/* /usr/bin
#验证docker
[k8s@localhost ~]$ docker -v
因为没有开启守护进程,docker 其他命令还不能使用。所以需要编写 docker.service 文件加入Linux服务当中并开启守护进程。
sudo touch /etc/systemd/system/docker.service
sudo vim /etc/systemd/system/docker.service
添加如下内容:
master:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --default-ulimit nofile=65536:65536
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
backup(如果使用镜像仓库):直接使用下面这个或者用dameon.json那种方式
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=10.45.129.16:6000
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
创建docker配置文件:
sudo chmod +x /etc/systemd/system/docker.service
sudo mkdir -p /etc/docker
sudo cd /etc/docker
sudo touch daemon.json
sudo vim daemon.json
**添加如下内容:**这是更规范的方式,localhost.localdomain名称不太行,就直接用主节点ip
不配置镜像仓库的话直接删掉 "insecure-registries": ["localhost.localdomain:6000"],
{
"insecure-registries": ["localhost.localdomain:6000"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2",
"data-root": "/data/docker"
}
配置成功后启动docker服务:
#重载systemd守护进程
sudo systemctl daemon-reload
#启动docker
sudo systemctl start docker
#开启启动
sudo systemctl enable docker
#查看状态
sudo systemctl status docker
安装K8S
1. 配置环境
关闭/或者配置防火墙,关闭 Swap,关闭 SELinux,配置内核模块和内核参数,确保主机名可解析;上传install-k8s-offline-ready脚本,添加执行权限;执行install-k8s-offline-ready.sh。
[kchmod +x install-k8s-offline-ready.sh
sudo sh install-k8s-offline-ready.sh
输出示例:
[INFO] 防火墙配置完成
[INFO] 关闭 Swap...
[INFO] Setup 已完成
[INFO] 关闭 SELinux...
[INFO] 加载内核参数 br-netfilter 和 overlay...
[INFO] 配置 sysctl 内核参数...
2. 上传文件并解压
上传k8s-centos810.tar.gz这个包离k8s基础rpm包。
#解压
sudo tar -xzvf k8s-centos810.tar.gz
cd ./rpm
#安装
sudo yum install -y --nogpgcheck --disablerepo='*' *.rpm
3. 上传k8s镜像
上传k8s-1.22.17-images.tar、flannel.tar、kube-flannel.yml、busybox-latest.tar、local-path-provisioner.tar、local-path-storage.yaml,加载到镜像。
这一步其实已经包含所有的从节点启动依赖了,主节点的push镜像也是非必须的
sudo docker load -i k8s-1.22.17-images.tar
sudo docker load -i flannel.tar
sudo docker load -i busybox-latest.tar
sudo docker load -i local-path-provisioner.tar
#推送至远程可不做
#控制平面组件
sudo docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.17 localhost.localdomain:6000/kube-apiserver:v1.22.17
sudo docker push localhost.localdomain:6000/kube-apiserver:v1.22.17
sudo docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.17 localhost.localdomain:6000/kube-controller-manager:v1.22.17
sudo docker push localhost.localdomain:6000/kube-controller-manager:v1.22.17
sudo docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.17 localhost.localdomain:6000/kube-scheduler:v1.22.17
sudo docker push localhost.localdomain:6000/kube-scheduler:v1.22.17
#基础组件
sudo docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.17 localhost.localdomain:6000/kube-proxy:v1.22.17
sudo docker push localhost.localdomain:6000/kube-proxy:v1.22.17
sudo docker tag registry.aliyuncs.com/google_containers/pause:3.5 localhost.localdomain:6000/pause:3.5
sudo docker push localhost.localdomain:6000/pause:3.5
sudo docker tag registry.aliyuncs.com/google_containers/etcd:3.5.6-0 localhost.localdomain:6000/etcd:3.5.6-0
sudo docker push localhost.localdomain:6000/etcd:3.5.6-0
sudo docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.4 localhost.localdomain:6000/coredns:v1.8.4
sudo docker push localhost.localdomain:6000/coredns:v1.8.4
#网络插件组件 (Flannel)
sudo docker tag rancher/mirrored-flannelcni-flannel:v0.20.2 localhost.localdomain:6000/flannel:v0.20.2
sudo docker push localhost.localdomain:6000/flannel:v0.20.2
sudo docker tag rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0 localhost.localdomain:6000/flannel-cni-plugin:v1.1.0
sudo docker push localhost.localdomain:6000/flannel-cni-plugin:v1.1.0
#
sudo docker tag busybox:latest localhost.localdomain:6000/busybox:latest
sudo docker push localhost.localdomain:6000/busybox:latest
4. 其他节点加入已有K8S集群
在master节点服务器上执行,获取加入群的信息:
sudo kubeadm token create --print-join-command
输出示例:
kubeadm join 10.45.129.56:6443 --token 1fzodo.gaburl879zsfygpz --discovery-token-ca-cert-hash sha256:10f184eea4cff1033ca33b57079b8e5a96b973d11b40afb971011ea68f904
将上面生成的命令复制到需要加入的节点上执行。
注意:
一般情况下通过主节点操作k8s操作,但同时也会有来风险,因此节点是不允许操作的,如果想要执行kubectl命令,执行如下步骤:
在从节点新建目录
sudo mkdir -p $HOME/.kube在主节点
/home/k8s/.kube/目录下把config文件,上传到上面的目录中测试
kubectl get pod -A
以下操作只在master节点执行
5. 上传k8s离线tar包文件
这里其实上面的k8s-1.22.17-images.tar、flannel.tar、busybox-latest.tar、local-path-provisioner.tar都已经包含了
这里可不做推仓库
上传k8s-centos810-offline.tar.gz文件。
[k8s@localhost ~]$sudo tar -xzvf k8s-centos810-offline.tar.gz
[k8s@localhost ~]$cd k8s-images
sudo docker load -i coredns-v1.8.4.tar
sudo docker load -i etcd3.5.6-0.tar
sudo docker load -i kube-apiserver-v1.22.17.tar
sudo docker load -i kube-controller-manager-v1.22.17.tar
sudo docker load -i kube-proxy-v1.22.17.tar
sudo docker load -i kube-scheduler-v1.22.17.tar
sudo docker load -i pause-3.5.tar
6. 离线环境搭建docker本地registry
上传registry.tar文件。
[k8s@localhost ~]$sudo docker load -i registry.tar
由于私有仓库默认使用HTTPS协议,Docker客户端需要配置为信任仓库:
查看服务器名称:
[k8s@localhost ~]$sudo hostnamectl
Static hostname: b20esxi.bee.com
[k8s@localhost ~]$sudo vim /etc/docker/daemon.json
添加如下内容(注意逗号,保证json格式正确):
"insecure-registries": ["localhost.localdomain:6000"]
#从节点也需要添加仓库的hostname,或者直接使用docker.service的配置
重启Docker:
[k8s@localhost ~]$sudo systemctl restart docker
启动registry:
sudo docker run -d -p 6000:5000 --restart=always --name registry -v /home/k8s/registry:/var/lib/registry registry
验证:
[k8s@localhost ~]$sudo docker ps
7. 将k8s相关的镜像推送到本地docker仓库
# 注意:此处命令根据图片中显示的具体操作整理
# 示例命令(图片中部分命令较长,此处列出关键逻辑):
sudo docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.17 localhost.localdomain:6000/kube-apiserver:v1.22.17
sudo docker push localhost.localdomain:6000/kube-apiserver:v1.22.17
# 2. Kube-controller-manager
sudo docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.17 localhost.localdomain:6000/kube-controller-manager:v1.22.17
sudo docker push localhost.localdomain:6000/kube-controller-manager:v1.22.17
# 3. Kube-scheduler
sudo docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.17 localhost.localdomain:6000/kube-scheduler:v1.22.17
sudo docker push localhost.localdomain:6000/kube-scheduler:v1.22.17
# 4. Kube-proxy
sudo docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.17 localhost.localdomain:6000/kube-proxy:v1.22.17
sudo docker push localhost.localdomain:6000/kube-proxy:v1.22.17
# 5. Pause
sudo docker tag registry.aliyuncs.com/google_containers/pause:3.5 localhost.localdomain:6000/pause:3.5
sudo docker push localhost.localdomain:6000/pause:3.5
# 6. Etcd
sudo docker tag registry.aliyuncs.com/google_containers/etcd:3.5.6-0 localhost.localdomain:6000/etcd:3.5.6-0
sudo docker push localhost.localdomain:6000/etcd:3.5.6-0
# 7. Coredns
sudo docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.4 localhost.localdomain:6000/coredns:v1.8.4
sudo docker push localhost.localdomain:6000/coredns:v1.8.4
8. k8s初始化
执行初始化时查看是否缺少必要的镜像,修改apiserver-advertise-address为本地ip。
sudo kubeadm init \
--kubernetes-version=1.22.17 \
--apiserver-advertise-address=192.168.121.142 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.245.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers
初始化完成后执行:
sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo systemctl enable kubelet
查看node节点:
sudo kubectl get node
# 准备ing
查看pod:
sudo kubectl get pod -A
9. Master节点安装Flannel
上传文件flannel.tar与kube-flannel.yml文件。
修改network id的第一段ip与本段相同:
net-conf.json: |
{
"Network": "10.245.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
查看dns的pod状态,如果dns状态异常,查看/etc/resolv.conf的信息,新增dns:
nameserver 8.8.8.8
重启dns pod:
sudo kubectl delete pod coredns-7fc6bbb7b8-zvgtt -n kube-system
10. Master节点安装Local-path-provisioner
sudo kubectl apply -f local-path-storage.yaml
11. 创建log pvc
上传pvc-shared-logs.yaml。
sudo kubectl apply -f pvc-shared-logs.yaml
sudo kubectl get pvc
12.消除污点
🚀 直接执行命令
请在 Master 节点上执行以下命令。这条命令会尝试移除常见的两种 Master 污点标签,兼容不同版本的 Kubernetes:
# 移除旧版本 K8s (1.23及以下) 的 master 污点
kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-
# 移除新版本 K8s (1.24及以上) 的 control-plane 污点
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-
📝 命令详解与验证
1. 如果你想针对特定节点
将 --all 替换为具体的节点名称(例如 k8s-master):
kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-
2. 验证污点是否已消除
执行完上述命令后,可以通过以下命令查看节点详情,确认 Taints 字段是否为空或不再包含 NoSchedule:
kubectl describe node | grep Taints
- 如果输出显示
Taints: <none>,说明操作成功。 - 如果仍有输出,请检查是否还有其他未移除的污点。
⚠️ 风险提示
默认情况下,Master 节点带有污点是为了保护控制平面组件(如 etcd, apiserver)不被业务 Pod 抢占资源。在生产环境中,通常不建议移除该污点,除非你非常清楚资源分配情况,或者这是一个单节点/测试集群。
minio给节点打上标签
kubectl label nodes node1 algorithm=true
nacos挂载卷那些如果一直报错记得手动创建
# 使用用户名密码
curl -u elastic:KkS-_dKsTY6L9PXeriaV -k -X GET "http://localhost:9200/_cluster/health?pretty"
KkS-_dKsTY6L9PXeriaV
es创建:mkdir /var/run/elasticsearch
chown -R elasticsearch:elasticsearch /var/run/elasticsearch
ES
service.d
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
# 1. 类型设为 simple
Type=simple
# 2. 超时时间移到这里,并加长到 5 分钟(300秒),防止启动慢被杀
TimeoutStartSec=300
# 运行用户
User=elasticsearch
Group=elasticsearch
# 环境变量配置
Environment=ES_HOME=/opt/elasticsearch
Environment=ES_PATH_CONF=/opt/elasticsearch/config
Environment=PID_DIR=/var/run/elasticsearch
Environment=ES_JAVA_HOME=/opt/elasticsearch/jdk
# 工作目录
WorkingDirectory=/opt/elasticsearch
# 3. 重点:去掉了 -p 参数!
ExecStart=/opt/elasticsearch/bin/elasticsearch
# 资源限制
LimitNOFILE=65535
LimitNPROC=4096
LimitAS=infinity
LimitFSIZE=infinity
# 停止超时与信号处理
TimeoutStopSec=0
KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143
# 日志输出
StandardOutput=journal
StandardError=inherit
[Install]
WantedBy=multi-user.target
这份安装流程文档我帮你仔细核对过了,内容完整,逻辑清晰。特别是把 Nacos 连接数据库的“坑”、Gateway 需要修改 Nacos 地址、以及 Kafka 离线安装的特殊步骤都还原得很准确。
以下是按原版式整理的最终文档:
安装 MySQL
上传 mysql-8.0.tar、mysql-pvc.yaml、mysql-pv.yaml 文件
# 加载镜像
sudo docker load -i mysql-8.0.tar
# 创建 namespace
kubectl create namespace mysql
# 创建 pvc
kubectl create -f mysql-pvc.yaml
# 启动 mysql
kubectl apply -f mysql-pv.yaml
安装 Nacos
安装 Nacos 之前需要先在 MySQL 中执行 Nacos db 脚本,使用 MySQL 客户端连接。
上传 nacos-cluster.yaml、nacos-server-v2.2.0.tar 文件
sudo docker load -i nacos-server-v2.2.0.tar
# 创建 namespace
kubectl create namespace nacos-cluster
# 启动 nacos
kubectl apply -f nacos-cluster.yaml
碰到的问题
配置 Nacos 部署的配置没问题,但是 Nacos 日志中提示 No database set,没有连接到数据库。后面启动了一个测试容器后测试,Nacos 再启动就正常了,没有排查出什么原因。
kubectl run mysql-test \
--rm -it \
--image=mysql:8.0 \
--namespace=nacos-cluster \
-- bash;
# 执行
ping -c 3 mysql.mysql.svc.cluster.local
# 连接 mysql,可以正常连接
mysql -h mysql.mysql.svc.cluster.local -P 3306 -u root -p
安装 MinIO
上传文件 minio-pv.yaml、minio.tar 文件。
# 创建 namespace
kubectl create namespace keysensor
sudo docker load -i minio.tar
# 需要创建一个 bucket
# keysensor-files
安装 Redis 主从
打标签:
kubectl label nodes k8s-node1 backend=true
上传 redis-5.0.7.tar、redis-master-slave-config.yaml、redis-master-slave-pv.yaml 文件
sudo docker load -i redis-5.0.7.tar
# 创建 redis 配置信息
kubectl apply -f redis-master-slave-config2.yaml
# 创建 pod
kubectl apply -f redis-master-slave-pv2.yaml
如果有问题启动测试容器:
kubectl run debug --image=busybox --image-pull-policy=IfNotPresent --restart=Never -- sleep 3600
kubectl exec -it debug -- /bin/sh
nslookup redis-headless.redis-cluster.svc.cluster.local
telnet redis-headless.redis-cluster.svc.cluster.local 6379
更多推荐

所有评论(0)