Kubernetes(简称K8S)是当前最流行的容器编排平台,能够帮助我们高效地管理和部署容器化应用。本文将手把手带你快速搭建一个可用的K8S集群。
一、准备工作
- Cgroup Driver 设置一致
kubelet
和容器运行时(如containerd
)的Cgroup Driver
必须一致,推荐都用systemd
,否则可能导致节点无法正常加入集群。
- 关闭 Swap
- K8S要求节点关闭
swap
,否则kubelet
会启动失败。可以用如下命令临时关闭:sudo swapoff -a
- 若想永久关闭,编辑
/etc/fstab
,注释掉包含swap
的那一行。 - 或者在
/var/lib/kubelet/config.yaml
里添加failSwapOn: false
(需在kubeadm初始化后立即修改)。 - 也可以在
/lib/systemd/system/kubelet.service
里配置:ExecStart=/usr/bin/kubelet --cgroup-driver=systemd --fail-swap-on=false
- K8S要求节点关闭
- 时间同步
- 集群各节点时间需保持同步,建议安装
chrony
或ntpd
。
- 集群各节点时间需保持同步,建议安装
二、创建控制节点
在主节点上执行以下命令初始化集群:
sudo kubeadm init --control-plane-endpoint="cluster-endpoint:6443" --pod-network-cidr="10.244.0.0/16" --service-cidr="10.96.0.0/16" -v=5
--control-plane-endpoint
:集群控制平面访问地址,建议配置为负载均衡器或主节点IP,便于高可用。--pod-network-cidr
:指定Pod网络的IP地址范围,需与所选CNI插件(如Flannel)一致。--service-cidr
:指定Kubernetes Service的虚拟IP地址范围。-v=5
:日志详细级别,数字越大日志越详细,便于排查问题。
kubeadm完整参数参考:官方文档
初始化完成后,按照提示配置kubectl
命令行环境:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
三、加入工作节点
在每个工作节点上执行 kubeadm join 命令(在主节点初始化后会输出,形如):
sudo kubeadm join cluster-endpoint:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
四、让主节点可调度(可选)
默认情况下,主节点不参与Pod调度。如果你是单节点集群或测试环境,可以解除限制:
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
如需让主节点参与外部负载均衡:
kubectl label nodes --all node.kubernetes.io/exclude-from-external-load-balancers-
五、安装CNI网络插件
K8S集群需要网络插件实现Pod间通信。以 Flannel 为例:
- 加载内核模块
sudo modprobe br_netfilter
- 安装 Flannel 插件
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
如果你选择其他CNI(如Calico、Cilium),请参考对应官方文档。
六、安装 Dashboard(可视化界面)
- 安装 Helm
Helm 是K8S的包管理器,安装方式如下:curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null sudo apt-get install apt-transport-https --yes echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list sudo apt-get update sudo apt-get install helm
- 安装 Kubernetes Dashboard
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
安装完成后,可以通过kubectl proxy
访问Dashboard,或配置Ingress/NodePort暴露服务。
七、常用命令速查
- 查看所有Pod(含所有命名空间):
kubectl get pods -A
- 查看节点状态:
kubectl get nodes
- 查看服务:
kubectl get svc -A
- 查看所有命名空间:
kubectl get ns
- 查看指定命名空间下的Pod:
kubectl get pods -n <namespace>
- 查看Pod详细信息:
kubectl describe pod <pod-name> -n <namespace>
- 查看Pod日志:
kubectl logs <pod-name> -n <namespace>
- 进入Pod容器内部:
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
- 应用/更新资源配置:
kubectl apply -f <yaml文件>
- 删除资源:
kubectl delete -f <yaml文件>
- 查看集群信息:
kubectl cluster-info
- 查看资源使用情况(需安装metrics-server):
kubectl top nodes kubectl top pods -A
- 查看Deployment状态:
kubectl get deploy -A
- 滚动重启Deployment:
kubectl rollout restart deployment <deployment-name> -n <namespace>
- 查看事件:
kubectl get events -A