2025-09-16 16:15:57 +08:00

389 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kubernetes 部署完整指南
Kubernetes 作为容器编排的事实标准,已经成为现代云原生应用部署的核心技术。本指南将从零开始,详细介绍 Kubernetes 集群的搭建、应用部署和服务管理的完整流程。
## 概述
Kubernetes 是一个开源的容器编排平台,它能够自动化部署、扩展和管理容器化应用程序。通过 Kubernetes您可以轻松管理大规模的容器集群实现高可用性、自动扩展和滚动更新等企业级特性。
## 前置要求
### 1. 系统要求
- **操作系统**: Ubuntu 20.04+ / CentOS 7+ / RHEL 7+
- **CPU**: 至少 2 核
- **内存**: 至少 4GB RAM
- **存储**: 至少 20GB 可用空间
- **网络**: 稳定的网络连接
### 2. 软件依赖
- Docker 20.10+ 或 containerd 1.4+
- 支持的内核版本 (3.10+)
- 禁用 swap 分区
- 配置防火墙规则
## 集群搭建
### 1. 安装 Docker
```bash
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
# CentOS/RHEL
sudo yum install -y docker
sudo systemctl enable docker
sudo systemctl start docker
```
### 2. 安装 Kubernetes 组件
```bash
# 添加 Kubernetes 源
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
# 安装 kubeadm, kubelet 和 kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
```
### 3. 初始化主节点
```bash
# 初始化集群
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
# 安装网络插件 (Flannel)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
```
### 4. 添加工作节点
```bash
# 在主节点上生成加入命令
kubeadm token create --print-join-command
# 在工作节点上执行加入命令
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
```
## 应用部署
### 1. 创建命名空间
```yaml
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: myapp
labels:
name: myapp
```
```bash
kubectl apply -f namespace.yaml
```
### 2. 部署应用
#### 2.1 使用 Deployment
```yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: myapp
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
```
#### 2.2 使用 Service 暴露服务
```yaml
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: myapp
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
```
#### 2.3 使用 Ingress 配置外部访问
```yaml
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: myapp
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
```
### 3. 应用配置管理
#### 3.1 使用 ConfigMap
```yaml
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: myapp
data:
app.properties: |
database.url=jdbc:mysql://mysql:3306/myapp
cache.enabled=true
log.level=INFO
```
#### 3.2 使用 Secret
```yaml
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
namespace: myapp
type: Opaque
data:
username: YWRtaW4= # admin
password: cGFzc3dvcmQ= # password
```
## 服务管理
### 1. 扩缩容
```bash
# 手动扩缩容
kubectl scale deployment nginx-deployment --replicas=5
# 自动扩缩容 (HPA)
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
```
### 2. 滚动更新
```bash
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
```
### 3. 健康检查
```yaml
# 在 Deployment 中添加健康检查
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.21
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
```
## 监控与日志
### 1. 资源监控
```bash
# 查看节点资源使用情况
kubectl top nodes
# 查看 Pod 资源使用情况
kubectl top pods
# 查看命名空间资源使用情况
kubectl top pods --namespace=myapp
```
### 2. 日志管理
```bash
# 查看 Pod 日志
kubectl logs <pod-name> -n myapp
# 实时跟踪日志
kubectl logs -f <pod-name> -n myapp
# 查看多个容器的日志
kubectl logs <pod-name> -c <container-name> -n myapp
```
### 3. 事件监控
```bash
# 查看集群事件
kubectl get events --sort-by='.lastTimestamp'
# 查看特定命名空间的事件
kubectl get events -n myapp --sort-by='.lastTimestamp'
```
## 故障排除
### 1. 常见问题诊断
#### Pod 无法启动
```bash
# 查看 Pod 状态
kubectl describe pod <pod-name> -n myapp
# 查看 Pod 日志
kubectl logs <pod-name> -n myapp
# 检查节点资源
kubectl describe node <node-name>
```
#### 服务无法访问
```bash
# 检查 Service 配置
kubectl get svc -n myapp
# 检查 Endpoints
kubectl get endpoints -n myapp
# 测试网络连通性
kubectl run test-connection --image=busybox --rm -it --restart=Never -- nslookup nginx-service
```
### 2. 性能优化
#### 资源限制
```yaml
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
```
#### 节点亲和性
```yaml
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
```
## 最佳实践
### 1. 安全性
- 使用 RBAC 控制访问权限
- 定期更新 Kubernetes 版本
- 启用 Pod 安全策略
- 使用网络策略限制 Pod 间通信
### 2. 可靠性
- 配置多个副本确保高可用
- 使用反亲和性分散 Pod 分布
- 实施健康检查和自动恢复
- 配置资源限制防止资源耗尽
### 3. 可维护性
- 使用标签和注解组织资源
- 实施基础设施即代码 (IaC)
- 建立监控和告警体系
- 定期备份集群配置
## 总结
Kubernetes 提供了强大的容器编排能力,但同时也带来了复杂性和学习成本。通过本指南的学习,您应该能够:
1. 搭建一个基本的 Kubernetes 集群
2. 部署和管理容器化应用
3. 配置网络和服务发现
4. 实施监控和故障排除
5. 遵循最佳实践确保生产环境的稳定性
记住Kubernetes 是一个不断发展的平台,建议您:
- 保持对最新版本的关注
- 参与社区讨论和贡献
- 在实际项目中积累经验
- 持续学习和改进
---
*本文由 CloudPro 技术团队编写,如有疑问请联系我们。*