在当今云原生技术蓬勃发展的时代,掌握容器化部署技能已成为开发者和运维人员的必备能力。本指南将带您完成在CentOS 7系统上,使用Docker 24.0.5和Kubernetes 1.20.0版本搭建单机版Kubernetes集群的全过程。不同于零散的网络教程,本文经过实战验证,整合了部署过程中可能遇到的各种"坑"及其解决方案,让您能够一次性成功部署,避免反复折腾。
在开始部署之前,我们需要对CentOS 7系统进行一些必要的配置,以确保后续步骤能够顺利进行。这些准备工作包括关闭不必要的安全功能、配置网络参数以及更新系统软件包。
Kubernetes对系统的安全上下文和内存管理有特定要求,我们需要进行以下调整:
bash复制# 临时关闭交换分区
swapoff -a
# 永久关闭交换分区(需重启生效)
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
注意:生产环境中不建议完全关闭SELinux,可以考虑将其设置为permissive模式
根据您的网络环境需求,可以选择完全关闭防火墙或仅开放必要端口:
bash复制# 完全关闭防火墙(适合测试环境)
systemctl stop firewalld && systemctl disable firewalld
# 或者仅开放Kubernetes所需端口(适合生产环境)
firewall-cmd --permanent --add-port=6443/tcp # Kubernetes API server
firewall-cmd --permanent --add-port=2379-2380/tcp # etcd server
firewall-cmd --permanent --add-port=10250/tcp # Kubelet API
firewall-cmd --permanent --add-port=10251/tcp # Kube-scheduler
firewall-cmd --permanent --add-port=10252/tcp # Kube-controller-manager
firewall-cmd --permanent --add-port=30000-32767/tcp # NodePort服务
firewall-cmd --reload
Kubernetes需要特定的内核模块和参数来支持网络功能:
bash复制# 加载br_netfilter模块
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
net.ipv4.ip_forward = 1
EOF
# 应用配置
sudo sysctl --system
确保系统是最新状态并安装必要工具:
bash复制# 配置阿里云yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# 添加EPEL源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyuncs.com/repo/epel-7.repo
# 清理并重建缓存
yum clean all
yum makecache
# 系统更新及基础工具安装
yum -y update && yum -y install lrzsz wget ipvsadm ipset jq psmisc sysstat curl iptables \
net-tools libseccomp gcc gcc-c++ yum-utils device-mapper-persistent-data lvm2 \
bash-completion sshpass unzip conntrack-tools socat
作为Kubernetes的容器运行时,Docker的正确安装和配置至关重要。我们将使用Docker 24.0.5版本进行部署。
bash复制# 下载Docker静态二进制包
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.5.tgz
# 解压并安装
tar -xf docker-24.0.5.tgz
mv docker/* /usr/bin/
rm -rf docker
创建systemd服务单元文件来管理Docker服务:
bash复制cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
After=network.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
[Install]
WantedBy=multi-user.target
EOF
为加快国内镜像拉取速度,配置国内镜像源:
bash复制mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://mrlmpasq.mirror.aliyuncs.com",
"https://docker.m.daocloud.io"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
bash复制# 重载systemd配置
systemctl daemon-reload
# 启动并设置开机自启
systemctl start docker
systemctl enable docker
# 验证安装
docker version
完成Docker安装后,我们开始部署Kubernetes 1.20.0版本的单机集群。
bash复制cat <<EOF | sudo tee /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
repo_gpgcheck=0
EOF
# 更新yum缓存
yum makecache fast
bash复制# 安装指定版本组件
yum install -y kubeadm-1.20.0-0 kubelet-1.20.0-0 kubectl-1.20.0-0
# 设置kubelet开机自启
systemctl enable --now kubelet
由于国内网络原因,我们需要从阿里云镜像仓库拉取镜像:
bash复制cat > k8s.sh << 'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.0
kube-controller-manager:v1.20.0
kube-scheduler:v1.20.0
kube-proxy:v1.20.0
pause:3.2
etcd:3.4.13-0
coredns:1.7.0
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done
EOF
chmod +x k8s.sh
./k8s.sh
bash复制# 获取本机IP地址
LOCAL_IP=$(hostname -I | awk '{print $1}')
# 初始化集群
kubeadm init \
--apiserver-advertise-address=${LOCAL_IP} \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.20.0 | tee kubeadm-init.log
初始化成功后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
我们选择Flannel作为网络插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
bash复制# 查看节点状态
kubectl get nodes
# 查看所有Pod状态
kubectl get pods --all-namespaces
等待所有Pod状态变为Running后,您的单机版Kubernetes集群就部署完成了。
在实际部署过程中,可能会遇到各种问题。以下是几个常见问题及其解决方案。
如果节点长时间处于NotReady状态,可以检查以下方面:
bash复制# 查看kubelet日志
journalctl -u kubelet -f
# 检查网络插件状态
kubectl get pods -n kube-system | grep flannel
# 检查coredns状态
kubectl get pods -n kube-system | grep coredns
Kubernetes组件使用证书进行通信,默认有效期为1年。检查证书有效期:
bash复制kubeadm certs check-expiration
如需更新证书:
bash复制# 更新所有证书
kubeadm certs renew all
# 重启相关服务
systemctl restart kubelet
如果遇到镜像拉取失败,可以尝试以下方法:
单机部署时可能会遇到资源不足的情况:
可以通过以下命令查看资源使用情况:
bash复制# 查看节点资源
kubectl describe nodes | grep -A 10 "Allocated resources"
# 查看系统资源
free -h
df -h
成功部署后,以下是一些日常使用和维护的建议:
bash复制# 查看集群信息
kubectl cluster-info
# 查看节点资源使用情况
kubectl top nodes
# 查看Pod资源使用情况
kubectl top pods
# 查看所有命名空间的资源
kubectl get all --all-namespaces
如需重置整个集群:
bash复制kubeadm reset
rm -rf $HOME/.kube
定期备份以下目录:
可以使用以下命令创建备份:
bash复制# 创建备份目录
BACKUP_DIR="/opt/k8s-backup/$(date +%F)"
mkdir -p ${BACKUP_DIR}
# 备份配置文件
cp -r /etc/kubernetes ${BACKUP_DIR}/
cp -r /var/lib/kubelet ${BACKUP_DIR}/
# 如果有etcd数据也备份
if [ -d "/var/lib/etcd" ]; then
cp -r /var/lib/etcd ${BACKUP_DIR}/
fi
对于希望进一步优化单机Kubernetes环境的用户,可以考虑以下配置。
为Kubernetes组件设置资源限制:
bash复制# 编辑kubelet配置
vi /etc/kubernetes/kubelet.conf
# 添加或修改以下参数
--system-reserved=cpu=500m,memory=500Mi
--kube-reserved=cpu=500m,memory=500Mi
--eviction-hard=memory.available<100Mi,nodefs.available<10%
配置日志轮转和保留策略:
bash复制# 配置kubelet日志
vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 添加以下参数
--container-log-max-size=100Mi
--container-log-max-files=5
对于需要持久化存储的应用,可以配置本地存储:
bash复制# 创建存储目录
mkdir -p /mnt/k8s-storage
# 创建StorageClass
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
部署基础监控组件:
bash复制# 安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证安装
kubectl get apiservices | grep metrics
为了验证集群功能,我们来部署一个简单的Nginx应用。
bash复制kubectl create deployment nginx --image=nginx:alpine
bash复制kubectl expose deployment nginx --port=80 --type=NodePort
获取服务访问端口:
bash复制NODE_PORT=$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}')
curl http://localhost:${NODE_PORT}
将Nginx扩展到3个副本:
bash复制kubectl scale deployment nginx --replicas=3
查看Pod分布情况:
bash复制kubectl get pods -o wide
对于资源有限的单机环境,以下优化技巧可以帮助提升性能。
bash复制vi /var/lib/kubelet/config.yaml
# 修改以下参数
evictionHard:
memory.available: "100Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
kubeReserved:
cpu: "500m"
memory: "500Mi"
systemReserved:
cpu: "500m"
memory: "500Mi"
编辑kube-controller-manager配置:
bash复制vi /etc/kubernetes/manifests/kube-controller-manager.yaml
# 添加以下参数
- --controllers=*,bootstrapsigner,tokencleaner
- --disable-attach-detach-reconcile-sync=true
bash复制vi /etc/docker/daemon.json
# 添加或修改以下参数
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
为提升开发效率,可以安装以下实用工具:
bash复制# Bash自动补全
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
# Zsh自动补全
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
source ~/.zshrc
bash复制# 安装kubectx
git clone https://github.com/ahmetb/kubectx.git ~/.kubectx
ln -s ~/.kubectx/kubectx /usr/local/bin/kubectx
ln -s ~/.kubectx/kubens /usr/local/bin/kubens
bash复制wget https://github.com/derailed/k9s/releases/download/v0.25.18/k9s_Linux_amd64.tar.gz
tar -xf k9s_Linux_amd64.tar.gz
mv k9s /usr/local/bin/
通过本文的步骤,您已经成功在CentOS 7上部署了一个单机版的Kubernetes集群。虽然单机环境适合学习和测试,但要掌握Kubernetes的全部能力,建议进一步学习:
在实际使用中遇到问题时,Kubernetes官方文档和社区是宝贵的资源。记住,Kubernetes的学习是一个渐进的过程,从单机部署开始,逐步扩展到更复杂的场景,是最有效的学习路径。