[k8s] 我在minikube上搭建了Next.js + nginx服务器的经历

首先

这篇文章是“创建家庭Kubernetes环境”系列的一部分。上一篇文章我们介绍了如何在多节点集群上部署pod。

 

我计划在本次中使用手边的minikube来搭建Next.js + Nginx服务器。

我已经在Github上发布了完整的项目,供参考使用。链接地址为:https://github.com/piny940/infra/tree/main/kubernetes/portfolio。

环境

    • Ubuntu22.04

 

    • minikube 1.32.0

 

    • Docker 24.0.7

 

    Kubernetes v1.28.3

前提条件 tí

    • 動くDockerfileが用意できている

 

    dockerhubのアカウントを持っている

将Docker镜像推送至仓库

首先,在Docker Hub上创建一个仓库。(稍后会使用该仓库名称)

下一步是使用docker build创建docker镜像。

$ docker build .

我们将确认已创建图像的ID。

$ docker images

给标签加上标签名,在版本控制中使用yyyyMMddHHmmss的格式。

$ docker tag {imageID} {アカウント名}/{レポジトリ名}:{タグ名}

推一下。

$ docker push {アカウント名}/{レポジトリ名}:{タグ名}

启动minikube

minikube start --driver=docker

司机决定使用Docker。虽然忘记了默认的QEMU是什么,但它无法适应某些功能,所以无法使用。

创建deployment.yaml文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {アプリ名}
  labels:
    app: {アプリ名}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {アプリ名}
  template:
    metadata:
      labels:
        app: {アプリ名}
    spec:
      containers:
        - name: app
          image: {イメージ名}
          ports:
            - containerPort: {サーバーのポート番号}

在中国,图像名称应以{dockerhub帐户名}/{仓库名称}:{标签名}的形式编写。

如果执行kubectl apply -f deployment.yaml命令,将创建deployment和pod。

$ kubectl get deployment
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
{アプリ名}   1/1     1            1           45h

创建service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {アプリ名}
spec:
  selector:
    app: {アプリ名}
  ports:
    - name: http
      protocol: TCP
      port: {サーバーのポート番号}
      targetPort: {サーバーのポート番号}
  type: ClusterIP

type参数用于指定ClusterIP。关于service的type,这篇文章讲得很清楚:https://www.ios-net.co.jp/blog/20230621-1179/。

确认已经正常创建。

$ kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes          ClusterIP   10.96.0.1      <none>        443/TCP          5d21h
{アプリ名}   ClusterIP   10.97.105.94   <none>        4400/TCP         45h

创建 ingress-nginx.yaml 文件。

如果想在kubernetes上创建一个nginx容器并将其代理到service,可以使用ingress-nginx非常方便。

一般来说,按照教程的步骤,您可以轻松地进行设置。

首先,我们要确保在minikube中可以使用ingress。

$ minikube addons enable ingress

接下来创建 ingress-nginx.yaml 文件,并按照以下方式进行描述。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {アプリ名}
spec:
  ingressClassName: nginx
  rules:
    - host: hello-world.info
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {アプリ名}
                port:
                  number: {サーバーのポート番号}

应该是通过运行 `kubectl apply -f ingress-nginx.yaml` 来启动 Ingress。

$ kubectl get ingress
NAME        CLASS   HOSTS              ADDRESS        PORTS   AGE
{アプリ名}   nginx   hello-world.info   192.168.49.2   80      69s

虽然我本来想说“通过这样就可以访问了”,但是似乎将驱动程序更改为Docker并启动Minikube后,无法正常运行。
因此,作为替代方案,我将使用以下命令。

$ minikube service ingress-nginx-controller --url -n ingress-nginx
http://127.0.0.1:44897
http://127.0.0.1:43161
❗  Docker ドライバーを linux 上で使用しているため、実行するにはターミナルを開く必要があります。

当您访问此显示的地址时,应该会返回 Nginx 的 404 错误。

要访问下一个应用程序,请按照以下方式指定主机名。

$ curl {表示されたIPアドレス} -H 'Host: hello-world.info'

创建kustomization.yaml

前一章节中我们搭建了Next + nginx服务器,但是由于存在多个清单文件,管理工作变得非常困难。因此,我们决定引入kustomize来解决这个问题。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: default
resources:
  - deployment.yaml
  - service.yaml
  - ingress-nginx.yaml

只需要运行kubectl apply -k .命令,即使环境变了,也可以完成对清单文件的应用。

最后

这次我们通过nginx在minikube上使Next服务器可访问。下一步,我们计划在VPS上复现这次创建的内容。

广告
将在 10 秒后关闭
bannerAds