7.6 KiB
7.6 KiB
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
# 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 组件
# 添加 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. 初始化主节点
# 初始化集群
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. 添加工作节点
# 在主节点上生成加入命令
kubeadm token create --print-join-command
# 在工作节点上执行加入命令
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
应用部署
1. 创建命名空间
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: myapp
labels:
name: myapp
kubectl apply -f namespace.yaml
2. 部署应用
2.1 使用 Deployment
# 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 暴露服务
# 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 配置外部访问
# 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
# 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
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
namespace: myapp
type: Opaque
data:
username: YWRtaW4= # admin
password: cGFzc3dvcmQ= # password
服务管理
1. 扩缩容
# 手动扩缩容
kubectl scale deployment nginx-deployment --replicas=5
# 自动扩缩容 (HPA)
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
2. 滚动更新
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 查看更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
3. 健康检查
# 在 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. 资源监控
# 查看节点资源使用情况
kubectl top nodes
# 查看 Pod 资源使用情况
kubectl top pods
# 查看命名空间资源使用情况
kubectl top pods --namespace=myapp
2. 日志管理
# 查看 Pod 日志
kubectl logs <pod-name> -n myapp
# 实时跟踪日志
kubectl logs -f <pod-name> -n myapp
# 查看多个容器的日志
kubectl logs <pod-name> -c <container-name> -n myapp
3. 事件监控
# 查看集群事件
kubectl get events --sort-by='.lastTimestamp'
# 查看特定命名空间的事件
kubectl get events -n myapp --sort-by='.lastTimestamp'
故障排除
1. 常见问题诊断
Pod 无法启动
# 查看 Pod 状态
kubectl describe pod <pod-name> -n myapp
# 查看 Pod 日志
kubectl logs <pod-name> -n myapp
# 检查节点资源
kubectl describe node <node-name>
服务无法访问
# 检查 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. 性能优化
资源限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
节点亲和性
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
最佳实践
1. 安全性
- 使用 RBAC 控制访问权限
- 定期更新 Kubernetes 版本
- 启用 Pod 安全策略
- 使用网络策略限制 Pod 间通信
2. 可靠性
- 配置多个副本确保高可用
- 使用反亲和性分散 Pod 分布
- 实施健康检查和自动恢复
- 配置资源限制防止资源耗尽
3. 可维护性
- 使用标签和注解组织资源
- 实施基础设施即代码 (IaC)
- 建立监控和告警体系
- 定期备份集群配置
总结
Kubernetes 提供了强大的容器编排能力,但同时也带来了复杂性和学习成本。通过本指南的学习,您应该能够:
- 搭建一个基本的 Kubernetes 集群
- 部署和管理容器化应用
- 配置网络和服务发现
- 实施监控和故障排除
- 遵循最佳实践确保生产环境的稳定性
记住,Kubernetes 是一个不断发展的平台,建议您:
- 保持对最新版本的关注
- 参与社区讨论和贡献
- 在实际项目中积累经验
- 持续学习和改进
本文由 CloudPro 技术团队编写,如有疑问请联系我们。