在k8s上部署第一个php应用

Posted 罗夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在k8s上部署第一个php应用相关的知识,希望对你有一定的参考价值。

一.搭建nginx+php

1.站点配置文件

1.1创建nginx-configmap.yaml

[[email protected] k8s]# cat nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
    name: nginx-config
data:
    default.conf: |
        server {
            listen       80;
            server_name  localhost;
            root   /usr/share/nginx/html;
            access_log  /var/log/nginx/host_access.log;
            error_log  /var/log/nginx/host_error.log debug;
            location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm index.php;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            root   /usr/share/nginx/html;
            }
            location ~ \.php$ {
            root   /usr/share/nginx/html;
            fastcgi_pass   10.254.235.214:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
            }
            }

  

ps:
10.254.235.214: 是下文中配置的php-service服务的集群ip

1.2 应用该配置文件

#kubectl create -f nginx-configmap.yaml

  

2.nginx

2.1创建nginx-deployment.yaml

[[email protected] k8s]# cat nginx-deployment.yaml
apiVersion: v1
kind: Service
metadata:
    name: nginx-service
spec:
    type: NodePort
    selector:
        app: nginx
    ports:
        - protocol: TCP
          port: 80
          targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
                - name: nginx
                  image: nginx:alpine
                  volumeMounts:
                      - name: nginx-config
                        mountPath: /etc/nginx/conf.d
                      - name: web-root
                        mountPath: /usr/share/nginx/html
            volumes:
                - name: nginx-config
                  configMap:
                      name: nginx-config
                - name: web-root
                  nfs:
                      server: 192.168.2.17
                      path: /data/nfs

  

ps:请提前搭建好nfs环境,nfs中的server为局域网ip

2.2 应用该配置文件

#kubectl create -f nginx-configmap.yaml

ps:
因为使用了NodePort类型,现在你可以在外部通过任意节点服务器ip+端口访问到nginx服务
你可以可以通过pod上的ip来访问到nginx服务

3.php

3.1 php-deployment.yaml

[[email protected] k8s]# cat php-deployment.yaml
apiVersion: v1
kind: Service
metadata:
    name: php-service
spec:
    clusterIP: 10.254.235.214
    selector:
        app: php
    ports:
        - name: php
          port: 9000
          targetPort: 9000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: php-deployment
spec:
    replicas: 1
    selector:
        matchLabels:
            app: php
    template:
        metadata:
            labels:
                app: php
        spec:
            containers:
                - name: php
                  image: php:7.2-fpm
                  volumeMounts:
                      - name: web-root
                        mountPath: /usr/share/nginx/html
            volumes:
                - name: web-root
                  nfs:
                      server: 192.168.2.17
                      path: /data/nfs

  

3.2 应用该配置文件

#kubectl create -f php-configmap.yaml

  

二.创建mysql服务

1.一般我们将数据库放在单独的物理服务器上或另一个集群上,我们创建一个mysql-service.yaml

[[email protected]]# cat mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: default
spec:
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

[[email protected]]#kubectl create -f mysql-service.yaml

  

2.创建同名的endpoint,这样子service可以使用endpoint

[[email protected]]# cat mysql-endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: mysql-service
  namespace: default
subsets:
- addresses:
  - ip: 192.168.2.10
  ports:
  - port: 3306
    protocol: TCP

[[email protected]]#kubectl create -f mysql-endpoint.yaml

  

三.应用程序文件

1.一个简单的php程序文件:

[[email protected]]#cat b.php
<?php
$dbms=‘mysql‘;
$host= getenv(‘MYSQL_SERVICE_SERVICE_HOST‘); // 获得环境变量,对应php-service;可以进入pod容器内使用env查看
$dbName=‘test‘;
$user=‘test‘; 
$pass=‘1983512gx‘;
$dsn="$dbms:host=$host;dbname=$dbName";


try {
    $dbh = new PDO($dsn, $user, $pass); 
    echo "连接成功<br/>";
    $dbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}

  

2.运行该文件,提示

Error!: could not find driver
这是因为用到了pdo,但php-fpm2镜像并没有这个扩展

 

3.安装php-pdo扩展(更好的办法是你应该制作一个运行php环境的容器)

kubectl exec -it php-deployment-3540934081-75sqv -- /usr/local/bin/docker-php-ext-install pdo_mysql

  

4.重启节点上对应的php 容器

docker restart 4cf7949cfc30

ps:
实际操作中在容器内无法连同service,重启了节点的docker才可以.

 

四.访问

在任意节点上或master上访问

#curl http://192.168.2.18:31746/b.php

应该输出连接成功

以上是关于在k8s上部署第一个php应用的主要内容,如果未能解决你的问题,请参考以下文章

导致资产预编译在heroku部署上失败的代码片段

k8s实战之手动部署PHP项目和Java项目

前端走进云原生,k8s部署助力项目上云

前端走进云原生,k8s部署助力项目上云

前端走进云原生,k8s部署助力项目上云

前端走进云原生,k8s部署助力项目上云