Skip to content

快速开始

概述

本章将指导您快速上手Kubernetes,从安装到部署第一个应用。我们将使用Minikube作为开发环境,因为它简单易用。

环境准备

1. 安装Docker

bash
# Linux (Ubuntu/Debian)
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

# 验证安装
docker --version

2. 安装Minikube

bash
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# macOS
brew install minikube

# Windows
choco install minikube

# 验证安装
minikube version

3. 安装kubectl

bash
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# macOS
brew install kubectl

# Windows
choco install kubernetes-cli

# 验证安装
kubectl version --client

启动Kubernetes集群

启动Minikube

bash
# 启动集群
minikube start --driver=docker --cpus=2 --memory=4096

# 查看集群状态
minikube status

# 查看节点信息
kubectl get nodes

# 查看集群信息
kubectl cluster-info

配置kubectl自动补全

bash
# Bash
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
source ~/.bashrc

# Zsh
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
echo 'alias k=kubectl' >> ~/.zshrc
echo 'complete -o default -F __start_kubectl k' >> ~/.zshrc
source ~/.zshrc

第一个应用:部署Nginx

1. 创建Deployment

bash
# 部署Nginx
kubectl create deployment nginx-deployment --image=nginx:1.21

# 查看Deployment
kubectl get deployments

# 查看Pod
kubectl get pods

# 查看Pod详细信息
kubectl describe pod <pod-name>

2. 创建Service

bash
# 创建NodePort Service
kubectl expose deployment nginx-deployment --type=NodePort --port=80

# 查看Service
kubectl get services

# 获取访问URL
minikube service nginx-deployment --url

# 访问应用
curl $(minikube service nginx-deployment --url)

3. 使用YAML文件部署

yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
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"
bash
# 使用YAML文件部署
kubectl apply -f nginx-deployment.yaml

# 查看部署状态
kubectl get deployments
kubectl get pods

常用操作

查看资源

bash
# 查看所有资源
kubectl get all

# 查看Pod详细信息
kubectl describe pod <pod-name>

# 查看Pod日志
kubectl logs <pod-name>

# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash

扩缩容

bash
# 扩展副本数
kubectl scale deployment nginx-deployment --replicas=5

# 查看扩展结果
kubectl get pods

# 缩减副本数
kubectl scale deployment nginx-deployment --replicas=2

更新应用

bash
# 更新镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.22

# 查看更新状态
kubectl rollout status deployment/nginx-deployment

# 查看更新历史
kubectl rollout history deployment/nginx-deployment

回滚应用

bash
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

部署多容器应用

示例:WordPress + MySQL

yaml
# wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:5.8
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc
bash
# 创建Secret
kubectl create secret generic mysql-pass --from-literal=password=YOUR_PASSWORD

# 部署WordPress
kubectl apply -f wordpress-deployment.yaml

# 查看部署状态
kubectl get pods
kubectl get services

# 获取访问URL
minikube service wordpress --url

配置管理

使用ConfigMap

yaml
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_NAME: "My Application"
  LOG_LEVEL: "INFO"
  MAX_CONNECTIONS: "100"
yaml
# deployment-with-configmap.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:latest
        env:
        - name: APP_NAME
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: APP_NAME
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: LOG_LEVEL

使用Secret

yaml
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64编码的密码
  API_KEY: YXBpLWtleS1zZWNyZXQ=

存储管理

使用PersistentVolumeClaim

yaml
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
yaml
# deployment-with-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:latest
        volumeMounts:
        - name: app-storage
          mountPath: /data
      volumes:
      - name: app-storage
        persistentVolumeClaim:
          claimName: app-pvc

网络管理

创建Ingress

yaml
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myapp.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80
bash
# 启用Ingress插件
minikube addons enable ingress

# 部署Ingress
kubectl apply -f ingress.yaml

# 查看Ingress
kubectl get ingress

# 添加hosts记录
echo "$(minikube ip) myapp.local" | sudo tee -a /etc/hosts

# 访问应用
curl http://myapp.local

多环境部署方案

1. 开发环境

使用Minikube

bash
# 启动开发环境集群
minikube start --driver=docker --cpus=2 --memory=4096 --kubernetes-version=v1.28.0

# 启用常用插件
minikube addons enable ingress
minikube addons enable metrics-server
minikube addons enable dashboard

# 访问Dashboard
minikube dashboard

开发工作流

  1. 本地开发和测试
  2. 构建Docker镜像
  3. 推送到私有镜像仓库
  4. 在Minikube中部署和验证

2. 测试环境

使用K3s

