从如何创建一个 PHPWeb
应用入手,带大家进入 Kubernetes
的世界。
假设你已经掌握了下面的基础技能:
上图描述了我们需要创建的 Containers
,其中 PauseContainer
是 Kubernetes
自带的所以我们不用关心,但是十分重要,未来将会有一篇文章来描述 PauseContainer
到底干什么的。 其实基础镜像一般用官方现成的就行了,但是在学习过程中建议还是手动编译一下,了解下官方默认配置有哪些坑。 Dockerfile
代码我会放到 GitHub
上, 因为在这里展示实在是太长了。
Nginx
:
https://github.com/motecshine/nginx1.12-for-k8s
docker build . -t motecshine/nginx1.12-for-k8s:v0.1.0
docker push motecshine/nginx1.12-for-k8s:v0.1.0
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
需要关闭Nginx
和FPM
的daemon
特性,具体看我REPO的Dockerfile
, 这样是为了保证Container
生命周期与POD
生命周期一致。
我们将基于上述镜像来创建我们的业务镜像.
我们基于 Laravel
来创建镜像。
Code
:
https://github.com/motecshine/code-for-k8s
docker build . -t motecshine/code-for-k8s:v0.1.1
docker push motecshine/code-for-k8s:v0.1.1
laravel-nginx-for-k8s
:
https://github.com/motecshine/laravel-nginx-for-k8s
docker build . -t motecshine/laravel-nginx-for-k8s:v0.1.1
docker push motecshine/laravel-nginx-for-k8s:v0.1.1
laravel-fpm-for-k8s
:
https://github.com/motecshine/laravel-fpm-for-k8s
docker build . -t motecshine/laravel-fpm-for-k8s:v0.1.0
docker push motecshine/laravel-fpm-for-k8s:v0.1.0
整体架构如上图所示
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
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
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
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube
我们使用开源的 Ingress
组件安装参考这里
https://docs.traefik.io/configuration/backends/kubernetes/
上面的配置文件在这里
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
日志收集平台,并且给出这个问题的解决方案。