lnmp为什么要迁移到k8s
将lnmp迁移到k8s架构上会使得应用的启动、迁移、部署变得即简单又安全。
不必担心应用迁移后工作出现问题,也不用担心一台服务器无法应付突发的用户量。
架构设计
mysql是一种有状态服务,mysql在某些情况下如果发生故障性退出可能会出现服务无法再次启动的情况,所以使用storageclass(nfs)来挂载,并使用deployments来保证应用的持续,这里设置replicas为1,后期部署主从后再行修改
pvc设置
[root@master lnmp]# kubectl create ns lnmp
namespace/lnmp created
[root@master lnmp]# cat lnmp-pvc.yaml
apiversion: v1
kind: persistentvolumeclaim
metadata:
name: mysql-pvc
namespace: lnmp
spec:
resources:
requests:
storage: 5gi
accessmodes:
- readwritemany
storageclassname: mysc1
---
apiversion: v1
kind: persistentvolumeclaim
metadata:
name: php-pvc
namespace: lnmp
spec:
resources:
requests:
storage: 5gi
accessmodes:
- readwritemany
storageclassname: mysc1
[root@master lnmp]# kubectl apply -f lnmp-pvc.yaml
persistentvolumeclaim/mysql created
persistentvolumeclaim/php created
### 已部署sc,这边状态已经变更为 bound
[root@master lnmp]# kubectl get pvc -n lnmp
name status volume capacity access modes storageclass age
mysql-pvc bound pvc-bb57ddc7-ae5e-4652-880a-08d8260314bb 5gi rwx mysc1 29s
php-pvc bound pvc-53c2880e-c383-41f1-8e09-c7106ea8c18f 5gi rwx mysc1 29smysql 配置
1. 创建mysql密码的认证 (secret)
[root@master lnmp]# kubectl create secret generic mysql-pass --from-literal=password=aa123456 -n lnmp secret/mysql-pass created # 或者 [root@master ~]# vim mysql-secret.yaml apiversion: v1 data: password: qwexmjm0nty= kind: secret metadata: creationtimestamp: null name: mysql-pass namespace: lnmp [root@master ~]# kubectl apply -f mysql-secret.yaml secret/mysql-pass created
2. 创建mysql的service、deployment
2.1 这边使用了自建的harbor镜像仓库,配置dockerconfigjson类型的secret
kubectl create secret docker-registry --dry-run=client docker-harbor --docker-server=registry.bianminchang.com:5001 --docker-username=admin --docker-password=li*****4 -o yaml > docker-secret.yaml [root@master lnmp]# vim docker-secret.yaml apiversion: v1 data: .dockerconfigjson: eyjhdxrocyi6eyjyzwdpc3ryes5iawfubwluy2hhbmcuy29tojuwmdeionsidxnlcm5hbwuioijhzg1pbiisinbhc3n3b3jkijoi************oiwvdsdgfxndzir2x3y0dsd2neut0ifx19 kind: secret metadata: creationtimestamp: null name: docker-harbor type: kubernetes.io/dockerconfigjson [root@master lnmp]# kubectl apply -f docker-secret.yaml secret/docker-harbor created
2.2 mysql的service、deployment
[root@master lnmp]# cat mysql-deploy.yaml
#apiversion: v1 # 这边由于项目数据库连接无法读取集群内的svc,使用服务器的hostport
#kind: service
#metadata:
# name: lnmp-mysql
# namespace: lnmp
# labels:
# app: lnmp-mysql
#spec:
# type:
# ports:
# - protocol: tcp
# port: 3306
# nodeport: 3306
# selector:
# app: lnmp-mysql
---
apiversion: apps/v1
kind: deployment
metadata:
name: lnmp-mysql
namespace: lnmp
spec:
selector:
matchlabels:
app: lnmp-mysql
strategy:
type: recreate
template:
metadata:
labels:
app: lnmp-mysql
spec:
nodename: master
containers:
- name: mysql
image: registry.bianminchang.com:5001/lnmp/mysql:5.6
imagepullpolicy: ifnotpresent
env:
- name: mysql_root_password
valuefrom:
secretkeyref:
name: mysql-pass
key: password
ports:
- containerport: 3306
hostport: 3306 # 服务器3306 端口
name: mysql
livenessprobe:
tcpsocket:
port: 3306
initialdelayseconds: 90
periodseconds: 15
volumemounts:
- name: mysql-persistent-storage
mountpath: /var/lib/mysql
- name: etc-localtime
mountpath: /etc/localtime
imagepullsecrets: # 指定镜像仓库拉取信息
- name: docker-harbor
volumes:
- name: etc-localtime
hostpath:
path: /etc/localtime
- name: mysql-persistent-storage
persistentvolumeclaim:
claimname: mysql-pvc创建文件并检测
[root@master lnmp]# kubectl apply -f mysql-deploy.yaml service/lnmp-mysql created deployment.apps/lnmp-mysql created [root@master lnmp]# kubectl get secrets name type data age default-token-2cqf5 kubernetes.io/service-account-token 3 54m docker-harbor kubernetes.io/dockerconfigjson 1 6m16s [root@master lnmp]# kubectl get pod name ready status restarts age lnmp-mysql-5df7b46bcd-fk76k 1/1 running 0 6m1s
php配置
创建php的service,hpa(水平自动伸缩),deployment
[root@master lnmp]# cat php-deploy.yaml
apiversion: v1
kind: service
metadata:
name: lnmp-php
namespace: lnmp
spec:
ports:
- port: 9000
selector:
app: lnmp-php
---
apiversion: autoscaling/v1
kind: horizontalpodautoscaler
metadata:
name: lnmp-php
spec:
scaletargetref:
apiversion: apps/v1
kind: deployment
name: lnmp-php
minreplicas: 1
maxreplicas: 10
targetcpuutilizationpercentage: 85 # 当容器的cpu使用量超过85%时,调度器创建新的pod
---
apiversion: apps/v1
kind: deployment
metadata:
name: lnmp-php
namespace: lnmp
labels:
app: php
spec:
replicas: 1
selector:
matchlabels:
app: lnmp-php
strategy:
type: recreate
template:
metadata:
labels:
app: lnmp-php
spec:
containers:
- name: php
image: registry.bianminchang.com:5001/lnmp/php-fpm:7.0.4
#image: php:test
imagepullpolicy: ifnotpresent
ports:
- containerport: 9000
name: php
volumemounts:
- name: php-persistent-storage
mountpath: /usr/share/nginx/html
- name: etc-localtime
mountpath: /etc/localtime
imagepullsecrets: # 指定镜像仓库拉取信息
- name: docker-harbor
volumes:
- name: etc-localtime # docker 时区挂载
hostpath:
path: /etc/localtime
- name: php-persistent-storage
persistentvolumeclaim:
claimname: php-pvc
[root@master lnmp]# kubectl apply -f php-deploy.yaml
service/lnmp-php unchanged
horizontalpodautoscaler.autoscaling/lnmp-php created
deployment.apps/lnmp-php unchanged
[root@master lnmp]# kubectl get hpa
name reference targets minpods maxpods replicas age
lnmp-php deployment/lnmp-php <unknown>/85% 1 10 3 17snginx配置
创建nginx的configmap,service,deployment
api deployment
[root@master nginx]# vim api-deploy.yaml
# hpa pod 水平自动扩缩
apiversion: autoscaling/v1
kind: horizontalpodautoscaler
metadata:
name: nginx-hpa
namespace: lnmp
spec:
maxreplicas: 5
minreplicas: 2
scaletargetref:
apiversion: apps/v1
kind: deployment
name: api
targetcpuutilizationpercentage: 80
---
apiversion: v1
kind: service
metadata:
name: api
namespace: lnmp
labels:
app: nginx
spec:
ports:
- name: nginx
port: 80
targetport: 80
selector:
app: api
---
apiversion: apps/v1
kind: deployment
metadata:
name: api
labels:
app: nginx
spec:
replicas: 1
selector:
matchlabels:
app: api
strategy:
type: recreate
template:
metadata:
labels:
app: api
spec:
containers:
- name: nginx
image: registry.bianminchang.com:5001/lnmp/nginx:1.16.1
imagepullpolicy: ifnotpresent
ports:
- containerport: 80
name: nginx
livenessprobe:
httpget:
path: /
port: 80
initialdelayseconds: 20
periodseconds: 10
volumemounts:
- name: nginx-persistent-storage
mountpath: /usr/share/nginx/html
- name: factory-api-config
mountpath: /etc/nginx/conf.d/default.conf
subpath: default.conf
volumes:
- name: nginx-persistent-storage
persistentvolumeclaim:
claimname: php-pvc
- name: factory-api-config
configmap:
name: factory-api-config
factory deployment 项目后台
[root@master nginx]# cat factory-deploy.yaml
apiversion: autoscaling/v1
kind: horizontalpodautoscaler
metadata:
name: factory-hpa
namespace: lnmp
spec:
maxreplicas: 5
minreplicas: 1
scaletargetref:
apiversion: apps/v1
kind: deployment
name: factory
targetcpuutilizationpercentage: 80
---
apiversion: v1
kind: service
metadata:
name: factory
namespace: lnmp
labels:
app: nginx
spec:
ports:
- name: nginx
port: 80
targetport: 80
selector:
app: factory
---
apiversion: apps/v1
kind: deployment
metadata:
name: factory
labels:
app: nginx
spec:
replicas: 1
selector:
matchlabels:
app: factory
strategy:
type: recreate
template:
metadata:
labels:
app: factory
spec:
containers:
- name: nginx
image: registry.bianminchang.com:5001/lnmp/nginx:1.16.1
imagepullpolicy: ifnotpresent
ports:
- containerport: 80
name: nginx
livenessprobe:
httpget:
path: /
port: 80
initialdelayseconds: 20
periodseconds: 10
volumemounts:
- name: nginx-persistent-storage
mountpath: /usr/share/nginx/html
- name: factory-config
mountpath: /etc/nginx/conf.d/default.conf
subpath: default.conf
volumes:
- name: nginx-persistent-storage
persistentvolumeclaim:
claimname: php-pvc
- name: factory-config
configmap:
name: factory-configfactory-front. deployment. 项目前端
[root@master nginx]# cat factory-front-deploy.yaml
apiversion: autoscaling/v1
kind: horizontalpodautoscaler
metadata:
name: nginx-hpa
namespace: lnmp
spec:
maxreplicas: 5
minreplicas: 1
scaletargetref:
apiversion: apps/v1
kind: deployment
name: factory-front
targetcpuutilizationpercentage: 80
---
apiversion: v1
kind: service
metadata:
name: factory-front
namespace: lnmp
labels:
app: nginx
spec:
ports:
- name: nginx
port: 80
targetport: 80
selector:
app: factory-front
---
apiversion: apps/v1
kind: deployment
metadata:
name: factory-front
labels:
app: nginx
spec:
replicas: 1
selector:
matchlabels:
app: factory-front
strategy:
type: recreate
template:
metadata:
labels:
app: factory-front
spec:
containers:
- name: nginx
image: registry.bianminchang.com:5001/lnmp/nginx:1.16.1
imagepullpolicy: ifnotpresent
ports:
- containerport: 80
name: nginx
livenessprobe:
httpget:
path: /
port: 80
initialdelayseconds: 20
periodseconds: 10
volumemounts:
- name: nginx-persistent-storage
mountpath: /usr/share/nginx/html
- name: factory-front-config
mountpath: /etc/nginx/conf.d/default.conf
subpath: default.conf
volumes:
- name: nginx-persistent-storage
persistentvolumeclaim:
claimname: php-pvc
- name: factory-front-config
configmap:
name: factory-front-confignginx 配置
注意:
php与nginx不在同一个pod内,集群内通讯用svc, fastcgi_pass lnmp-php:9000;
lnmp-php 为php的svc
[root@master nginx]# cat factory-config.yaml
apiversion: v1
kind: configmap
metadata:
name: nginx-wp-config
namespace: lnmp
data:
default.conf: |-
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.php;
location ~ \.php$ {
root /usr/local/nginx/html;
fastcgi_pass lnmp-php:9000;
fastcgi_param script_filename /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
}
---
apiversion: v1
kind: configmap
metadata:
name: factory-config
namespace: lnmp
data:
default.conf: |-
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html/jingtai_factory/backend/web;
index index.php index.html index.htm default.php default.htm default.html;
location ~ \.php$ {
root /usr/share/nginx/html/jingtai_factory/backend/web;
fastcgi_pass lnmp-php:9000;
fastcgi_param script_filename /usr/share/nginx/html/jingtai_factory/backend/web$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
location / {
if (!-e $request_filename) {
rewrite ^/(.*) /index.php last;
break;
}
}
access_log /usr/share/nginx/html/factory.log;
error_log /usr/share/nginx/html/factory-err.log;
}
---
apiversion: v1
kind: configmap
metadata:
name: factory-front-config
namespace: lnmp
data:
default.conf: |-
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html/jingtai_factory_frontend;
index index.php index.html index.htm default.php default.htm default.html;
location ~ \.php$ {
root /usr/share/nginx/html/jingtai_factory_frontend;
fastcgi_pass lnmp-php:9000;
fastcgi_param script_filename /usr/share/nginx/html/jingtai_factory_frontend$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
location / {
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
break;
}
}
}
---
apiversion: v1
kind: configmap
metadata:
name: factory-api-config
namespace: lnmp
data:
default.conf: |-
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html/jingtai_factory/cloud;
index index.php index.html index.htm default.php default.htm default.html;
location ~ \.php$ {
root /usr/share/nginx/html/jingtai_factory/cloud;
fastcgi_pass lnmp-php:9000;
fastcgi_param script_filename /usr/share/nginx/html/jingtai_factory/cloud$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
location / {
if (!-e $request_filename) {
rewrite ^/(.*) /index.html last;
break;
}
}
}
执行结果
[root@master nginx]# kubectl get pod name ready status restarts age api-59c5b5ddbc-nbcb9 1/1 running 0 16h factory-574c54f796-qzfnw 1/1 running 0 16h factory-front-694779bbd8-55tgc 1/1 running 0 16h lnmp-mysql-57445b5c4b-mpl62 1/1 running 0 16h lnmp-php-5d7d5896b7-9sqtb 1/1 running 0 16h
ingress配置
[root@master ingress]# cat ingress-lnmp.yaml
apiversion: networking.k8s.io/v1
kind: ingress
metadata:
name: lnmp-ingress
namespace: lnmp
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressclassname: nginx
rules:
- host: backend.k8s.com
http:
paths:
- path: /
pathtype: prefix
backend:
service:
name: factory
port:
number: 80
- host: api.k8s.com
http:
paths:
- path: /
pathtype: prefix
backend:
service:
name: api
port:
number: 80
- host: factory.k8s.com
http:
paths:
- path: /
pathtype: prefix
backend:
service:
name: factory-front
port:
number: 80
[root@master ingress]# kubectl get ingress
name class hosts address ports age
lnmp-ingress nginx backend.k8s.com,api.k8s.com,factory.k8s.com 10.99.132.137 80 16h
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论