Minikube教程#

技术介绍#

Minikube是一个轻量级的Kubernetes发行版,专为在本地机器上运行单节点Kubernetes集群而设计。它由Kubernetes SIGs(特别兴趣小组)开发和维护,允许开发者在本地环境中快速搭建Kubernetes集群,用于开发、测试和学习Kubernetes。

Minikube核心概念#

  • 单节点集群:在本地机器上运行的Kubernetes集群,包含控制平面和工作节点
  • 虚拟机驱动:使用虚拟机技术(如VirtualBox、KVM、Hyper-V等)运行Kubernetes节点
  • 容器运行时:支持多种容器运行时,如Docker、containerd等
  • 插件系统:通过插件扩展Minikube功能

Minikube架构#

  • Minikube CLI:命令行工具,用于管理Minikube集群
  • 虚拟机:运行Kubernetes节点的虚拟机
  • Kubernetes组件:在虚拟机中运行的Kubernetes控制平面和工作节点组件

入门级使用#

安装Minikube#

在不同操作系统上安装Minikube:

# Linux/macOS
# 使用curl安装
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# macOS使用Homebrew安装
brew install minikube

# Windows使用Chocolatey安装
choco install minikube

# 验证安装
minikube version

基本Minikube命令#

使用Minikube的基本命令:

# 查看Minikube版本
minikube version

# 启动集群
minikube start

# 停止集群
minikube stop

# 删除集群
minikube delete

# 查看集群状态
minikube status

# 查看集群信息
kubectl cluster-info

# 查看节点
kubectl get nodes

创建第一个Minikube集群#

创建一个基本的Minikube集群:

# 启动默认集群
minikube start

# 查看集群状态
minikube status

# 查看节点
kubectl get nodes

# 部署应用
kubectl create deployment nginx --image=nginx

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务
kubectl get services

# 访问应用
minikube service nginx

# 停止集群
minikube stop

# 删除集群
minikube delete

初级使用#

Minikube配置选项#

使用Minikube配置选项:

# 指定虚拟机驱动
minikube start --driver=virtualbox

# 指定容器运行时
minikube start --container-runtime=containerd

# 指定Kubernetes版本
minikube start --kubernetes-version=v1.23.0

# 指定内存和CPU
minikube start --memory=4096 --cpus=2

# 使用本地Docker守护进程
minikube start --driver=docker

# 查看可用的配置选项
minikube config view

# 设置默认配置
minikube config set driver docker
minikube config set memory 4096
minikube config set cpus 2

Minikube网络配置#

配置Minikube网络:

# 查看Minikube IP
minikube ip

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务URL
minikube service nginx --url

# 端口转发
kubectl port-forward service/nginx 8080:80
curl http://localhost:8080

# 使用Ingress
minikube addons enable ingress

# 部署Ingress资源
kubectl apply -f ingress.yaml

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: nginx.minikube
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

# 添加主机名到/etc/hosts
echo "$(minikube ip) nginx.minikube" | sudo tee -a /etc/hosts

# 访问应用
curl http://nginx.minikube

Minikube存储配置#

配置Minikube存储:

# 创建持久卷
kubectl apply -f pv.yaml

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

# 创建持久卷声明
kubectl apply -f pvc.yaml

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

# 创建使用PVC的Pod
kubectl apply -f pod-with-pvc.yaml

# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: my-pvc

# 查看存储状态
kubectl get pv
kubectl get pvc

中级使用#

Minikube插件#

使用Minikube插件:

# 查看可用插件
minikube addons list

# 启用插件
minikube addons enable dashboard
minikube addons enable metrics-server
minikube addons enable ingress
minikube addons enable storage-provisioner
minikube addons enable metallb

# 禁用插件
minikube addons disable dashboard

# 查看已启用的插件
minikube addons list | grep STATUS | grep enabled

Minikube Dashboard#

使用Minikube Dashboard:

# 启用Dashboard插件
minikube addons enable dashboard

# 打开Dashboard
minikube dashboard

# 查看Dashboard URL
minikube dashboard --url

# 访问Dashboard
# 在浏览器中打开Dashboard URL

Minikube与本地Docker集成#

将Minikube与本地Docker集成:

# 启动Minikube
minikube start

# 使用Minikube的Docker环境
eval $(minikube docker-env)

# 构建镜像
docker build -t my-app:latest .

# 部署应用,使用本地镜像
kubectl apply -f app-deployment.yaml

# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080
      # 使用本地镜像,不需要拉取
      imagePullPolicy: Never

# 查看应用状态
kubectl get pods

中上级使用#

Minikube与CI/CD集成#

将Minikube与CI/CD集成:

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t my-app:latest .

.test:
  stage: test
  script:
    - 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
    - eval $(minikube docker-env)
    - docker build -t my-app:latest .
    - kubectl apply -f app-deployment.yaml
    - kubectl wait --for=condition=ready pod -l app=my-app --timeout=90s
    - kubectl port-forward service/my-app 8080:80 &
    - sleep 5
    - curl http://localhost:8080
    - minikube delete

