CentOS环境下Kubernetes容器管理核心技巧
在CentOS上部署Kubernetes集群是容器管理的前提,需完成以下关键步骤:
setenforce 0并修改/etc/selinux/config)、停用firewalld(systemctl stop firewalld && systemctl disable firewalld)、配置Docker使用systemd作为cgroup驱动(编辑/etc/docker/daemon.json添加"exec-opts": ["native.cgroupdriver=systemd"]并重启Docker)。yum install -y kubelet kubeadm kubectl --disable-gpg-check安装kubelet、kubeadm、kubectl,启用kubelet服务(systemctl enable --now kubelet)。kubeadm init --pod-network-cidr=10.244.0.0/16(Flannel网络插件需指定CIDR),按提示配置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命令,完成节点加入。kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml部署Flannel,实现Pod间通信。kubectl get pods -A查看所有命名空间的Pod状态(确保STATUS为Running)。kubectl exec -it <pod-name> -- /bin/bash进入容器内部(交互式Shell);若需附加到正在运行的容器(如查看应用日志输出),使用kubectl attach <pod-name>。kubectl delete pod <pod-name>删除指定Pod(若Pod由Deployment管理,会自动重建)。image字段(如kubectl set image deployment/nginx-deployment nginx=nginx:v2),触发滚动更新(逐步替换旧Pod)。kubectl logs -f <pod-name>实时跟踪Pod日志(类似tail -f);若需查看最后100行日志,添加--tail=100;查看过去5分钟的日志,添加--since=5m。-c <container-name>指定容器(如kubectl logs -c app-container <pod-name>)。kubectl logs --previous <pod-name>查看容器重启前的日志。/var/log/containers/*.log并转发至Elasticsearch;Loki通过Promtail收集日志,与Grafana集成实现可视化。同时,配置logrotate(如/etc/logrotate.d/kubernetes-containers)实现日志轮转(每天轮转、保留7天、压缩旧日志),避免磁盘爆满。resources.requests(最小资源,用于调度)和resources.limits(最大资源,防止资源争抢)。例如:resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
HorizontalPodAutoscaler根据CPU/内存利用率自动调整Pod数量。例如,创建HPA实现当CPU利用率超过50%时,自动扩容Pod(最多10个):apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
affinity规则控制Pod调度。例如,使用反亲和性将相关Pod分散到不同节点(提高可用性):affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- example
topologyKey: "kubernetes.io/hostname"
kubectl taint nodes <node-name> key=value:NoSchedule),配置容器的容忍度(tolerations),确保关键业务Pod运行在符合条件的节点上。vm.swappiness降低到10以下,减少交换分区使用),优化容器性能。Role定义资源操作权限(如get、list、create),通过RoleBinding绑定到用户/组。NetworkPolicy定义Pod间通信规则(如仅允许同一命名空间的Pod访问),隔离敏感应用;关闭不必要的端口、禁用Swap、配置防火墙、同步时间(ntpdate),确保集群环境安全。