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

前言

从如何创建一个 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镜像

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镜像

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镜像

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镜像

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镜像

docker build . -t  motecshine/laravel-fpm-for-k8s:v0.1.0
    docker push  motecshine/laravel-fpm-for-k8s:v0.1.0

构建Kubernetes应用

整体架构如上图所示

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

创建Deployment

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

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

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

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应用

上面的配置文件在这里

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日志收集平台,并且给出这个问题的解决方案。

原文发布于微信公众号 - 假装我会写代码(bugszoo)

原文发表时间:2018-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刺客博客

(转载)灰常有趣的Docker镜像

1.8K3
来自专栏乐沙弥的世界

再说 Oracle RAC services

        应用程序工作负载在Oracle 10g中可以被定为services,也称之为服务,能够在单实例中使用,也能够在RAC中单独使用和管理。因此整个数...

1204
来自专栏吴伟祥

大白话Docker入门(一) 原

随着docker现在越来越热门,自己也对docker的好奇心也越来越重,终于忍不住利用了一些时间把docker学习一遍。目前的资料不少,但是由于docker的发...

1072
来自专栏糊一笑

小白学Docker之Swarm

承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之...

43011
来自专栏运维

k8s1.5.3集群测试之部署PODS实例

http://jerrymin.blog.51cto.com/3002256/1898243

1202
来自专栏JadePeng的技术博客

gitbook安装与使用,并使用docker部署

本文简单介绍如何安装并使用gitbook,最后如何使用docker构建书籍镜像。 1. 前置条件 需要Nodejs环境,安装npm,国内用户再安装cnpm np...

51610
来自专栏数据和云

故障分析:RAC环境下ORA-12545连接错误

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 分享一则由于SCAN IP导致的连接故障 11gR2 RAC两节点的环...

2924
来自专栏Web 开发

VPS的疑问?

今天早上在火山弄了个免费的VPS体验版,搞了一个上午,才学会用SSH链接,推荐用WINSCP这个软件,支持中文,免费的。

5362
来自专栏问天丶天问

Kubernetes-Host网络模式应用

3985
来自专栏小狼的世界

Minikube体验

Minikube运行要求安装有VirtualBox或VMWare Fusion,我用的是VirtualBox。

2853

扫码关注云+社区