# Jenkinsfile
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'docker build -t my-app:latest .'
            }
        }
        stage('Test') {
            steps {
                sh 'curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64'
                sh 'sudo install minikube-linux-amd64 /usr/local/bin/minikube'
                sh 'minikube start --driver=docker'
                sh 'eval $(minikube docker-env)'
                sh 'docker build -t my-app:latest .'
                sh 'kubectl apply -f app-deployment.yaml'
                sh 'kubectl wait --for=condition=ready pod -l app=my-app --timeout=90s'
                sh 'kubectl port-forward service/my-app 8080:80 &'
                sh 'sleep 5'
                sh 'curl http://localhost:8080'
                sh 'minikube delete'
            }
        }
    }
}

Minikube多集群#

管理多个Minikube集群:

# 创建多个集群
minikube start --profile cluster1
minikube start --profile cluster2

# 查看集群
minikube profile list

# 切换集群
minikube profile cluster1
kubectl get nodes

minikube profile cluster2
kubectl get nodes

# 停止集群
minikube stop --profile cluster1
minikube stop --profile cluster2

# 删除集群
minikube delete --profile cluster1
minikube delete --profile cluster2

Minikube与Kubernetes版本测试#

使用Minikube测试不同Kubernetes版本:

# 启动不同版本的集群
minikube start --kubernetes-version=v1.22.0 --profile k8s-v1.22
minikube start --kubernetes-version=v1.23.0 --profile k8s-v1.23
minikube start --kubernetes-version=v1.24.0 --profile k8s-v1.24

# 查看集群版本
minikube profile k8s-v1.22
kubectl version

minikube profile k8s-v1.23
kubectl version

minikube profile k8s-v1.24
kubectl version

# 测试应用在不同版本上的兼容性
minikube profile k8s-v1.22
kubectl apply -f app-deployment.yaml

minikube profile k8s-v1.23
kubectl apply -f app-deployment.yaml

minikube profile k8s-v1.24
kubectl apply -f app-deployment.yaml

高级使用#

Minikube与Operator开发#

使用Minikube开发和测试Kubernetes Operator:

# 安装Operator SDK
curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.20.0/operator-sdk_linux_amd64
tar xvf operator-sdk_linux_amd64.tar.gz
chmod +x operator-sdk
mv operator-sdk /usr/local/bin/

# 启动Minikube
minikube start

# 初始化Operator项目
operator-sdk init --domain example.com --repo github.com/example/my-operator

# 创建API和控制器
operator-sdk create api --group apps --version v1alpha1 --kind MyApp --resource --controller

# 构建和推送镜像
eval $(minikube docker-env)
make docker-build docker-push IMG=my-operator:latest

# 部署Operator
make deploy IMG=my-operator:latest

# 查看Operator状态
kubectl get pods -n my-operator-system

# 创建自定义资源实例
kubectl apply -f config/samples/apps_v1alpha1_myapp.yaml

# 查看实例状态
kubectl get myapp

Minikube与Istio集成#

将Minikube与Istio集成:

# 启动Minikube
minikube start --memory=8192 --cpus=4

# 安装Istio
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y

# 部署Bookinfo应用
kubectl label namespace default istio-injection=enabled
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 查看应用状态
kubectl get pods

# 访问应用
minikube service productpage

# 查看Istio Dashboard
istioctl dashboard kiali

Minikube与Helm集成#

将Minikube与Helm集成:

# 安装Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# 启动Minikube
minikube start

# 添加Helm仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 安装应用
helm install my-nginx bitnami/nginx

# 查看应用状态
helm status my-nginx
kubectl get pods

# 升级应用
helm upgrade my-nginx bitnami/nginx --set service.type=NodePort

# 卸载应用
helm uninstall my-nginx

大师级使用#

Minikube与Kubernetes测试#

使用Minikube进行Kubernetes测试:

# 启动Minikube
minikube start

# 克隆Kubernetes仓库
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes

# 运行测试
make test WHAT=./pkg/kubelet GOFLAGS="-v"

# 运行集成测试
make integration WHAT=./test/integration/network

# 清理测试环境
minikube delete

Minikube与云原生工具链#

集成Minikube与云原生工具链:

# 启动Minikube
minikube start --memory=8192 --cpus=4

# 安装Prometheus和Grafana
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

# 查看监控组件
kubectl get pods -n default

# 访问Grafana
minikube service prometheus-grafana

# 安装ELK Stack
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch --set replicas=1
helm install kibana elastic/kibana
helm install filebeat elastic/filebeat

# 查看ELK组件
kubectl get pods -n default

# 访问Kibana
minikube service kibana-kb-http

Minikube与DevSpace集成#

将Minikube与DevSpace集成:

