【Devops】K3S部署单机MySQL、单机Redis

449 阅读3分钟

前情回顾

手头只有低配服务器一台(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命令查看资源占用率,看起来占用率不是很高

image.png

free -h 查看一下内存占用,出乎意料的高,剩余内存只有76M,根本不够部署 image.png

top -p {PID} 查看一下资源占用最高的k3s-server进程的资源使用情况,看起来内存吃了很多 image.png

猜测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

image.png

使用自己电脑登录成功
此处需要配置-P {mysql服务映射的节点端口} image.png

部署Redis

使配置文件生效,也可将Service和Deployment写在一个yaml中,用“---”分割即可

kubectl apply -f redis-service.yaml
kubectl apply -f redis.yaml

查看pod启动成功,再检查一下内存占用量,相差无几,k3s的内存占用和k3s部署应用后的内存占用还需要再去了解 image.png

验证Redis实例是否启动成功,下载Redis客户端工具,验证Redis启动成功 image.png