nginx-php k8s 配置方式
配置方式一 POD emptyDir:
vim nginx-php-emptyDir-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx-php spec: containers: - name: my-nginx image: nginx:1.15.11 ports: - containerPort: 80 hostPort: 8080 volumeMounts: - name: app-www mountPath: /usr/share/nginx/html - name: my-php image: php:7.3-fpm ports: - containerPort: 9000 volumeMounts: - name: app-www mountPath: /var/www/html volumes: - name: app-www emptyDir: {}
在pod所在的节点创建测试的PHP文件和Nginx配置文件
# 创建data文件夹 mkdir data vi index.php # index.php内容如下 echo "this is php"; vi index.html # 内容如下
# 创建默认的default.conf文件
vi default.conf
# 内容如下 注意我们这里fastcgi_pass用了localhost
server { listen 80 default; index index.php index.html index.htm; server_name localhost; root /usr/share/nginx/html; location ~ \.php { include fastcgi_params; fastcgi_pass localhost:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; } }
注意:上述fastcgi_pass的值是 localhost:9000
把测试的文件拷贝到容器中
# 查看nginx容器的名字 docker ps docker cp ./index.php [nginx容器的名称]:/usr/share/nginx/html docker cp ./default.conf [nginx容器的名称]:/etc/nginx/conf.d
docker restart [nginx容器的名称]
验证:
# 外部访问php文件 curl nginxIP:8080/index.php # 分别在nginx 和 php 中执行 curl -i http://127.0.0.1 # 访问成功,证明一个pod中的所有容器网络是共享的,可以用localhost访问到 # 查看php容器中的/var/www/html是否有我们刚上传的index.php文件 docker exec -it 你的php容器的名字 /bin/bash # 进入容器后执行 cd /var/www/html ls # 我们发现了我们刚上传到此目录的index.php文件, # 所以nginx的/usr/share/nginx/html
目录和PHP的/var/www/html目录通过volume:emptyDir已经完成了共享
配置方式二 POD hostPath: 重启所有 pod的方式之一:
kubectl replace --force -f nginx-php-hostPath-pod.yaml
vim nginx-php-hostPath-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx-php spec: containers: - name: my-nginx image: nginx:1.15.11 ports: - containerPort: 80 hostPort: 8080 volumeMounts: - name: app-www mountPath: /usr/share/nginx/html - name: app-conf mountPath: /etc/nginx/conf.d - name: my-php image: php:7.3-fpm ports: - containerPort: 9000 volumeMounts: - name: app-www mountPath: /var/www/html volumes: - name: app-www hostPath: path: /root/nginx-php/www-data - name: app-conf hostPath: path: /root/nginx-php/conf
需要在指定机器上指定配置文件:
需将配置文件放到指定的目录: 类似docker-compose
/root/nginx-php/www-data
/root/nginx-php/conf
使用 kubectl get pod -o wide 查看状态:
如果出现 ContainerCreating 可以使用以下命令查看详情
kubectl describe pod nginx-php
[192.168.1.104] root ➜ ~/nginx-php nginx-php kubectl describe pod nginx-php Name: nginx-php Namespace: default Node: worker2/192.168.1.106 Start Time: Sun, 30 Jan 2022 14:55:54 +0800 Labels: <none> Status: Pending IP: Controllers: <none> Containers: my-nginx: Container ID: Image: nginx:1.15.11 Image ID: Port: 80/TCP State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Volume Mounts: /etc/nginx/conf.d from app-conf (rw) /usr/share/nginx/html from app-www (rw) Environment Variables: <none> my-php: Container ID: Image: php:8.1-fpm Image ID: Port: 9000/TCP State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Volume Mounts: /var/www/html from app-www (rw) Environment Variables: <none> Conditions: Type Status Initialized True Ready False PodScheduled True Volumes: app-www: Type: HostPath (bare host directory volume) Path: /root/nginx-php/www-data app-conf: Type: HostPath (bare host directory volume) Path: /root/nginx-php/conf QoS Class: BestEffort Tolerations: <none> Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 5m 5m 1 {default-scheduler } Normal Scheduled Successfully assigned nginx-php to worker2 5m 5m 2 {kubelet worker2} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy. 5m 5m 1 {kubelet worker2} spec.containers{my-nginx} Normal Pulled Container image "nginx:1.15.11" already present on machine 5m 5m 1 {kubelet worker2} spec.containers{my-nginx} Normal Created Created container with docker id 745f8ed540d9; Security:[seccomp=unconfined] 5m 5m 1 {kubelet worker2} spec.containers{my-nginx} Normal Started Started container with docker id 745f8ed540d9 5m 5m 1 {kubelet worker2} spec.containers{my-php} Normal Pulling pulling image "php:8.1-fpm"
这里的原因是: pulling image "php:8.1-fpm"
5m 5m 1 {kubelet worker2} spec.containers{my-php} Normal Pulling pulling image "php:8.1-fpm"
配置方式三 service + deployment:deployment yaml:
apiVersion: extensions/v1beta1 kind: Deployment #指定资源类型 metadata: name: nginx-deployment labels: app: nginx-deployment spec: replicas: 2 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - name: my-nginx image: nginx:alpine #定义镜像,这个地方指定版本alpine ports: - containerPort: 80 volumeMounts: - name: app-www mountPath: /usr/share/nginx/html - name: app-conf mountPath: /etc/nginx/conf.d - name: my-php image: php:7.3.33-fpm ports: - containerPort: 9000 volumeMounts: - name: app-www mountPath: /var/www/html volumes: - name: app-www hostPath: path: /root/nginx-php/www-data - name: app-conf hostPath: path: /root/nginx-php/conf
service.yaml
apiVersion: v1 kind: Service metadata: name: my-service labels: app: my-service spec: selector: app: nginx-deployment ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30088 #节点端口,外部通过节点ip加端口可访问 type: NodePort
nginx 和 php 的配置文件参考 配置方式二
使用命令查看所有状态:
kubectl get all
or
kubectl get all -o wide