bash
# 安装K3s服务器
curl -sfL https://get.k3s.io | sh -

# 配置kubectl
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

# 添加Worker节点
curl -sfL https://get.k3s.io | K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> sh -

测试环境特点

  • 与生产环境配置相似
  • 数据量较小
  • 用于集成测试和预发布验证

3. 生产环境

使用kubeadm

bash
# 参考集群搭建章节的高可用部署
# 部署3个Master节点和多个Worker节点
# 配置负载均衡器和外部存储

生产环境特点

  • 高可用设计
  • 完善的监控和告警
  • 严格的安全配置
  • 定期备份和灾难恢复

4. 多环境配置管理

使用Kustomize

bash
# 创建基础配置
tree k8s/
├── base/
   ├── deployment.yaml
   └── service.yaml
└── overlays/
    ├── development/
   └── kustomization.yaml
    ├── testing/
   └── kustomization.yaml
    └── production/
        └── kustomization.yaml

部署到不同环境

bash
# 部署到开发环境
kubectl apply -k k8s/overlays/development

# 部署到测试环境
kubectl apply -k k8s/overlays/testing

# 部署到生产环境
kubectl apply -k k8s/overlays/production

开发环境搭建指南

1. 本地开发环境

使用Docker Desktop

bash
# 启用Kubernetes
# Docker Desktop -> Settings -> Kubernetes -> Enable Kubernetes

# 验证集群
kubectl get nodes

使用Minikube

bash
# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 启动集群
minikube start --driver=docker

# 配置kubectl
minikube update-context

2. 开发工具集成

IDE集成

  • VS Code: 安装Kubernetes扩展
  • IntelliJ IDEA: 安装Kubernetes插件
  • Eclipse: 安装Kubernetes工具

CI/CD集成

yaml
# .github/workflows/k8s-deploy.yml
name: Kubernetes Deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1
    - name: Build and push
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: myapp:${{ github.sha }}
    - name: Deploy to Kubernetes
      uses: steebchen/kubectl@master
      with:
        config: ${{ secrets.KUBE_CONFIG }}
        command: apply -f k8s/deployment.yaml

监控和日志

查看日志

bash
# 查看Pod日志
kubectl logs <pod-name>

# 查看指定容器日志
kubectl logs <pod-name> -c <container-name>

# 实时查看日志
kubectl logs -f <pod-name>

# 查看最近1小时的日志
kubectl logs --since=1h <pod-name>

# 查看Pod的前100行日志
kubectl logs --tail=100 <pod-name>

# 查看所有容器的日志
kubectl logs <pod-name> --all-containers

启用监控

bash
# 启用Metrics Server
minikube addons enable metrics-server

# 查看资源使用情况
kubectl top nodes
kubectl top pods
kubectl top pods --all-namespaces

# 查看Pod资源详情
kubectl describe pod <pod-name>

# 查看节点资源详情
kubectl describe node <node-name>

故障排查

常见问题解决

1. Pod处于Pending状态

问题原因

  • 节点资源不足
  • 资源配额限制
  • 调度约束不满足
  • 镜像拉取失败

解决方案

bash
# 查看Pod事件
kubectl describe pod <pod-name>

# 查看节点资源
kubectl describe node <node-name>

# 查看资源配额
kubectl get resourcequotas

# 检查镜像是否存在
docker pull <image-name>

# 检查网络连接
kubectl run test --image=busybox --rm -it -- ping docker.io

2. Pod处于CrashLoopBackOff状态

问题原因

  • 应用启动失败
  • 配置错误
  • 依赖服务不可用
  • 资源限制不足

解决方案

bash
# 查看Pod日志
kubectl logs <pod-name>
kubectl logs <pod-name> --previous  # 查看上一次启动的日志

# 查看容器退出码
kubectl describe pod <pod-name>

# 进入容器调试
kubectl exec -it <pod-name> -- /bin/sh

# 检查配置文件
kubectl get configmap <configmap-name> -o yaml

# 检查依赖服务
kubectl get pods -l app=<dependency-name>

3. Service无法访问

问题原因

  • Endpoint未正确创建
  • 网络策略限制
  • 防火墙规则阻止
  • 服务端口配置错误

解决方案

bash
# 查看Service详情
kubectl describe service <service-name>

# 查看Endpoint
kubectl get endpoints <service-name>

# 测试网络连通性
kubectl run test --image=busybox --rm -it -- ping <service-name>
kubectl run test --image=busybox --rm -it -- wget -O- http://<service-name>:<port>

# 检查网络策略
kubectl get networkpolicy --all-namespaces

