在 Kubernetes 集群上部署一个简单的 Laravel 网络应用

2024-04-26 渥太华微生活

168359acffec5180~tplv-t2oaga2asx-jj-mark_3024_0_0_0_q75.png

在 Kubernetes 集群上部署一个简单的 Laravel 网络应用。


一、下载 Laravel 源代码:

cd laravel-kubernetes-demo
git clone https://github.com/laravel/laravel.git .

二、通过 Dockerfile 构建应用镜像:

1、在根目录中创建mysql.conf配置文件:

<VirtualHost *:80>
  DocumentRoot /var/www/html/public

  <Directory "/var/www/html/public">
    AllowOverride all
    Require all granted
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2、在根目录中创建Dockerfile文件:

# install all the application's dependencies
FROM composer:2.7.4 as build
WORKDIR /var/www/html
COPY . .
COPY .env.example .env
RUN composer install && php artisan migrate --force && php artisan key:generate

# prepare the webserver with PHP-mod
FROM php:8.2.18-apache
EXPOSE 80
COPY --from=build /var/www/html /var/www/html
COPY mysql.conf /etc/apache2/sites-available/000-default.conf
RUN chown -R www-data:www-data /var/www/html && a2enmod rewrite

3、构建应用镜像:

docker build -t mydockerid/laravel-kubernetes-demo .

4、运行容器测试镜像:

docker run -it \
  -p 8080:80 \
  -e APP_KEY=base64:cUPmwHx4LXa4Z25HhzFiWCf7TlQmSqnt98pnuiHmzgY= \
  laravel-kubernetes-demo

访问 http://localhost:8080 检查应用是否成功。


三、上传 docker 镜像到 docker hub 仓库

docker login
docker push mydockerid/laravel-kubernetes-demo

四、创建部署

1) 编写一个部署 YAML 文件 deployment.yaml。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: mydockerid/laravel-kubernetes-demo
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80

2) 使用以下命令创建部署。

kubectl create -f deployment.yaml

3) 检查部署和pod是否创建成功。

kubectl get deployment
kubectl get pods

五、创建服务

在集群中运行的 Pod 有一个动态的 IP。如果你使用该 IP 并直接把流量路由到那里,在每次重启 Pod 的时候,你可能每次都要更新路由表。事实上,在每次部署或者容器重启的时候,一个新的 IP 会关联到这个 Pod 中。

为了避免需要手动的管理 IP 地址,你需要使用服务。服务在 Pods 集合中充当负载均衡器的角色。所以,尽管一个 Pod 的 IP 地址改变了,但是服务总是指向该 Pod。同时,由于服务总是拥有一个固定的 IP,因此你不需要手动更新任何东西。

168359ad0021cec6~tplv-t2oaga2asx-jj-mark_3024_0_0_0_q75.png

1) 编写一个服务 YAML 文件 service.yaml。

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 80

2) 使用以下命令创建服务。

kubectl create -f service.yaml

3) 检查服务是否创建成功。

kubectl get svc

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
myservice        ClusterIP   10.108.173.67   <none>        80/TCP         10s

六、创建 Ingress

为了在 Kubernetes 中使用 URL,你需要一个 Ingress。Ingress 是一组允许入站连接到达 Kubernetes 集群的规则。

Ingress 是非常必要的,因为在 Kubernetes 中,诸如 Pod 之类的资源仅具有可在集群内和集群内路由的IP地址。也就是说它们是无法进出外部环境的。

168359ad016d388d~tplv-t2oaga2asx-jj-mark_3024_0_0_0_q75.png

1) 创建 Ingress-nginx 控制器

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml

检查状态:

kubectl -n ingress-nginx get pod

NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-6f9w5        0/1     Completed   0          2m20s
ingress-nginx-admission-patch-vsk2j         0/1     Completed   1          2m20s
ingress-nginx-controller-5f4d7b5f5c-6pnx5   1/1     Running     0          2m20s

2) 编写一个服务 YAML 文件 ingress.yaml。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  labels:
    name: myingress
spec:
  rules:
  - host: laravel-kubernetes.demo
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: myservice
            port:
              number: 80

3) 使用以下命令创建服务。

kubectl create -f ingress.yaml

4) 检查服务是否创建成功。

kubectl get ingress

NAME        CLASS    HOSTS                     ADDRESS   PORTS   AGE
myingress   <none>   laravel-kubernetes.demo             80      15s



七、访问网页

现在您可以访问:

http://<节点IP地址>:31871

如果是本地服务器,可以访问:

localhost:31871

下面是访问页面。



二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

164
全部评论 (0)
展开快速发表评论

科技专栏