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 | $ sysctl -a | grep -E --color 'machdep.cpu.features|VMX' |
显示VMX说明系统支持,其他操作系统查看官方文档。
- 安装 kubectl
1 | brew install kubectl |
- 安装 Minikube
1 | brew install minikube |
配置minkube
minkube支持多种Dirver
- Docker - VM + Container (preferred)
- Hyperkit - VM
- VirtualBox - VM
- Parallels - VM
- VMware - VM
我的配置
1 | minikube config set driver docker |
使用minkube安装k8s
1 | minikube start --extra-config=apiserver.service-node-port-range=30000-39999 |
配置插件
1 | minikube addons configure metallb |
安装Istio
1 | curl -sL https://istio.io/downloadIstioctl | sh - |
检查minkube状态
1 | $ minikube status |
部署服务
以配置postgres数据库为例来演示,并使用yaml文件,你也可以选择自己喜欢的工具如helm3。
创建namespace
1
2
3
4
5
6apiVersion: v1
kind: Namespace
metadata:
name: postgres
labels:
name: postgres运行
k apply -f 00-namespace.yaml
为数据库创建pv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
namespace: postgres
labels:
type: local
spec:
storageClassName: local-postgres-storage
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
hostPath:
path: postgres运行
k apply -f 02-pv.yaml
- 为数据库创建pvc运行
1
2
3
4
5
6
7
8
9
10
11
12
13apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc-postgres-0
namespace: postgres
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: local-postgres-storagek apply -f 03-pvc.yaml
为数据库创建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
43apiVersion: 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
为数据库创建Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16apiVersion: 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。后面说明理由。查看数据库运行状况
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是我个人最喜欢的功能之一。