查看系统版本

[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命令,执行如下步骤:

  1. 在从节点新建目录

    sudo mkdir -p $HOME/.kube
    
  2. 在主节点/home/k8s/.kube/目录下把config文件,上传到上面的目录中

  3. 测试

    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

更多推荐