前情回顾
手头只有低配服务器一台(2核2G),既要又要还想要,既要做日常的学习练习,又要部署一些稳定的中间件服务做本地调试,还想要逐步部署一些Demo服务或博客,又不想太花功夫每次部署重新打镜像。
之前完成了一部分工作:
安装K3S、
安装Jenkins
今天,安装一下本地启动服务必备的组件MySQL、Redis,资源有限,暂时先以单节点形式部署
准备工作
MySQL配置文件准备
Secret
Secret用来存储为MySQL配置的密码
为啥用Secret呢?
如果直接在Deployment中的环境变量中配置密码,在pod启动异常时,可以在K8S/K3S的异常日志中,找到对应的环境变量配置,存在密码泄露的风险。
apiVersion: v1
kind: Secret
metadata:
name: mysql
type: Opaque
data:
password: {密码的Base64编码}
Service
单机环境,没有公有云的ELB可以用,只能通过NodePort将服务端口和主机端口做一个映射,注意NodePort的范围是[30000,32767]
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: {节点端口号,范围[30000,32767]}
selector:
app: mysql
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
# 配置资源,小服务器资源太紧张了,只能配置这一点可怜的资源o(╯□╰)o
resources:
limits:
cpu: 0.1
memory: 200Mi
requests:
cpu: 0.1
memory: 200Mi
env:
- name: MYSQL_ROOT_PASSWORD
# 密码使用Secret注入
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 3306
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-data
- name: mysql-config
mountPath: /etc/mysql/mysql.conf.d
volumes:
- name: mysql-data
hostPath:
path: {指定主机目录,存放mysql存储数据}
type: Directory
- name: mysql-config
hostPath:
path: {指定主机目录,存放mysql配置数据}
type: Directory
Redis配置文件准备
redis.conf
部署时暂时不了解如何通过secret注入密码到redis.conf,直接写的明文
bind 0.0.0.0
protected-mode yes
port 6379 # 设置端口
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/tmp/redis.log"
databases 16
always-show-logo no
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
requirepass {密码} # 设置密码
Service
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: NodePort
ports:
- port: 6379
targetPort: 6379
nodePort: {映射的节点端口}
selector:
app: redis
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:5.0
command: ["redis-server", "/mnt/redis.conf"]
resources:
limits:
cpu: 0.1
memory: 200Mi
requests:
cpu: 0.1
memory: 200Mi
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /mnt/redis.conf
name: redis-config
volumes:
- name: redis-config
hostPath:
path: {指定主机目录,存放redis.conf}
type: ""
部署MySQL
部署前,先看看资源够不够 top命令查看资源占用率,看起来占用率不是很高
free -h 查看一下内存占用,出乎意料的高,剩余内存只有76M,根本不够部署
top -p {PID} 查看一下资源占用最高的k3s-server进程的资源使用情况,看起来内存吃了很多
猜测k3s中的内存会给部署的应用预留一些,尝试直接启动服务
# 先把使用的镜像pull下来
docker pull mysql:5.7
# 使上面的3个配置文件生效
kubectl apply -f mysql-secret.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f mysql-deployment.yaml
查看启动状态,mysql pod正常启动
kubectl get pods
使用自己电脑登录成功
此处需要配置-P {mysql服务映射的节点端口}
部署Redis
使配置文件生效,也可将Service和Deployment写在一个yaml中,用“---”分割即可
kubectl apply -f redis-service.yaml
kubectl apply -f redis.yaml
查看pod启动成功,再检查一下内存占用量,相差无几,k3s的内存占用和k3s部署应用后的内存占用还需要再去了解
验证Redis实例是否启动成功,下载Redis客户端工具,验证Redis启动成功