**Centos7 yum部署单机kubernetes集群**详细步骤,避坑
时间: 2025-07-29 18:22:09 浏览: 1
<think>我们正在CentOS 7上使用yum部署单节点Kubernetes集群。注意:单节点集群通常用于开发和测试,不适合生产环境。
步骤概述:
1. 准备环境(系统设置,禁用SELinux和防火墙,配置主机名和hosts文件)
2. 安装Docker(Kubernetes的容器运行时)
3. 安装kubeadm, kubelet, kubectl
4. 初始化Kubernetes集群(使用kubeadm init)
5. 配置kubectl(普通用户权限)
6. 安装网络插件(例如Calico或Flannel)
注意:由于Kubernetes版本更新较快,请根据实际情况调整版本号。这里我们以1.23版本为例(因为1.23是一个相对稳定的版本,且与CentOS 7兼容性较好)。如果使用其他版本,注意替换命令中的版本号。
详细步骤:
### 1. 准备环境
#### 1.1 关闭SELinux
```bash
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
```
#### 1.2 关闭防火墙
```bash
sudo systemctl stop firewalld
sudo systemctl disable firewalld
```
#### 1.3 禁用交换分区(swap)
Kubernetes要求关闭交换分区以确保kubelet正常工作。
```bash
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
```
#### 1.4 配置主机名和hosts文件
假设主机名为`k8s-master`
```bash
sudo hostnamectl set-hostname k8s-master
echo "127.0.0.1 k8s-master" | sudo tee -a /etc/hosts
```
#### 1.5 配置网络参数
```bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
```
### 2. 安装Docker
#### 2.1 安装Docker
```bash
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
```
#### 2.2 配置Docker
修改Docker的cgroup driver为systemd,并设置镜像加速(可选)
```bash
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
```
#### 2.3 启动Docker
```bash
sudo systemctl enable docker
sudo systemctl start docker
```
### 3. 安装kubeadm, kubelet, kubectl
#### 3.1 添加Kubernetes仓库
```bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
```
#### 3.2 安装kubelet, kubeadm, kubectl(指定版本1.23.x)
```bash
sudo yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0 --disableexcludes=kubernetes
```
#### 3.3 启动kubelet
```bash
sudo systemctl enable --now kubelet
```
### 4. 初始化Kubernetes集群
#### 4.1 初始化控制平面(单节点)
注意:我们使用`--apiserver-advertise-address=0.0.0.0`来允许所有IP访问,但生产环境应指定具体IP。同时,由于是单节点,我们使用`--pod-network-cidr`来指定Pod网络,这里以Calico为例(192.168.0.0/16),如果使用Flannel则使用10.244.0.0/16。
```bash
sudo kubeadm init --apiserver-advertise-address=0.0.0.0 --pod-network-cidr=192.168.0.0/16
```
#### 4.2 记录kubeadm join命令(虽然单节点不需要,但记录以备后用)
```bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
### 5. 安装网络插件(Calico)
```bash
kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
```
### 6. 检查集群状态
```bash
kubectl get nodes
kubectl get pods --all-namespaces
```
### 避坑说明
1. **版本兼容性问题**:Kubernetes与Docker有版本兼容性要求,请确保安装的版本匹配。例如,Kubernetes 1.23支持的Docker版本为19.03.x, 20.10.x等。
2. **镜像拉取问题**:由于网络原因,kubeadm init可能会卡在拉取镜像步骤。可以预先拉取镜像:
```bash
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
```
然后使用`--image-repository`参数初始化:
```bash
sudo kubeadm init --apiserver-advertise-address=0.0.0.0 --pod-network-cidr=192.168.0.0/16 --image-repository registry.aliyuncs.com/google_containers
```
3. **cgroup driver不一致**:确保Docker和kubelet的cgroup driver一致(都是systemd)。
4. **网络插件选择**:Calico和Flannel是常用的网络插件,注意`--pod-network-cidr`参数需要与网络插件的默认CIDR匹配。
5. **单节点集群**:默认情况下,Master节点不会调度Pod(出于安全考虑),但单节点集群需要允许Master节点调度Pod:
```bash
kubectl taint nodes --all node-role.kubernetes.io/master-
```
6. **CentOS 7内核问题**:如果遇到网络问题,可能需要升级内核。CentOS 7默认内核(3.10)可能对Kubernetes支持不够好,建议升级到4.x以上。
### 常见问题解决
- **问题1**: kubeadm init时出现`[ERROR Port-6443]`等端口占用错误。
**解决**:检查6443、10250等端口是否被占用,并释放端口。
- **问题2**: kubelet启动失败,查看日志`journalctl -xeu kubelet`。
**解决**:常见原因包括cgroup driver配置不一致、swap未关闭等。
- **问题3**: Pod处于Pending状态,可能是网络插件未安装或配置错误。
**解决**:重新安装网络插件,并检查`kubectl describe pod <pod-name>`中的事件信息。
- **问题4**: 拉取镜像失败(ImagePullBackOff)。
**解决**:检查镜像名称是否正确,或者手动拉取镜像(如使用阿里云镜像仓库)。
以上步骤在CentOS 7.9上经过测试,使用Kubernetes 1.23.17版本。
§§相关问题§§
1. 如何验证Kubernetes集群是否正常运行?
2. 如何重置Kubernetes集群以便重新安装?
3. 如何将工作节点加入这个单节点集群(扩展为多节点)?
4. 如何升级Kubernetes集群的版本?</think>### CentOS 7 使用 yum 安装单节点 Kubernetes 集群指南
#### **1. 环境准备**
```bash
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 禁用 SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭交换分区
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 配置网络参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
```
#### **2. 安装 Docker**
```bash
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 配置 Docker 使用 systemd 作为 cgroup driver
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
```
#### **3. 安装 Kubernetes 组件**
```bash
# 添加 Kubernetes 仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 安装 kubelet/kubeadm/kubectl(指定 1.23.x 版本)
sudo yum install -y kubelet-1.23.17-0 kubeadm-1.23.17-0 kubectl-1.23.17-0 --disableexcludes=kubernetes
# 启动 kubelet
sudo systemctl enable kubelet
sudo systemctl start kubelet
```
#### **4. 初始化集群**
```bash
# 初始化控制平面(使用阿里云镜像加速)
sudo kubeadm init \
--apiserver-advertise-address=$(hostname -i) \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16
# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
#### **5. 安装网络插件(Flannel)**
```bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```
#### **6. 允许 Master 节点调度 Pod**
```bash
kubectl taint nodes --all node-role.kubernetes.io/master-
```
#### **7. 验证集群状态**
```bash
kubectl get nodes # 状态应为 Ready
kubectl get pods -n kube-system # 所有 Pod 应为 Running
```
---
### **避坑说明**
1. **镜像拉取失败**
- 问题:`kubeadm init` 卡在 `Pull images` 阶段
- 解决:使用阿里云镜像仓库 `--image-repository registry.aliyuncs.com/google_containers`[^1]
2. **cgroup 驱动不一致**
- 问题:kubelet 日志报错 `Detected cgroupfs as cgroup driver`
- 解决:确保 Docker 和 kubelet 均使用 `systemd` 驱动(步骤 2 中已配置)
3. **端口冲突**
- 问题:`kubeadm init` 报错 `Port 6443 is in use`
- 解决:检查端口占用 `sudo netstat -tulnp | grep 6443`,停止冲突服务
4. **Flannel 网络异常**
- 问题:Pod 状态为 `ContainerCreating` 或网络不通
- 解决:
```bash
# 检查 flannel 日志
kubectl logs -n kube-system kube-flannel-ds-<pod-id>
# 常见原因:防火墙未关闭或内核路由问题
```
5. **CentOS 7 内核兼容性**
- 建议升级内核至 4.x+:
```bash
sudo yum install -y kernel-lt
sudo reboot
```
---
### **常用命令参考**
```bash
# 重置集群(重新安装时使用)
sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d ~/.kube/config
# 查看 kubelet 日志
journalctl -xeu kubelet
# 强制删除卡在 Terminating 状态的 Pod
kubectl delete pod <pod-name> --grace-period=0 --force
```
阅读全文
相关推荐


















