CentOS環境下Kubernetes(K8s)最佳實踐案例
在CentOS上部署K8s前,需完成系統級別的安全與性能優化,確保集群穩定性:
firewalld
(systemctl stop firewalld && systemctl disable firewalld
),避免端口沖突;禁用SELinux(sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0
),防止權限限制導致組件無法正常運行;關閉Swap分區(swapoff -a
并注釋/etc/fstab
中的swap行),提升K8s性能。master
、node1
,使用hostnamectl set-hostname
命令),并在所有節點的/etc/hosts
文件中添加集群內部IP與主機名映射(如192.168.1.10 master
),確保節點間通過主機名通信。chrony
服務(yum install chrony -y && systemctl enable chrony && systemctl start chrony
),同步所有節點時間,避免因時間不一致導致的組件異常(如etcd數據不一致)。為實現K8s集群的高可用,需重點配置多Master節點與負載均衡:
master1
、master2
、master3
),每個節點執行kubeadm init
初始化命令(指定--apiserver-advertise-address
為當前節點IP、--pod-network-cidr
為Pod網段,如10.244.0.0/16
),生成集群配置。HAProxy
+Keepalived
搭建Master節點的高可用負載均衡:
yum install haproxy -y
),編輯/etc/haproxy/haproxy.cfg
,添加前端監聽端口(如16443
)和后端Master節點列表(如server master1 192.168.1.10:6443 check
、server master2 192.168.1.11:6443 check
),實現流量分發。yum install keepalived -y
),配置虛擬IP(VIP,如192.168.1.200
),通過VRRP協議實現Master節點故障時的VIP漂移,確保API Server的高可用。K8s集群的網絡通信依賴CNI插件,同時需通過網絡策略限制Pod間流量:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
命令部署,實現Pod間、Pod與節點間的網絡互通。NetworkPolicy
資源限制Pod間通信(如僅允許同一Namespace下的frontend
Pod訪問backend
Pod),提升集群安全性。示例策略:apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
K8s集群的安全需覆蓋系統層、集群層、應用層三個維度:
yum update
更新系統,kubeadm upgrade
更新K8s),修復已知漏洞。kubelet
參數(修改/var/lib/kubelet/config.yaml
),啟用readOnlyRootFilesystem
(容器根目錄只讀)、allowPrivilegeEscalation: false
(禁止提權),限制容器權限。kubeadm init
時自動配置),使用RBAC
(基于角色的訪問控制)限制用戶權限(如開發人員僅能訪問dev
Namespace,管理員擁有集群管理權限)。/etc/kubernetes/manifests/etcd.yaml
,添加--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
參數),保護Secret數據。Trivy
掃描鏡像漏洞(如trivy image centos:7
),阻斷高風險鏡像入集群;鏡像內避免存儲敏感信息(如密碼、密鑰),使用ConfigMap
或Secret
管理配置。Secret
存儲敏感信息(如數據庫密碼),并通過Vault
CSI驅動實現動態密鑰注入(避免Secret硬編碼在Pod中)。有效的監控與運維是K8s集群長期穩定運行的關鍵:
Prometheus
+Grafana
搭建集群監控體系(Prometheus
采集節點、Pod、etcd等指標,Grafana
可視化展示),配置告警規則(如節點宕機、Pod重啟次數超過閾值),及時發現異常。EFK
(Elasticsearch+Fluentd+Kibana)堆棧收集集群日志(Fluentd
采集節點日志,Elasticsearch
存儲,Kibana
可視化),方便排查應用故障(如容器崩潰日志、訪問日志)。etcdctl snapshot save
命令,如etcdctl snapshot save /backup/etcd-snapshot.db
),并測試恢復流程(使用etcdctl snapshot restore
恢復數據),確保數據安全。應用部署時需遵循標準化與高可用原則:
Deployment
資源管理應用(而非直接創建Pod),設置replicas
(副本數≥2,確保高可用)、resources.requests/limits
(CPU/內存請求與限制,避免資源爭搶)、livenessProbe
(存活探針,檢測應用是否健康,如curl -f http://localhost:8080/health
)、readinessProbe
(就緒探針,檢測應用是否可接收流量,如curl -f http://localhost:8080/ready
)。ConfigMap
中(kubectl create configmap my-config --from-file=config.properties
),通過volumeMount
掛載到Pod;敏感信息(如數據庫密碼)存儲在Secret
中(kubectl create secret generic db-password --from-literal=password=123456
),通過環境變量或volumeMount
注入。replicas≥2
,并通過affinity
規則(如podAntiAffinity
)將Pod分散到不同節點(避免單節點故障導致多個Pod不可用),提升應用可用性。