389 lines
7.6 KiB
Markdown
389 lines
7.6 KiB
Markdown
# 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 技术团队编写,如有疑问请联系我们。*
|