# 检查Pod状态
kubectl get pods -l <service-selector>

4. 镜像拉取失败

问题原因

  • 镜像不存在
  • 网络连接问题
  • 认证失败
  • 镜像仓库不可用

解决方案

bash
# 检查镜像拉取错误
kubectl describe pod <pod-name> | grep -A 10 "Failed to pull image"

# 手动拉取镜像
docker pull <image-name>

# 检查网络连接
ping docker.io

# 检查认证配置
kubectl get secret --type=docker-registry

# 使用国内镜像源
# 修改deployment使用国内镜像源

5. 节点NotReady状态

问题原因

  • kubelet服务未运行
  • 网络插件故障
  • 节点资源耗尽
  • 磁盘空间不足

解决方案

bash
# 检查节点状态
kubectl describe node <node-name>

# 检查kubelet状态
ssh <node-ip> systemctl status kubelet

# 查看kubelet日志
ssh <node-ip> journalctl -u kubelet -f

# 检查节点资源
ssh <node-ip> free -m
ssh <node-ip> df -h

# 检查网络插件
kubectl get pods -n kube-system -l k8s-app=<network-plugin>

6. 配置错误

问题原因

  • YAML语法错误
  • 字段值无效
  • 依赖资源不存在
  • 权限不足

解决方案

bash
# 验证YAML语法
kubectl apply --dry-run=client -f <file.yaml>

# 查看详细错误信息
kubectl apply -f <file.yaml> -v=9

# 检查依赖资源
kubectl get <resource-type> <resource-name>

# 检查权限
kubectl auth can-i create <resource-type> --namespace <namespace>

# 使用kubectl explain查看字段说明
kubectl explain <resource-type>.<field>

7. 集群无法启动

问题原因

  • 端口冲突
  • 配置文件错误
  • 依赖服务未运行
  • 网络连接问题

解决方案

bash
# 检查kubelet状态
systemctl status kubelet

# 查看kubelet日志
journalctl -u kubelet -f

# 检查apiserver状态
kubectl cluster-info

# 检查etcd状态
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 endpoint health

# 重启服务
systemctl restart kubelet
systemctl restart docker

清理资源

删除资源

bash
# 删除Deployment
kubectl delete deployment nginx-deployment

# 删除Service
kubectl delete service nginx-deployment

# 删除所有资源
kubectl delete all --all

# 停止Minikube集群
minikube stop

# 删除Minikube集群
minikube delete

学习路径建议

下一步学习

  1. 深入学习Pod:了解Pod生命周期、探针、资源限制
  2. 掌握Service:学习不同类型的Service及其应用场景
  3. 实践存储管理:使用PV、PVC、StorageClass
  4. 配置管理:掌握ConfigMap和Secret的使用
  5. 网络配置:学习Ingress和网络策略

实践项目

  1. 部署一个简单的Web应用
  2. 配置数据库持久化存储
  3. 实现应用滚动更新
  4. 配置应用健康检查
  5. 设置资源配额和限制

总结

通过本章的学习,您已经掌握了Kubernetes的基本操作和多环境部署方案:

核心内容

  1. 环境准备:安装Docker、Minikube和kubectl
  2. 集群管理:启动、停止和管理Kubernetes集群
  3. 应用部署:部署单容器和多容器应用
  4. 服务管理:创建和配置Service、Ingress
  5. 配置管理:使用ConfigMap和Secret管理配置
  6. 存储管理:使用PersistentVolumeClaim管理存储
  7. 监控日志:查看Pod日志和资源使用情况
  8. 故障排查:解决常见的Kubernetes问题

多环境部署

  • 开发环境:使用Minikube,快速启动和测试
  • 测试环境:使用K3s,模拟生产环境配置
  • 生产环境:使用kubeadm部署高可用集群
  • 配置管理:使用Kustomize管理多环境配置

开发工具集成

  • IDE集成:VS Code、IntelliJ IDEA、Eclipse等
  • CI/CD集成:GitHub Actions、GitLab CI等
  • 本地开发:Docker Desktop、Minikube等

故障排查能力

  • Pod问题:Pending、CrashLoopBackOff等状态的解决
  • Service问题:网络连通性、Endpoint配置等
  • 节点问题:NotReady状态、资源耗尽等
  • 配置问题:YAML语法、权限不足等

通过本章的学习,您已经具备了Kubernetes的基本操作能力,可以开始构建和管理容器化应用。接下来可以深入学习各个核心概念,如Pod、Deployment、Service等,逐步掌握Kubernetes的高级特性和最佳实践。

下一步学习