1. 程式人生 > >在k8s上部署第一個php應用

在k8s上部署第一個php應用

dsn index web 簡單 serve html def cati 服務

一.搭建nginx+php

1.站點配置文件

1.1創建nginx-configmap.yaml

[root@master 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

[root@master 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

[root@master 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

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

[root@master]#kubectl create -f mysql-service.yaml

  

2.創建同名的endpoint,這樣子service可以使用endpoint

[root@master]# 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

[root@master]#kubectl create -f mysql-endpoint.yaml

  

三.應用程序文件

1.一個簡單的php程序文件:

[root@master]#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應用