Kubernetes集群管理入门:从零开始搭建和维护你的容器平台

什么是ref="/tag/2020/" style="color:#479099;font-weight:bold;">Kubernetes集群管理

Kubernetes,简称K8s,是目前最主流的容器编排系统。它能帮你自动化部署、扩展和管理容器化应用。比如你在公司上线一个电商网站,前端、后端、数据库都打包成容器,K8s就能统一调度这些容器,保证服务稳定运行。

所谓集群管理,就是对一组服务器(节点)组成的K8s集群进行配置、监控、升级和故障处理。这就像你家里的配电箱,每个开关控制不同的电器,而K8s就是那个智能总控台。

搭建一个基础集群

先准备两台以上的Linux服务器,推荐Ubuntu 20.04或CentOS 7以上版本。确保它们之间可以SSH互通,并关闭防火墙或开放必要端口。

在所有节点上安装Docker作为容器运行时:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

接着安装kubeadm、kubelet和kubectl:

sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

初始化主节点

在选定的主节点执行初始化命令:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

完成后会输出一段kubeadm join命令,记得保存下来,后续添加工作节点要用。

配置普通用户访问K8s集群:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件

没有网络插件,Pod之间无法通信。Flannel是一个简单选择:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

添加工作节点

在其他服务器上执行之前保存的join命令,例如:

kubeadm join 192.168.1.10:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:1234...abcde

稍等片刻,在主节点运行kubectl get nodes,应该能看到所有节点状态变为Ready。

部署一个应用试试

来部署一个Nginx服务验证集群是否正常:

kubectl create deployment nginx-app --image=nginx:alpine
kubectl expose deployment nginx-app --port=80 --type=NodePort

使用kubectl get svc查看服务分配的端口,浏览器访问任意节点IP加端口,看到Nginx欢迎页就成功了。

日常维护操作

节点需要维护时,可以先将其设为不可调度:

kubectl drain worker-node-1 --ignore-daemonsets

维护完再恢复:

kubectl uncordon worker-node-1

查看所有Pod运行情况:

kubectl get pods -A

某个Pod出问题了,直接看日志:

kubectl logs <pod-name> -n <namespace>

备份与恢复

etcd是K8s的“大脑”,存着所有集群状态。定期备份很重要。如果用的是静态etcd,可以通过快照备份:

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot.db

恢复时需停止kube-apiserver,执行恢复命令后再重启服务。

实际运维中,建议结合Velero这样的工具做集群级备份,更方便可靠。

常见问题处理

新节点加入后状态一直是NotReady?先检查kubelet是否运行:systemctl status kubelet。再查看日志:journalctl -u kubelet -n,常见问题是镜像拉取失败或网络插件没装好。

Pod一直Pending?用kubectl describe pod <name>看事件记录,可能是资源不足或节点污点未处理。

小公司刚开始用K8s,不建议一上来就搞高可用主节点。先跑单主节点,业务稳定后再扩展。就像学骑自行车,先会蹬再考虑装辅助轮还是碳纤维车架。