前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从0开始在K8S上创建PHP Web应用

从0开始在K8S上创建PHP Web应用

作者头像
overtrue
发布2018-08-20 16:22:47
4.3K0
发布2018-08-20 16:22:47
举报

前言

从如何创建一个 PHPWeb应用入手,带大家进入 Kubernetes的世界。

基础

环境

  • CentOS 7.5 (Kernel 3.10)
  • Minikube (Kubernetes 1.10.0)

对你的要求

假设你已经掌握了下面的基础技能:

  • Docker && 会写Dockerfile
  • 如何Google
  • 拥有一个DockerHub账号
  • 手动编译过LNMP或者LAMP

构建基础镜像

上图描述了我们需要创建的 Containers,其中 PauseContainerKubernetes自带的所以我们不用关心,但是十分重要,未来将会有一篇文章来描述 PauseContainer到底干什么的。 其实基础镜像一般用官方现成的就行了,但是在学习过程中建议还是手动编译一下,了解下官方默认配置有哪些坑。 Dockerfile代码我会放到 GitHub上, 因为在这里展示实在是太长了。

创建Nginx镜像

Nginx:

https://github.com/motecshine/nginx1.12-for-k8s

编译Nginx镜像

代码语言:javascript
复制
docker build . -t motecshine/nginx1.12-for-k8s:v0.1.0
    docker push motecshine/nginx1.12-for-k8s:v0.1.0

创建PHP-FPM镜像

FPM:

https://github.com/motecshine/php71-for-k8s

编译FPM镜像

代码语言:javascript
复制
docker build . -t motecshine/php71-for-k8s:v0.1.0
    docker push motecshine/php71-for-k8s:v0.1.0

注意事项: Dockerfile CMD 需要关闭 NginxFPMdaemon特性,具体看我REPO的 Dockerfile, 这样是为了保证 Container生命周期与 POD生命周期一致。

构建业务镜像

我们将基于上述镜像来创建我们的业务镜像.

创建Code镜像

我们基于 Laravel来创建镜像。

Code:

https://github.com/motecshine/code-for-k8s

编译Code镜像

代码语言:javascript
复制
docker build . -t motecshine/code-for-k8s:v0.1.1
    docker push motecshine/code-for-k8s:v0.1.1

创建Nginx镜像

laravel-nginx-for-k8s:

https://github.com/motecshine/laravel-nginx-for-k8s

编译Nginx镜像

代码语言:javascript
复制
docker build . -t  motecshine/laravel-nginx-for-k8s:v0.1.1
    docker push  motecshine/laravel-nginx-for-k8s:v0.1.1

创建PHP-FPM镜像

laravel-fpm-for-k8s:

https://github.com/motecshine/laravel-fpm-for-k8s

编译FPM镜像

代码语言:javascript
复制
docker build . -t  motecshine/laravel-fpm-for-k8s:v0.1.0
    docker push  motecshine/laravel-fpm-for-k8s:v0.1.0

构建Kubernetes应用

整体架构如上图所示

构建最小化运行单元(Pod)

创建Deployment

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: laravel
  namespace: default
spec:
  replicas: 1 # 期待副本数量
  template:
    metadata:
      labels:
        app: laravel # app label
        version: testing
    spec:
      containers:
      - name: code
        image: motecshine/code-for-k8s:v0.1.1
        volumeMounts: # 挂载目录
        - mountPath: /data2
          name: code
      - name: fpm
        image: motecshine/laravel-fpm-for-k8s:v0.1.0
        imagePullPolicy: IfNotPresent
        resources: # 资源限制
           limits:
             cpu: 350m
             memory: 350Mi
           requests:
             cpu: 50m
             memory: 50Mi
        ports:
        - name: fpm
          containerPort: 9000
        volumeMounts:
        - mountPath: /data/code # 挂载code
          name: code
        - mountPath: /var/log # 挂载日志
          name: log  
      - name: laravel-nginx
        image: motecshine/laravel-nginx-for-k8s:v0.1.0
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 350m
            memory: 350Mi
          requests:
            cpu: 50m
            memory: 50Mi
        ports:
        - name: laravel-nginx
          containerPort: 80 # 暴露Endpoint
        volumeMounts:
        - mountPath: /data/code
          name: code
        - mountPath: /var/log
          name: log  
      volumes:
      - name: code
        emptyDir: {}
      - name: log
        hostPath:
          path: /var/log
          type: Directory

构建Service

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: laravel-service
  namespace: default
  labels:
    app: laravel-service
    version: testing-service
spec:
  type: ClusterIP
  selector:
    app: laravel
    version: testing
  ports:
    - name: http
      port: 80

构建Ingress

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: laravel-ingress
  namespace: default
  labels:
    app: laravel-ingress
spec:
  rules:
  - host: laravel.test
    http:
      paths:
      - path: /
        backend:
          serviceName: laravel-service
          servicePort: 80

安装Minikube

代码语言:javascript
复制
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube

安装Traefik

我们使用开源的 Ingress组件安装参考这里

https://docs.traefik.io/configuration/backends/kubernetes/

启动Web应用

上面的配置文件在这里

代码语言:javascript
复制
git clone git@github.com:motecshine/laravel-k8s-config.git
cd laravel-k8s-config && kubectl create -f .

效果

结语

简单的介绍了如何创建一个Web应用,这仅仅是个开始, Kubernetes背后是一个庞大的生态环境, CI,CD,ELK(EFK),APM,让我们一点点揭开它神秘的面纱。

这里挂载日志到 HostPath 会有并发写入的问题, 下一篇将 Kubenetes基于 EFK日志收集平台,并且给出这个问题的解决方案。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 假装我会写代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 基础
      • 环境
      • 对你的要求
  • 构建基础镜像
    • 创建Nginx镜像
      • 编译Nginx镜像
    • 创建PHP-FPM镜像
    • 构建业务镜像
      • 创建Code镜像
        • 编译Code镜像
      • 创建Nginx镜像
        • 编译Nginx镜像
      • 创建PHP-FPM镜像
        • 编译FPM镜像
    • 构建Kubernetes应用
      • 构建最小化运行单元(Pod)
        • 创建Deployment
      • 构建Service
        • 构建Ingress
          • 安装Minikube
            • 安装Traefik
              • 启动Web应用
                • 效果
            • 结语
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档