什么是MiniKube?
Minikube是一个用于在本地环境中运行单节点Kubernetes集群的工具。它提供了一种简单方便的方式来体验和学习Kubernetes,同时也可用于本地开发和测试。
使用Minikube,你可以快速搭建一个本地的Kubernetes环境,以便学习和开发Kubernetes应用程序,而无需依赖真实的云平台或远程集群。
简单来说,就是一个可以在有限的环境中用于模拟实现k8s集群的工具,可以帮助我们快速搭建k8s学习环境。
下载&安装
⚠️前置条件:已经安装过Docker或者其他容器化软件,本文以Docker为容器化工具。
PS:硬件条件
- 最小2 CPUs
- 最小2GB可用内存
- 最小20GB可用磁盘空间
- internet 网络连接
首先从MiniKube官网手册(下载需要魔法或者找镜像加速)找到自己设备类型的MinuKube安装包和Kubectl安装包,例如我是Linux arm64,就下载了如下文件
下载好之后执行
$sudo install minikube-linux-arm64
$sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
安装完之后启动minikube
$minikube start
(可能会很慢,忍一下,或者改下docker镜像仓库,另外每次重启机器之后都需要重新执行minikube start
命令来启动minikube)
如果当前是root用户,会有风险警告,如果是在本地搭建学习环境,可以不care,直接在start命令后加
--force
参数强制启动即可。
看到上面的提示即代表minikube启动成功。
部署应用并配置服务
安装成功之后简单的部署一个应用测试下,以Nginx为例进行部署。
等待镜像拉取完成之后pod就会running,此时的pod是无法被访问的,我们需要为其配置一个服务,这里创建一个NodePort类型的Service,通过master IP+分配的端口30749即可访问应用(这里的master IP并不是主机IP,而是MiniKube的IP)
MiniKube IP可以通过命令查看
$minikube ip 192.168.58.2
另外,可以使用命令minikube service nginx
查看服务的访问地址
K8s相关的知识这里不多赘述,本文主要记录MiniKube的安装配置过程。
访问MiniKube
除了使用NodePort暴露服务,还有三种常用的方法访问MiniKube的应用。
port-forward
第一种方法,可以使用以下命令进行端口转发
➜ ~ kubectl port-forward --address 0.0.0.0 pod/nginx-7854ff8877-6txdk 1122:80
Forwarding from 0.0.0.0:1122 -> 80
上面命令行使用了pod,使用 service/nginx 也可以达到同样效果。
看到有转发提示就表示已经转发成功了,在局域网另一台设备访问可以获取到Nginx的默认页面。
但是很挫的一点是需要命令行进程一直运行,即便是后台运行也很不得劲,这种方式只有在临时需要暴露应用给外部访问时稍微方便一点。
tunnel
我们来试下第二种方式—— LoadBalancer
重新创建一个svc
$kubectl expose deployment nginx --port=8080 --target-port=80 --type=LoadBalancer
–port是对外暴露的端口;
–target-port是与容器内绑定的端口。
通过以下命令开启tunnel
$minikube tunnel
此时查看svc时可以看到EXTERNAL-IP已经有数据了(为开启tunnel之前值为pending)
也需要每次手动开启,也不是很方便,看第三种吧。
Ingress
Ingress 是一个规则的集合,它允许集群外的流量通过一定的规则到达集群内的 Service 。
通过MiniKube的插件功能可以快速开启Ingress(需要科学上网),使用以下命令开启
➜ ~ minikube addons enable ingress
💡 ingress 是由 Kubernetes 维护的插件。如有任何问题,请在 GitHub 上联系 minikube。
您可以在以下链接查看 minikube 的维护者列表:https://github.com/kubernetes/minikube/blob/master/OWNERS
▪ 正在使用镜像 registry.k8s.io/ingress-nginx/controller:v1.9.4
▪ 正在使用镜像 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
▪ 正在使用镜像 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
🔎 正在验证 ingress 插件...
🌟 启动 'ingress' 插件
➜ ~
过程中如果出现问题,大部分是因为那堵看不见的墙导致镜像拉取超时。
开启Ingress会自动创建一个命名空间——ingress-nginx,可以看到创建的Pod有以下三个
➜ ~ kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-bxc8s 0/1 Completed 0 6h4m
ingress-nginx-admission-patch-lq5tn 0/1 Completed 1 6h4m
ingress-nginx-controller-7c6974c4d8-6nl22 1/1 Running 0 6h4m
然后可以使用官方提供的测试demo来创建一组测试用例
➜ ~ kubectl apply -f https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml
pod/foo-app created
service/foo-service created
pod/bar-app created
service/bar-service created
ingress.networking.k8s.io/example-ingress created
可以看下这个yaml长啥样
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- name: foo-app
image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
- port: 8080
---
kind: Pod
apiVersion: v1
metadata:
name: bar-app
labels:
app: bar
spec:
containers:
- name: bar-app
image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
name: bar-service
spec:
selector:
app: bar
ports:
- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /foo
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar
backend:
service:
name: bar-service
port:
number: 8080
---
可以看出是创建了两个Pod、两个Service并且配置了Ingress转发规则。
可以使用命令查看集群中的Ingress,address即为NodeIP
➜ ~ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress nginx * 192.168.49.2 80 18m
最后进行访问测试
➜ ~ curl http://192.168.49.2/foo
Request served by foo-app
HTTP/1.1 GET /foo
Host: 192.168.49.2
Accept: */*
User-Agent: curl/7.81.0
X-Forwarded-For: 192.168.49.1
X-Forwarded-Host: 192.168.49.2
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Real-Ip: 192.168.49.1
X-Request-Id: 223b96104185f76b8d6dce54d9b4ddd0
X-Scheme: http
➜ ~
➜ ~ curl http://192.168.49.2/bar
Request served by bar-app
HTTP/1.1 GET /bar
Host: 192.168.49.2
Accept: */*
User-Agent: curl/7.81.0
X-Forwarded-For: 192.168.49.1
X-Forwarded-Host: 192.168.49.2
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Scheme: http
X-Real-Ip: 192.168.49.1
X-Request-Id: e986d02b69bc42697a534f846fd15c24
X-Scheme: http
可以看到对应路径的请求已经转发到了对应的Pod处理。