0%

使用minkube代替docker compose作为本地开发环境

Minikub K3s MicroK8s都是轻量化的K8s。Minikube更着重在本地轻松运行Kubernetes的工具,MicroK8s则不需要VirtualBox 并具有Isito. K3s是开源的一个Kubernetes的裁剪版。

本地开发Docker compose的问题

使用Docker Compose作为本地开发工具已经好几年,它管理着我每一个项目的依赖服务。但随着项目越来越多,依赖越来越错综复杂,每个项目有单独的docker-compose文件,开发一段时间后,对于管理多个docker compose文件也是个难题。我的解决方案是将公共服务使用一个独立的docker-compose来管理,再使用公用network。有时需要同时启动相同服务的不同版本,但端口是不能复用的。如果使用不同端口,修改依赖服务的配置也是个繁琐的工作。

使用minkube完美的解决了这个问题。

安装minkube

1.要检查操作系统是否支持虚拟化技术,请运行下面的命令(我的是macOS):

1
2
3
$ sysctl -a | grep -E --color 'machdep.cpu.features|VMX'

machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C

显示VMX说明系统支持,其他操作系统查看官方文档。

  1. 安装 kubectl
1
brew install kubectl 
  1. 安装 Minikube
1
brew install minikube

配置minkube

minkube支持多种Dirver

  • Docker - VM + Container (preferred)
  • Hyperkit - VM
  • VirtualBox - VM
  • Parallels - VM
  • VMware - VM

我的配置

1
2
3
minikube config set driver docker
minikube config set cpus 4
minikube config set memory 8192

使用minkube安装k8s

1
minikube start --extra-config=apiserver.service-node-port-range=30000-39999

配置插件

1
2
3
4
minikube addons configure metallb
minikube addons enable metallb
kubectl get pods -n metallb-system
kubectl describe configmap config -n metallb-system

安装Istio

1
2
3
4
curl -sL https://istio.io/downloadIstioctl | sh -
export PATH=$PATH:$HOME/.istioctl/bin
istioctl install --set profile=demo
minikube addons enable istio

检查minkube状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

$ minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| ambassador | minikube | disabled |
| dashboard | minikube | disabled |
| default-storageclass | minikube | enabled ✅ |
| efk | minikube | disabled |
| freshpod | minikube | disabled |
| gcp-auth | minikube | disabled |
| gvisor | minikube | disabled |
| helm-tiller | minikube | disabled |
| ingress | minikube | disabled |
| ingress-dns | minikube | disabled |
| istio | minikube | enabled ✅ |
| istio-provisioner | minikube | disabled |
| kubevirt | minikube | disabled |
| logviewer | minikube | disabled |
| metallb | minikube | enabled ✅ |
| metrics-server | minikube | disabled |
| nvidia-driver-installer | minikube | disabled |
| nvidia-gpu-device-plugin | minikube | disabled |
| olm | minikube | disabled |
| pod-security-policy | minikube | disabled |
| registry | minikube | disabled |
| registry-aliases | minikube | disabled |
| registry-creds | minikube | disabled |
| storage-provisioner | minikube | enabled ✅ |
| storage-provisioner-gluster | minikube | disabled |
|-----------------------------|----------|--------------|

部署服务

以配置postgres数据库为例来演示,并使用yaml文件,你也可以选择自己喜欢的工具如helm3。

  1. 创建namespace

    1
    2
    3
    4
    5
    6
    apiVersion: v1
    kind: Namespace
    metadata:
    name: postgres
    labels:
    name: postgres

    运行 k apply -f 00-namespace.yaml

  2. 为数据库创建pv

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: postgres-pv
    namespace: postgres
    labels:
    type: local
    spec:
    storageClassName: local-postgres-storage
    capacity:
    storage: 1Gi
    # volumeMode field requires BlockVolume Alpha feature gate to be enabled.
    volumeMode: Filesystem
    accessModes:
    - ReadWriteOnce
    persistentVolumeReclaimPolicy: Delete
    hostPath:
    path: /data/postgres

    运行 k apply -f 02-pv.yaml

  1. 为数据库创建pvc
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: postgres-pvc-postgres-0
    namespace: postgres
    spec:
    accessModes:
    - ReadWriteOnce
    volumeMode: Filesystem
    resources:
    requests:
    storage: 1Gi
    storageClassName: local-postgres-storage
    运行 k apply -f 03-pvc.yaml
  1. 为数据库创建Pod

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: postgres
    namespace: postgres
    spec:
    selector:
    matchLabels:
    app: postgres # has to match .spec.template.metadata.labels
    serviceName: "postgres"
    replicas: 1 # by default is 1
    template:
    metadata:
    labels:
    app: postgres # has to match .spec.selector.matchLabels
    spec:
    terminationGracePeriodSeconds: 10
    containers:
    - name: postgres
    image: postgres:12.4-alpine
    env:
    - name: POSTGRES_USER
    value: "postgres"
    - name: POSTGRES_PASSWORD
    value: "password"
    - name: PGDATA
    value: "/var/lib/postgresql/data"
    ports:
    - containerPort: 5432
    name: tcp
    protocol: TCP
    volumeMounts:
    - name: postgres-pvc
    mountPath: /var/lib/postgresql/data
    volumeClaimTemplates:
    - metadata:
    name: postgres-pvc
    spec:
    accessModes: [ "ReadWriteOnce" ]
    storageClassName: "local-postgres-storage"
    resources:
    requests:
    storage: 1Gi

    运行 k apply -f 04-ss.yaml

  2. 为数据库创建Service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: v1
    kind: Service
    metadata:
    name: postgres
    namespace: postgres
    labels:
    svc: postgres
    spec:
    type: LoadBalancer
    ports:
    - port: 5432
    targetPort: 5432
    protocol: TCP
    name: tcp
    selector:
    app: postgres

    运行 k apply -f 05-service.yaml
    Note: 请注意Service的类型是LoadBalancer,不是nodeport。后面说明理由。

  3. 查看数据库运行状况

    1
    2
    3
    $ k get pods -n postgres
    NAME READY STATUS RESTARTS AGE
    postgres-0 1/1 Running 0 11d

    访问服务

    熟悉K8s的都知道使用port-forward 可以将Pod端口映射到本地端口。

    1
    k port-forward postgres-0 5432:5432 -n postgres

    这种方式没有问题,但需要映射端口的服务过多,一一使用forward命令也非常麻烦。这里我推荐使用第二种方式

    1
    minikube tunnel

    这是minkube提供的隧道功能。它将LoadBalancer端口映射到本地端口。这就是创建Service是为什么使用LoadBalancer的原因。tunnel是我个人最喜欢的功能之一。