Deploying and Managing Docker Container Clusters with Kubernetes - Mastering Large-Scale Container Orchestration
2025/8/31大约 5 分钟
部署与管理 Docker 容器集群
Kubernetes 集群架构
Kubernetes 集群是一个分布式的容器编排平台,由控制平面和工作节点组成。理解集群架构对于有效部署和管理容器化应用至关重要。
控制平面组件
API Server:
- 集群管理的统一入口
- 提供 RESTful API 接口
- 处理所有集群操作请求
etcd:
- 分布式键值存储
- 存储集群的所有状态信息
- 保证数据一致性和持久性
Scheduler:
- 负责 Pod 调度
- 根据资源需求和约束选择节点
- 优化资源利用率
Controller Manager:
- 运行各种控制器
- 维护集群期望状态
- 处理节点故障和恢复
工作节点组件
kubelet:
- 节点代理程序
- 管理节点上的 Pod 和容器
- 向控制平面报告节点状态
kube-proxy:
- 网络代理组件
- 维护网络规则
- 实现服务负载均衡
容器运行时:
- 运行容器的实际环境
- 支持 Docker、containerd 等
集群部署方案
本地开发集群
- Minikube:
- 单节点 Kubernetes 集群
- 适合本地开发和测试
# 安装 Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群
minikube start
# 查看集群状态
kubectl cluster-info- kind (Kubernetes in Docker):
- 使用 Docker 容器运行 Kubernetes 节点
- 轻量级且易于使用
# 安装 kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 创建集群
kind create cluster
# 创建多节点集群
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF生产环境集群
- kubeadm:
- 官方推荐的集群部署工具
- 适合生产环境部署
# 初始化控制平面
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 配置 kubectl
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://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 添加工作节点
sudo kubeadm join <control-plane-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>- 云厂商托管服务:
- AWS EKS、Azure AKS、Google GKE
- 简化集群管理
# AWS EKS 示例
eksctl create cluster \
--name my-cluster \
--version 1.21 \
--region us-west-2 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4集群管理操作
节点管理
# 查看节点状态
kubectl get nodes
# 查看节点详细信息
kubectl describe node <node-name>
# 标记节点不可调度
kubectl cordon <node-name>
# 驱逐节点上的 Pod
kubectl drain <node-name> --ignore-daemonsets
# 恢复节点调度
kubectl uncordon <node-name>集群监控
# 查看集群组件状态
kubectl get componentstatuses
# 查看集群资源使用
kubectl top nodes
# 查看集群事件
kubectl get events --all-namespaces集群维护
# 升级集群版本
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.21.0
# 备份 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 /tmp/etcd-snapshot.db多层应用部署
微服务架构示例
# database-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: database
spec:
replicas: 1
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword"
- name: MYSQL_DATABASE
value: "myapp"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
name: database
spec:
selector:
app: database
ports:
- port: 3306
targetPort: 3306
clusterIP: None# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 3
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: myapp-backend:latest
env:
- name: DATABASE_URL
value: "mysql://root:rootpassword@database:3306/myapp"
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: myapp-frontend:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
type: LoadBalancer集群安全配置
认证和授权
# rbac-example.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: production
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: ServiceAccount
name: app-service-account
namespace: production
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io网络策略
# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 3306集群资源管理
资源配额
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
pods: "10"限制范围
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-min-max-demo
spec:
limits:
- max:
cpu: "800m"
min:
cpu: "100m"
type: Container集群扩展性
水平 Pod 自动扩展
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50集群自动扩展
# AWS EKS 集群自动扩展器
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml集群故障排除
常见问题诊断
# 检查节点状态
kubectl get nodes
# 检查 Pod 状态
kubectl get pods --all-namespaces
# 查看 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 top nodes
# 查看 Pod 资源使用
kubectl top pods
# 查看集群事件
kubectl get events --sort-by=.metadata.creationTimestamp最佳实践
集群规划
节点规划:
- 根据工作负载需求规划节点类型和数量
- 考虑计算、存储和网络需求
高可用性设计:
- 部署多个控制平面节点
- 跨可用区分布工作节点
安全配置
网络隔离:
- 使用网络策略限制 Pod 间通信
- 配置适当的防火墙规则
访问控制:
- 使用 RBAC 控制用户权限
- 定期轮换认证凭证
监控和日志
集中化监控:
- 部署 Prometheus 和 Grafana
- 设置告警规则
日志收集:
- 使用 Fluentd 或 Logstash 收集日志
- 集成 Elasticsearch 和 Kibana
# 监控配置示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: metrics
interval: 30s通过本节内容,我们深入了解了如何部署和管理 Docker 容器集群,包括集群架构、部署方案、管理操作、安全配置等方面。掌握这些知识将帮助您构建和维护稳定、安全的 Kubernetes 集群环境。
