一、k8s 运行Redis 服务
通过数据数据pv/pvc结合NFS持久的服务器
1.1 redis镜像制作
环境准备 #制作镜像 FROM centos:7.8.2003 ADD redis-4.0.14.tar.gz /usr/local/src/ RUN ln -sv /usr/local/src/redis-4.0.14/ /usr/local/redis && mkdir /data/redis-data -p RUN yum -y install gcc automake autoconf libtool make && cd /usr/local/redis && make && make install COPY redis.conf /usr/local/redis/ ADD run.sh /scripts/run.sh EXPOSE 6379 CMD [ "/scripts/run.sh" ] #redis的配置文件 root@master1:~/server/scripts/Dockerfile/redis# cat redis.conf |grep -v "^$"|grep -v "#" bind 127.0.0.1 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data/redis-data ######主要修改此目录 slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble no lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes #redis启动脚本 root@master1:~/server/scripts/Dockerfile/redis# cat run.sh #!/bin/bash redis-server /usr/local/redis/redis.conf tail -f /etc/hosts #构建进行上传到harbor root@master1:~/server/scripts/Dockerfile/redis# cat run-redis.sh #!/bin/bash docker build -t 10.0.0.104/baseimages/redis:v6.0.9 . sleep 1 docker push 10.0.0.104/baseimages/redis:v6.0.9 #进行构建 root@master1:~/server/scripts/Dockerfile/redis# bash run-redis.sh
1.2 创建PV,PVC
1.2.1 创建pv
#pv配置文件
root@master1:~/server/yaml/redis# cat redis-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-datadir-pv-1
namespace: test
spec:
capacity: #当前pv大小
storage: 10Gi
accessModes: #访问模式
- ReadWriteOnce
nfs:
path: /data/k8sdata/test/redis-datadir-1
server: 10.0.0.111
#进行创建
root@master1:~/server/yaml/redis# kubectl apply -f redis-pv.yaml
#检验
root@master1:~/server/yaml/redis# kubectl get pv -n test
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
redis-datadir-pv-1 10Gi RWO Retain Available 97s
1.2.2 创建PVC
#pvc的配置文件
root@master1:~/server/yaml/redis# cat redis-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-datadir-pvc-1
namespace: test
spec:
volumeName: redis-datadir-pv-1 #要绑定的PV名称
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
#进行创建
root@master1:~/server/yaml/redis# kubectl apply -f redis-pvc.yaml
persistentvolumeclaim/redis-datadir-pvc-1 created
#验证
root@master1:~/server/yaml/redis# kubectl get pvc -n test
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-datadir-pvc-1 Bound redis-datadir-pv-1 10Gi RWO 2m14s
1.3 创建deployment
#redis deployment配置文件
root@master1:~/server/yaml/redis# cat redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deploy
namespace: test
labels:
app: redis-deploy
spec:
selector:
matchLabels:
app: redis-deploy
replicas: 1
template:
metadata:
labels:
app: redis-deploy
spec:
containers:
- name: redis-container
image: 10.0.0.104/baseimages/redis:v6.0.9
imagePullPolicy: Always
volumeMounts:
- name: redis-datadir
mountPath: "/data/redis-data"
volumes:
- name: redis-datadir
persistentVolumeClaim:
claimName: redis-datadir-pvc-1
---
apiVersion: v1
kind: Service
metadata:
name: redis-svc
namespace: test
spec:
selector:
app: redis-deploy
type: NodePort
ports:
- name: http
port: 6379
targetPort: 6379
nodePort: 36379
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
#启动服务
root@master1:~/server/yaml/redis# kubectl apply -f redis-deployment.yaml
deployment.apps/redis-deploy unchanged
service/redis-svc created
root@master1:~/server/yaml/redis# kubectl get svc -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc NodePort 10.100.251.254 <none> 85:30010/TCP 2d3h
redis-svc NodePort 10.100.67.152 <none> 6379:36379/TCP 9s
tomcat-svc NodePort 10.100.60.137 <none> 80:30004/TCP 2d22h
#进行验证
root@master1:~/server/yaml/redis# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
redis-deploy-67bf94579b-cgjpl 1/1 Running 0 96s
root@master1:~/server/yaml/redis# kubectl exec -it deploy/redis-deploy -n test bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@redis-deploy-67bf94579b-cgjpl /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:53 ? 00:00:00 /bin/bash /scripts/run.sh
root 6 1 0 07:53 ? 00:00:00 redis-server 127.0.0.1:6379
root 10 0 0 07:54 pts/0 00:00:00 bash
root 24 10 0 07:54 pts/0 00:00:00 ps -ef
[root@redis-deploy-67bf94579b-cgjpl /]# df -h
Filesystem Size Used Avail Use% Mounted on
10.0.0.111:/data/k8sdata/test/redis-datadir-1 19G 8.4G 9.3G 48% /data/redis-data
[root@redis-deploy-67bf94579b-cgjpl /]# redis-cli -h 127.0.0.1
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> bgsave
Background saving started
[root@redis-deploy-67bf94579b-cgjpl /]# ll /data/redis-data/
total 4
-rw-r--r-- 1 root root 112 Oct 29 07:55 dump.rdb
#查询nfs上面的数据
root@node1:~# ll /data/k8sdata/test/redis-datadir-1/
total 12
drwxr-xr-x 2 root root 4096 Oct 29 15:55 ./
drwxr-xr-x 4 root root 4096 Oct 29 15:51 ../
-rw-r--r-- 1 root root 112 Oct 29 15:55 dump.rdb
二、mysql 主从复制
参考自:https://kubernetes.io/zh/docs/tasks/run-application/run-replicated-stateful-application/
2.1环境准备
root@master1:~# docker pull mysql:5.7
root@master1:~# docker tag mysql:5.7 10.0.0.104/baseimages/mysql:5.7
root@master1:~# docker push 10.0.0.104/baseimages/mysql:5.7
root@master1:~# docker pull registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0
root@master1:~# docker tag registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0 10.0.0.104/baseimages/xtrabackup:1.0
root@master1:~# docker push 10.0.0.104/baseimages/xtrabackup:1.0
2.2 创建 ConfigMap
root@master1:~/yaml/mysql# vim mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
labels:
app: mysql
data:
master.cnf: |
# Apply this config only on the master.
[mysqld]
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
slave.cnf: |
# Apply this config only on slaves.
[mysqld]
super-read-only
super-read-only
log_bin_trust_function_creators=1
2.3 创建PV
root@master1:~/yaml/mysql# vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-1
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-1
server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-2
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-2
server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-3
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-3
server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-4
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-4
server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-5
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-5
server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-data-dir-6
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8sdata/mysql-data-dir-6
server: 10.0.0.109
2.3 创建服务
root@master1:~/yaml/mysql# vim mysql-services.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
clusterIP: None
selector:
app: mysql
---
# Client service for connecting to any MySQL instance for reads.
# For writes, you must instead connect to the master: mysql-0.mysql.
apiVersion: v1
kind: Service
metadata:
name: mysql-read
labels:
app: mysql
spec:
ports:
- name: mysql
port: 3306
selector:
app: mysql
2.4 创建statefulset
#root@master1:~/yaml/mysql# vim mysql-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: selector: matchLabels: app: mysql serviceName: mysql replicas: 3 template: metadata: labels: app: mysql spec: initContainers: - name: init-mysql image: 10.0.0.104/baseimages/mysql:5.7 #修改为自己harbor仓库镜像 command: - bash - "-c" - | set -ex # Generate mysql server-id from pod ordinal index. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 ordinal=${ BASH_REMATCH[1]} echo [mysqld] > /mnt/conf.d/server-id.cnf # Add an offset to avoid reserved server-id=0 value. echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf # Copy appropriate conf.d files from config-map to emptyDir. if [[ $ordinal -eq 0 ]]; then cp /mnt/config-map/master.cnf /mnt/conf.d/ else cp /mnt/config-map/slave.cnf /mnt/conf.d/ fi volumeMounts: - name: conf mountPath: /mnt/conf.d - name: config-map mountPath: /mnt/config-map - name: clone-mysql image: 10.0.0.104/baseimages/xtrabackup:1.0 #修改为自己harbor仓库镜像 command: - bash - "-c" - | set -ex # Skip the clone if data already exists. [[ -d /var/lib/mysql/mysql ]] && exit 0 # Skip the clone on master (ordinal index 0). [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 ordinal=${ BASH_REMATCH[1]} [[ $ordinal -eq 0 ]] && exit 0 # Clone data from previous peer. ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql # Prepare the backup. xtrabackup --prepare --target-dir=/var/lib/mysql volumeMounts: - name: data mountPath: /var/lib/mysql subPath: mysql - name: conf mountPath: /etc/mysql/conf.d containers: - name: mysql image: 10.0.0.104/baseimages/mysql:5.7 env: - name: MYSQL_ALLOW_EMPTY_PASSWORD value: "1" ports: - name: mysql containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib 标签:连接器xf3h