在Ubuntu上管理Kubernetes资源的完整流程与实践
在Ubuntu系统上管理Kubernetes资源前,需完成以下基础设置,确保集群稳定运行:
sudo apt update && sudo apt upgrade -y)。apt安装Docker(容器运行时)、kubelet(节点管理)、kubeadm(集群初始化)、kubectl(命令行工具),并锁定版本避免自动升级(sudo apt-mark hold kubelet kubeadm kubectl)。sudo swapoff -a),并修改/etc/fstab文件注释Swap行(永久生效)。sudo ufw disable)以简化网络配置。kubeadm init --pod-network-cidr=10.244.0.0/16(指定Pod网络CIDR,需与后续网络插件匹配),完成后将输出的kubeadm join命令保存(用于添加Worker节点)。mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config),并设置正确权限(sudo chown $(id -u):$(id -g) $HOME/.kube/config)。kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml,实现Pod间通信。kubeadm join命令,等待节点状态变为Ready(通过kubectl get nodes验证)。kubectl是Ubuntu上管理Kubernetes资源的核心工具,支持陈述式(命令行直接操作)和声明式(YAML文件定义)两种方式:
kubectl get命令查看资源列表,常用选项:
-n <命名空间>:指定命名空间(如-n dev);-o wide:显示详细信息(如IP地址);-o yaml/json:以YAML/JSON格式输出;--all-namespaces(或-A):查看所有命名空间资源。kubectl get pods -n dev -o wide(查看dev命名空间下所有Pod的详细信息)。kubectl create命令直接创建资源,如Deployment、Namespace:kubectl create deployment nginx --image=nginx -n dev(在dev命名空间下创建名为nginx的Deployment,使用nginx镜像)。kubectl delete命令删除资源,如kubectl delete pod <pod-name> -n <namespace>。若Pod因副本控制器(如Deployment)无法删除,可添加--force --grace-period=0强制删除(慎用)。通过YAML文件定义资源状态,使用kubectl apply命令应用配置(支持更新、回滚),更符合DevOps实践。
nginx-deployment.yaml),内容示例:apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
执行kubectl apply -f nginx-deployment.yaml创建资源。replicas改为3),再次执行kubectl apply -f nginx-deployment.yaml,Kubernetes会自动滚动更新Pod。kubectl rollout undo deployment/<deployment-name> -n <namespace>回滚到上一个版本(如kubectl rollout undo deployment/nginx -n dev)。kubectl logs <pod-name> -n <namespace>(查看当前日志),-p选项查看重启前日志(如kubectl logs -p nginx-pod -n dev)。kubectl exec -it <pod-name> -n <namespace> -- /bin/bash(进入Pod的第一个容器),若Pod有多个容器,需指定-c <container-name>。kubectl scale deployment <deployment-name> --replicas=<数量> -n <namespace>(如kubectl scale deployment nginx --replicas=3 -n dev)。在Pod/Deployment的YAML文件中,通过resources字段设置requests(请求)和limits(限制):
requests:容器启动时所需的最小资源量,调度器据此将Pod分配至满足资源要求的节点;limits:容器运行时的最大资源量,超出限制会触发资源回收(CPU被限制使用,内存超过则触发OOM Killer终止容器)。resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
通过ResourceQuota限制命名空间的总资源边界,通过LimitRange为命名空间内的容器设置默认资源请求/限制,避免资源争抢:
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-team-quota
namespace: dev
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
persistentvolumeclaims: "10"
该配置限制dev命名空间内所有Pod的CPU请求总和不超过4核、内存请求不超过8GiB,PVC数量不超过10个。apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: dev
spec:
limits:
- type: Container
default:
requests.cpu: "200m"
requests.memory: "128Mi"
defaultRequest:
requests.cpu: "100m"
requests.memory: "64Mi"
max:
requests.cpu: "500m"
requests.memory: "256Mi"
该配置为dev命名空间内的容器设置默认资源请求(100m CPU、64Mi内存)和限制(500m CPU、256Mi内存)。通过kubectl patch命令直接修改Pod的resources.requests或resources.limits字段(无需重启Pod),适用于应对业务负载变化:
示例:kubectl patch pod ubuntu-pod -n dev -p '{"spec":{"containers":[{"name":"ubuntu-container","resources":{"requests":{"memory":"256Mi"},"limits":{"memory":"512Mi"}}}]}}'
注意:需Kubernetes 1.27及以上版本,且容器运行时(如Docker、containerd)支持CRI动态更新。
通过HPA根据CPU/内存使用率自动扩缩容Pod,应对流量波动:
kubectl autoscale deployment nginx --cpu-percent=50 --min=2 --max=5 -n devnginx Deployment的Pod副本数将根据CPU使用率自动调整,目标使用率为50%,最小副本数为2,最大为5。kubectl top nodes(查看节点CPU、内存使用)、kubectl top pods -n <namespace>(查看命名空间内Pod资源使用)。需提前安装Metrics Server(kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml)。通过EFK(Elasticsearch+Fluentd+Kibana)或Loki+Grafana收集容器日志,分析资源瓶颈(如应用内存泄漏导致的持续高内存使用)。
requests和limits(如业务高峰期增加CPU请求);通过以上步骤,可在Ubuntu系统上实现Kubernetes集群资源的精细化管控,确保集群稳定运行并提升资源利用率。