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

7.6 KiB
Raw Permalink Blame History

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 提供了强大的容器编排能力,但同时也带来了复杂性和学习成本。通过本指南的学习,您应该能够:

  1. 搭建一个基本的 Kubernetes 集群
  2. 部署和管理容器化应用
  3. 配置网络和服务发现
  4. 实施监控和故障排除
  5. 遵循最佳实践确保生产环境的稳定性

记住Kubernetes 是一个不断发展的平台,建议您:

  • 保持对最新版本的关注
  • 参与社区讨论和贡献
  • 在实际项目中积累经验
  • 持续学习和改进

本文由 CloudPro 技术团队编写,如有疑问请联系我们。