0.准备工作
在开始之前,要确保我们的节点已经加入网络并且已经准备好,如果没有可以去看我前面发表的踩坑与解决的文章,希望能够帮到你。
1.k8s部署redis
1.1目标
由于我们的服务器资源较小,所以决定只部署一个redis副本,同时我们要能够提供一个对外的端口进行连接以及使用我们自己的自定义redis配置文件。
1.2效果
成功之后的效果应该如下图中有关redis的部分
1.3项目结构
redis-configmap.yaml
- 作用:用于在 Kubernetes 中创建一个 ConfigMap,用来存储 Redis 的配置文件内容。
redis-statefulset.yaml
- 作用:定义一个 StatefulSet,用于部署和管理 Redis 的有状态应用。
redis.conf
- 作用:Redis 的核心配置文件,用于定义 Redis 的运行参数。
1.4代码展示
redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
save 86400 1
appendonly no
redis-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
spec:
serviceName: "redis-cluster"
replicas: 1
selector:
matchLabels:
app: redis-cluster
template:
metadata:
labels:
app: redis-cluster
spec:
containers:
- name: redis
image: redis:alpine # 使用官方的 Redis 镜像
ports:
- containerPort: 6379 # Redis 默认端口
volumeMounts:
- name: redis-data
mountPath: /data # Redis 数据存储路径
- name: redis-config
mountPath: ****** # 挂载自定义配置文件
subPath: redis.conf
command:
- "redis-server"
- "*******" # 指定使用自定义的配置文件
volumes:
- name: redis-data
emptyDir: {} # 使用 emptyDir 或 PVC 持久化数据
- name: redis-config
configMap:
name: redis-config # 通过 ConfigMap 加载配置文件
---
apiVersion: v1
kind: Service
metadata:
name: redis-cluster
spec:
selector:
app: redis-cluster
ports:
- protocol: TCP
port: ***
targetPort: *****
nodePort: ****
type: NodePort # 使用 NodePort 类型
redis.conf
# redis-persistence.conf
save 86400 1
appendonly no
1.5命令部署
由于之前已经部署过,所以先采用这两行命令停止redis的部署
将之前提供的yaml文件保存到服务器的自定义位置上,然后执行create命令
如果像下面这样我们就成功了!
接下来我们试试可不可以使用redis客户端工具对我们的redis进行连接,这里我采用的是Redis Insight,
输入暴露出来的端口之后,成功连接!
2.k8s部署mysql
2.1目标
同样由于服务器资源的限制,对于mysql我也只打算开一个单机版,能够使用mysql外部客户端进行连接,对于数据可以持久化保存
2.2项目结构
mysql-statefulset.yaml
- 作用:定义 MySQL 的 StatefulSet,用于管理有状态的 MySQL Pod。
mysqlpvc.yaml
- 作用:定义 PersistentVolumeClaim (PVC),用于向 MySQL Pod 申请持久化存储。
mysqlpv.yaml
- 作用:定义 PersistentVolume (PV),用于提供实际的存储资源。
2.3项目代码示例
mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:oracle
env:
- name: MYSQL_ROOT_PASSWORD
value: ******
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: ****
targetPort: ***
nodePort: ****
selector:
app: mysql
type: NodePort
mysqlpvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data-mysql-0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard # 或者你集群中其他存储类的名称
mysqlpv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /mnt/data/mysql
2.4效果
如下图所示便是成功
2.5命令部署
将上面的yaml文件保存到服务器之后执行create命令进行部署,需要先执行pv创建一个可以持久化的资源,之后再执行statefulset文件便成功部署!
注意在执行我们的statefulset之后k8s便会根据我们的定义为我们创建一个默认的pvc来试图绑定资源,但我们采用了自定义的pv资源所以默认的pvc是绑定不到的,我们需要在这后面再次运行我们的pvcyaml文件将它的配置进行改变,
如果能够帮助到你的话,可以留下一个免费的赞吗?:)
题外话
无状态应用是指应用的实例之间没有数据依赖,应用不需要保留用户的会话数据或持久化数据。
特点
- 无数据依赖:每个 Pod 都是独立的,处理完请求后不会存储任何状态数据。
- 弹性伸缩方便:Pod 可以随意增加或减少,不需要考虑数据一致性。
- 容易替换:Pod 重启或迁移不会影响应用的功能,因为所有数据都存储在外部(如数据库、缓存等)。
- 常见场景:
- Web 服务器(如 Nginx、Apache)
- 无状态 API 服务
- 静态文件托管
有状态应用是指应用的实例需要存储并维护自己的状态信息,通常需要持久化数据。
特点
- 数据依赖:应用需要保留会话数据或用户数据,数据通常存储在本地磁盘或持久化存储中。
- 固定 Pod 标识:Pod 通常需要固定的标识(如名称),以确保数据和应用的关联性。
- 复杂部署:需要考虑数据持久化、备份、恢复和一致性问题。
- 常见场景:
- 数据库(如 MySQL、Redis、MongoDB)
- 消息队列(如 Kafka、RabbitMQ)
- 日志存储(如 Elasticsearch)