Minikube入门

Posted by Kaka Blog on September 11, 2023

前言

kubernetes(k8s) 是容器编排技术的事实标准。也是云原生时代的操作系统。本章节从实战的角度来说明 k8s 的安装和使用。由于 k8s 本身是针对大规模服务器集群的,它本身的环境要求比较高,安装也比较复杂。所以市面上有很多集成 k8s 的发行版,比如: Rancher, OpenShift, EKS 这些适合配置高,大规模部署的发行版,也有一些像:k3s, MicroK8s, Minikube 等适合在本地开发环境、配置低、小规模和 arm 等设备上部署的分行版。

Minikube简介

minikube 是本地 Kubernetes,专注于让 Kubernetes 易于学习和开发。

Minikube安装

minikube官方地址:https://minikube.sigs.k8s.io/docs/start/

minikube的配置需求

  • 2 个或更多 CPU
  • 2GB 可用内存
  • 20GB 可用磁盘空间
  • 网络连接
  • 容器或虚拟机管理器,例如:Docker、QEMU、Hyperkit、Hyper-V、KVM、Parallels、Podman、VirtualBox 或 VMware Fusion/Workstation

Windows安装minikube

1、下载安装包:https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe,并进行安装即可。

2、启动集群

minikube start

3、打开仪表板

# 启动一个新的终端,并保持此命令运行。
minikube dashboard

4、验证是否安装成功

minikube version

# 显示版本信息
minikube version: v1.31.2
commit: fd7ecd9c4599bef9f04c0986c4a0187f98a4396e

部署示例应用到Minikube

Hello Node

接着让我们来开发一个最简单的 nodejs 程序,新建一个 hello 文件夹,然后在该文件夹下新建一个 server.js 的文件,并输入如下内容。

const http = require('http');
const os = require("os");

var handleRequest = (request, response) => {
  response.writeHead(200);
  response.end(
 `<h1>host: ${os.hostname()}</h1>` + 
 `<h1>os: ${os.type()} ${os.release()}</h1>`
  );
};
var www = http.createServer(handleRequest);
www.listen(8080);
console.log('listen on port: 8080');

运行:

node server.js

测试:

在浏览器输入http://localhost:8080

生成镜像

生成容器镜像我们使用 Dockerfile,在上面 hello 目录下创建一个 Dockerfile 文件,内容如下。

FROM node:alpine

EXPOSE 8080
COPY server.js .
CMD node server.js

生成镜像:

docker build -t registry.cn-shenzhen.aliyuncs.com/fangweijun/hello-node:1.0 .

测试镜像:

# 运行应用
docker run -d -p 8080:8080 --name hello-node registry.cn-shenzhen.aliyuncs.com/fangweijun/hello-node:1.0

推送镜像

为了在Minikube拉取镜像时不需要账号密码,将该镜像设置为公开。

推送镜像:

docker push registry.cn-shenzhen.aliyuncs.com/fangweijun/hello-node:1.0

创建 Deployment

Kubernetes Pod 是由一个或多个为了管理和联网而绑定在一起的容器构成的组。

在之前创建的 hello 文件夹下新建一个 deploy 文件夹用于保存所有描述文件。分别创建deployment.yml 和 service.yml 两个文件,内容如下。

deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-node
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-node
  template:
    metadata:
      labels:
        app: hello-node
    spec:
      containers:
      - name: hello-node
        image: registry.cn-shenzhen.aliyuncs.com/fangweijun/hello-node:1.0
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080

开始部署:

# 部署
kubectl apply -f deployment.yml

# 查看 Deployment
kubectl get deployments

# 输出结果类似于这样:
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1mc

# 查看pod
kubectl get pods

# 输出结果类似于这样:
NAME                          READY     STATUS    RESTARTS   AGE
hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m

创建 Service

默认情况下,Pod 只能通过 Kubernetes 集群中的内部 IP 地址访问。 要使得 hello-node 容器可以从 Kubernetes 虚拟网络的外部访问,你必须将 Pod 暴露为 Kubernetes Service。

service.yml

kind: Service
apiVersion: v1
metadata:
  name: hello-node
spec:
  selector:
    app: hello-node
  type: NodePort
  ports:
  - name:  http
    port:  8088
    targetPort:  8080
kubectl apply -f service.yml

查看你创建的 Service:

kubectl get services

运行下面的命令:

minikube service hello-node

这将打开一个浏览器窗口,为你的应用程序提供服务并显示应用的响应。

或者,使用 kubectl 转发端口:

kubectl port-forward service/hello-node 7080:8088

您的应用程序现已在 http://localhost:7080/ 上提供。

伸缩

当前部署只运行了一个 pod,如果需要我们可以伸缩应用,开启多个应用并自动进行负载均衡。在 server 节点中,修改 deployment.yml 文件的 replicas: 2 。然后执行命令。

kubectl apply -f deployment.yml

可以看到现在多个了一个 pod,不过多次访问http://localhost:7080/, 发现负载均衡没有作用。

Ingress服务发布

K8s 还提供了另一种基于 Ingress 的服务发布式,通过配置 Ingress 和外部实现的 Ingress Controller 可以方便的实现服务发布的功能。

启用入口插件:

minikube addons enable ingress

minikube 安装ingress插件(minikube addons enable ingress)的方法很简单,但在国内想安装成功并不简单,基本上拉不下镜像。

指定自定义镜像:

minikube addons enable ingress --images="KubeWebhookCertgenCreate=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1,KubeWebhookCertgenPatch=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1,IngressController=google_containers/nginx-ingress-controller:v1.2.1" --registries="IngressController=registry.cn-hangzhou.aliyuncs.com"

在 deploy 文件夹下新建 ingress.yml 配置规则。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-node
  labels:
    name: hello-node
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-node
            port: 
              number: 8088

执行命令:

kubectl apply -f ingress.yml

查看ingress:

kubectl get ingress

要使 Ingress 正常工作,您需要打开一个新的终端窗口并运行 minikube 隧道,运行命令:

minikube tunnel

测试:浏览器打开:http://localhost

参考资料