Contents
Kubernetes实战案例¶
可以参考kubernetes的官方example中的例子
https://github.com/kubernetes/examples
1.kubernetes mysql 持久化实战(单节点)¶
安装nfs服务器,将nfs服务器的/data/mysql_nfs路径进行共享。
这里nfs服务器地址为:192.168.1.40
1.1 创建mysql的namespaces¶
mysql-namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mysql
1.2 创建pv¶
mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data
namespace: mysql
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
nfs:
path: /data #nfs共享目录
server: 192.168.186.129 #nfs服务器地址
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
1.3 创建pvc¶
mysql-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-data
namespace: mysql
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
storageClassName: nfs
1.4 创建ConfigMap¶
mysql-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config-sre
namespace: mysql
data:
mysqld.cnf: |
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
bind-address = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_connections=1000
default_storage_engine=innodb
skip_external_locking
lower_case_table_names=1
skip_host_cache
skip_name_resolve
character_set_server=utf8
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
1.5 创建mysql deployment¶
mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/bzvs/mysql5.7:latest
ports:
- containerPort: 3306
protocol: TCP
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data
- name: mysql-config
configMap:
name: mysql-config-sre
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql
labels:
app: mysql
spec:
type: NodePort
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30006
注意nfs服务器上需要开启rpcbind服务
systemctl enable rpcbind
systemctl start rpcbind
systemctl start nfs-server
依次创建命令
kubectl create -f mysql-namespaces.yaml
kubectl create -f mysql-pv.yaml
kubectl create -f mysql-pvc.yaml
kubectl create -f mysql-cm.yaml
kubectl create -f mysql-deployment.yaml
查看结果
[root@ci-base k8s-example]# kubectl get ns
NAME STATUS AGE
mysql Active 17s
[root@ci-base k8s-example]# kubectl get pv -n mysql
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-data 2Gi RWX Recycle Available nfs 17s
[root@ci-base k8s-example]# kubectl get pvc -n mysql
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-data Bound mysql-data 2Gi RWX nfs 8s
[root@ci-base k8s-example]# kubectl get cm -n mysql
NAME DATA AGE
mysql-config-sre 1 14s
[root@ci-base k8s-example]# kubectl get pod,svc -n mysql
NAME READY STATUS RESTARTS AGE
pod/mysql-565b7cd487-hw5lc 1/1 Running 0 8m20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql NodePort 10.98.67.121 <none> 3306:30006/TCP 8m11s
1.6 测试mysql连接是否正常¶

2.部署群集应用 lnmp平台¶
2.1 创建namespace¶
namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: lnmp
2.2 创建pv,pvc¶
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
namespace: lnmp
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs/mysql
server: 192.168.1.40
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv-one
namespace: lnmp
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs/data
server: 192.168.1.40
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv-two
namespace: lnmp
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs/data
server: 192.168.1.40
pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
namespace: lnmp
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-one
namespace: lnmp
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-two
namespace: lnmp
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
2.3 创建svc,deployment¶
mysql-deployment.yaml
---
apiVersion: v1
data:
password: MTIzNDU2 # pass 123456
kind: Secret
metadata:
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
name: mysql-pass
namespace: lnmp
type: Opaque
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
namespace: lnmp
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
namespace: lnmp
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
php-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-php
namespace: lnmp
labels:
app: wordpress
spec:
ports:
- port: 9000
selector:
app: wordpress-php
tier: frontend
---
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: wordpress-php
namespace: lnmp
labels:
app: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-php
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress-php
tier: frontend
spec:
containers:
- name: php
image: registry.cn-hangzhou.aliyuncs.com/balloon/php56:latest
ports:
- containerPort: 9000
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
imagePullSecrets:
- name: registrypullsecret
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-one
nginx-deployment.yaml
nginx的配置使用cm的方式进行配置
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-wp-config
namespace: lnmp
data:
site.conf: |-
server {
listen 80;
server_name localhost;
root html;
index index.html index.php;
location ~ \.php$ {
root html;
fastcgi_pass wordpress-php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_connect_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
}
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-nginx
namespace: lnmp
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress-nginx
tier: frontend
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-nginx
namespace: lnmp
labels:
app: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-nginx
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress-nginx
tier: frontend
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/devops_hu/nginx:none-cfg
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /usr/local/nginx/html
- name: config
mountPath: /usr/local/nginx/conf/vhost/site.conf
subPath: site.conf
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-two
- name: config
configMap:
name: nginx-wp-config
2.4 创建Ingress¶
ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-lnmp
namespace: lnmp
spec:
rules:
- host: lnmp.linux.com #测试域名
http:
paths:
- backend:
serviceName: wordpress-nginx
servicePort: 80
在/data/nfs/data下创建index.html文件,如下:
[root@jenkins data]# echo "<h1>hello nginxtouch index.html</h1>" > index.html
[root@jenkins data]# cat index.html
<h1>hello nginxtouch index.html</h1>
网页访问如下:

其他参考文献:
3. 实战|基于Kubernetes使用MySQL¶
4. Kubernetes部署MySQL 主从架构¶
实验目的
搭建一个
主从复制(Master-Slave)的MySQL集群从节点可以水平扩展
所有的
写操作只能在MySQL主节点上执行读操作可以在MySQL主从节点上执行
从节点能同步主节点的数据
Helm安装nfs-client-provisioner
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
helm repo update
helm pull azure/nfs-client-provisioner --version 1.2.8
tar xvf nfs-client-provisioner-*.tgz
安装 nfs-client-provisioner
kubectl create ns nfs
helm install nfs-client-provisioner -n nfs \
--set nfs.server=192.168.1.60 \
--set nfs.path=/mysql57 \
--set storageClass.name=mysql-nfs,storageClass.reclaimPolicy=Retain \
--set storageClass.defaultClass=true \
nfs-client-provisioner
kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
mysql-nfs-storage (default) cluster.local/mysql-nfs-storage-nfs-client-provisioner Retain Immediate true 37s