什么是MiniKube?

Minikube是一个用于在本地环境中运行单节点Kubernetes集群的工具。它提供了一种简单方便的方式来体验和学习Kubernetes,同时也可用于本地开发和测试。

使用Minikube,你可以快速搭建一个本地的Kubernetes环境,以便学习和开发Kubernetes应用程序,而无需依赖真实的云平台或远程集群。

简单来说,就是一个可以在有限的环境中用于模拟实现k8s集群的工具,可以帮助我们快速搭建k8s学习环境。

下载&安装

⚠️前置条件:已经安装过Docker或者其他容器化软件,本文以Docker为容器化工具。

PS:硬件条件

  • 最小2 CPUs
  • 最小2GB可用内存
  • 最小20GB可用磁盘空间
  • internet 网络连接

首先从MiniKube官网手册(下载需要魔法或者找镜像加速)找到自己设备类型的MinuKube安装包Kubectl安装包,例如我是Linux arm64,就下载了如下文件

image-20231116222040678

下载好之后执行

$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参数强制启动即可。

image-20231116223638987

看到上面的提示即代表minikube启动成功。

部署应用并配置服务

安装成功之后简单的部署一个应用测试下,以Nginx为例进行部署。

image-20231116224740460

等待镜像拉取完成之后pod就会running,此时的pod是无法被访问的,我们需要为其配置一个服务,这里创建一个NodePort类型的Service,通过master IP+分配的端口30749即可访问应用(这里的master IP并不是主机IP,而是MiniKube的IP)

image-20231116224915949

MiniKube IP可以通过命令查看

$minikube ip
192.168.58.2

另外,可以使用命令minikube service nginx查看服务的访问地址

image-20231116224400148

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的默认页面。

image-20231117215811527

但是很挫的一点是需要命令行进程一直运行,即便是后台运行也很不得劲,这种方式只有在临时需要暴露应用给外部访问时稍微方便一点。

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)

image-20231117224918067

也需要每次手动开启,也不是很方便,看第三种吧。

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处理。


前端小白