[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上复现这次创建的内容。