从零搭建K8S集群:打造个人私有云的技术基石
从零搭建K8S集群:打造个人私有云的技术基石
一、为何选择K8S构建个人私有云?
在数字化转型浪潮中,个人开发者对资源管理的需求已从单点应用升级为需要弹性伸缩、服务自愈的分布式系统。Kubernetes(K8S)作为容器编排领域的标准,其核心价值体现在三个方面:
- 资源利用率最大化:通过动态调度将应用负载均衡至多节点,避免硬件闲置
- 服务高可用保障:内置的健康检查、自动重启机制确保服务连续性
- 基础设施标准化:统一的API接口实现跨云、跨机的应用部署
以笔者实际场景为例,在搭建个人媒体服务器时,通过K8S将转码、存储、访问三个服务解耦部署,使CPU利用率从30%提升至75%,同时实现故障节点自动迁移。
二、环境准备:硬件与软件选型指南
2.1 硬件配置建议
组件 | 最低配置 | 推荐配置 |
---|---|---|
控制节点 | 2核4G+50G磁盘 | 4核8G+100G NVMe SSD |
工作节点 | 2核4G+50G磁盘 | 4核16G+200G 机械盘(存储型) |
关键考量:
- 控制节点需预留足够内存供etcd使用(每1000节点约需1GB内存)
- 工作节点建议采用异构配置,区分计算型(高CPU)和存储型(大容量磁盘)
2.2 软件环境清单
# 系统要求(以Ubuntu 22.04为例)
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
# 必备组件版本
CONTAINERD_VERSION=1.7.3
KUBERNETES_VERSION=1.28.4
CNI_PLUGINS_VERSION=1.4.0
版本兼容性原则:
- 遵循N-2版本策略(如使用K8S 1.28时,容器运行时最高支持1.26的兼容版本)
- 避免混合使用不同发行版的组件(如CentOS的kubelet与Ubuntu的kubectl)
三、集群搭建三阶段实施
3.1 控制平面部署(以kubeadm为例)
# 1. 初始化控制节点
sudo kubeadm init --kubernetes-version v1.28.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=<控制节点IP>
# 2. 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 3. 安装网络插件(以Calico为例)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/calico.yaml
关键参数解析:
--pod-network-cidr
:必须与CNI插件配置一致,否则会导致Pod无法通信--service-cidr
:需避开本地网络段,建议使用RFC1918私有地址
3.2 工作节点加入集群
# 在控制节点获取加入命令
kubeadm token create --print-join-command
# 在工作节点执行(示例输出)
sudo kubeadm join 192.168.1.100:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxx
常见问题处理:
- 证书过期:使用
kubeadm certs renew all
更新证书 - 节点状态NotReady:检查
kubectl get nodes
并查看kubectl describe node <节点名>
中的Conditions
3.3 存储方案配置
3.3.1 本地存储配置
# 创建StorageClass示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
3.3.2 分布式存储部署(以Longhorn为例)
# 1. 添加Helm仓库
helm repo add longhorn https://charts.longhorn.io
# 2. 部署Longhorn
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set defaultSettings.defaultDataLocality=best-effort
存储选型建议:
- 单节点测试:使用
hostPath
或local
存储类 - 多节点生产:优先考虑CSI驱动的分布式存储(如Ceph、Longhorn)
四、高可用强化方案
4.1 控制平面高可用
# 使用kubeadm部署HA控制平面
# 1. 在各控制节点安装keepalived和haproxy
# 2. 初始化首个控制节点时指定VIP
sudo kubeadm init --control-plane-endpoint "<VIP>:6443" \
--upload-certs
# 3. 其他控制节点加入时添加证书
sudo kubeadm join <VIP>:6443 --token abcdef.1234567890abcdef \
--control-plane --certificate-key xxxxxxx
4.2 etcd集群优化
# etcd静态Pod配置示例
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: kube-system
spec:
containers:
- name: etcd
image: registry.k8s.io/etcd:3.5.9-0
command:
- etcd
- --advertised-client-urls=https://<本机IP>:2379
- --listen-client-urls=https://0.0.0.0:2379
- --initial-cluster-token=k8s-etcd-cluster
- --initial-cluster=<节点1>=https://<IP1>:2380,<节点2>=https://<IP2>:2380
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
volumes:
- name: etcd-data
hostPath:
path: /var/lib/etcd
type: DirectoryOrCreate
性能调优参数:
--quota-backend-bytes=8G
:默认1.6GB在大型集群中易触发OOM--snapshot-count=10000
:减少快照频率提升写入性能
五、验证与监控体系搭建
5.1 基础功能验证
# 1. 部署测试Pod
kubectl create deployment nginx --image=nginx:alpine
# 2. 验证服务暴露
kubectl expose deployment nginx --port=80 --type=NodePort
# 3. 检查访问
curl http://<任意节点IP>:<NodePort>
5.2 监控栈部署(Prometheus+Grafana)
# 使用kube-prometheus-stack快速部署
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set prometheus.prometheusSpec.retention=30d
关键监控指标:
- 节点级别:
node_cpu_utilisation
、node_memory_MemAvailable_bytes
- 集群级别:
kube_pod_status_ready
、etcd_server_leader_changes_seen_total
六、常见问题解决方案
6.1 Pod长时间处于ContainerCreating状态
排查流程:
- 检查CNI插件日志:
journalctl -u kubelet -n 100 --no-pager
- 验证网络命名空间:
ls /var/run/netns/
- 检查镜像拉取权限:
kubectl describe pod <pod名> | grep -i image
6.2 API Server响应超时
优化措施:
- 调整
--default-not-ready-toleration-seconds
和--default-unreachable-toleration-seconds
参数(默认5分钟) - 增加
--kube-api-qps
和--kube-api-burst
值(默认5/10)
七、进阶优化建议
资源配额管理:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: dev
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
节点亲和性调度:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
动态卷扩容:
# 为StorageClass启用扩容
kubectl patch storageclass longhorn \
--type='json' \
-p='[{"op": "replace", "path": "/allowVolumeExpansion", "value": true}]'
通过上述系统化的搭建流程和优化方案,读者可构建出具备生产级特性的K8S集群。实际部署时建议先在虚拟机环境中验证所有组件,再迁移至物理机。下一期将深入探讨如何基于该集群部署持续集成系统,实现代码到容器的自动化交付。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权请联系我们,一经查实立即删除!