# 安装DevSpace
curl -s -L "https://github.com/loft-sh/devspace/releases/latest" | sed -nE 's!.*"([^"]*devspace-[^"]*linux-amd64)".*!https://github.com\1!p' | xargs -n 1 curl -L -o devspace && chmod +x devspace; sudo mv devspace /usr/local/bin/

# 启动Minikube
minikube start

# 初始化DevSpace项目
devspace init

# 部署应用
devspace deploy

# 开发模式
devspace dev

# 查看应用状态
devspace status

# 清理环境
devspace purge

实战案例#

案例一:本地开发环境#

场景:为开发团队创建一致的本地Kubernetes开发环境。

解决方案:使用Minikube创建标准化的本地集群。

实施步骤

  1. 安装Minikube

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
  2. 配置Minikube

    minikube config set driver docker
    minikube config set memory 4096
    minikube config set cpus 2
  3. 启动集群

    minikube start
  4. 部署开发工具

    minikube addons enable dashboard
    minikube addons enable metrics-server
    minikube addons enable ingress

结果

  • 成功创建了标准化的本地开发环境
  • 部署了开发所需的基础设施
  • 团队成员可以使用相同的环境进行开发

案例二:CI/CD测试环境#

场景:在CI/CD pipeline中使用Minikube进行应用测试。

解决方案:集成Minikube到CI/CD系统。

实施步骤

  1. 配置GitLab CI

    # .gitlab-ci.yml
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t my-app:latest .
    
    test:
      stage: test
      script:
        - 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
        - eval $(minikube docker-env)
        - docker build -t my-app:latest .
        - kubectl apply -f k8s/deployment.yaml
        - kubectl wait --for=condition=ready pod -l app=my-app --timeout=90s
        - kubectl port-forward service/my-app 8080:80 &
        - sleep 5
        - curl http://localhost:8080/health
        - minikube delete
  2. 运行CI/CD pipeline

    • 推送代码到GitLab仓库
    • 触发CI/CD pipeline
    • 查看测试结果

结果

  • 成功集成Minikube到CI/CD系统
  • 实现了自动化的应用测试
  • 确保了应用在Kubernetes环境中的兼容性

案例三:Kubernetes培训环境#

场景:为Kubernetes培训创建实践环境。

解决方案:使用Minikube创建培训环境。

实施步骤

  1. 准备培训环境

    # 安装Minikube
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    
    # 启动集群
    minikube start --memory=4096 --cpus=2
    
    # 启用必要的插件
    minikube addons enable dashboard
    minikube addons enable metrics-server
  2. 创建培训材料

    • Kubernetes基础概念
    • Pod、Service、Deployment等资源的使用
    • 网络和存储配置
    • 应用部署和管理
  3. 进行实践练习

    • 创建和管理Pod
    • 部署和扩展应用
    • 配置网络和存储
    • 使用Dashboard监控集群

结果

  • 成功创建了Kubernetes培训环境
  • 提供了实践机会,加深了学员对Kubernetes的理解
  • 为学员提供了一个安全的学习环境

总结#

Minikube是一种轻量级的Kubernetes发行版,通过本教程的学习,您已经掌握了从入门到大师级的Minikube使用技术。

主要技术回顾#

  • 基础操作:Minikube的基本安装和配置
  • 集群管理:创建和管理Minikube集群
  • 高级功能:网络配置、存储配置、插件使用
  • 企业级应用:CI/CD集成、多集群管理、Kubernetes测试

最佳实践#

  1. 版本管理:使用特定版本的Minikube和Kubernetes,确保环境一致性
  2. 资源配置:根据测试需求调整Minikube的内存和CPU配置
  3. 驱动选择:选择适合本地环境的虚拟机驱动
  4. 插件使用:启用必要的插件,如Dashboard、metrics-server等
  5. 本地集成:使用Minikube的Docker环境,加速镜像构建和部署
  6. 清理策略:测试完成后及时停止或删除集群,释放资源
  7. 文档化:为Minikube配置和使用流程创建文档,便于团队协作

注意事项#

  1. 资源限制:Minikube需要足够的内存和CPU资源,建议至少4GB内存
  2. 网络配置:注意Minikube的网络配置,确保与本地网络的兼容性
  3. 存储性能:本地存储的性能可能不如生产环境,测试时需考虑
  4. 版本兼容性:Minikube支持的Kubernetes版本可能有限,需注意兼容性
  5. 安全配置:Minikube集群主要用于测试,不建议用于生产环境
  6. 清理环境:测试完成后及时清理集群,避免资源泄漏
  7. 备份策略:对于重要的测试数据,制定适当的备份策略

通过合理学习和使用Minikube,您可以快速创建和管理本地Kubernetes集群,为开发、测试和学习Kubernetes提供可靠的环境。Minikube的轻量级特性使其成为Kubernetes开发和测试的理想工具,同时保留了Kubernetes的核心功能,为您的应用提供真实的运行环境。