说明

k8s越来越复杂,也不太好维护,决定使用docker compose 替换k8s

安装docker

## 卸载老版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

## 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

## 下载阿里云镜像仓库文件
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 安装docker
yum install -y docker-ce docker-ce-cli containerd.io

## 开机启动
systemctl start docker
systemctl enable docker

### 建议软连接 docker 目录
systemctl stop docker
mv /var/lib/docker /data
ln -s /data/docker /var/lib/
systemctl start docker

配置加速地址

vi /etc/docker/daemon.json

{
"registry-mirrors": [
  "https://dockerhub.o0o.us.kg",
  "https://docker.chongzhen.icu",
  "https://docker.kengdie.xyz",
  "https://docker.1panel.live"
  ],
"insecure-registries": ["127.0.0.1:5000"],
"log-driver":"json-file",
"log-opts":{"max-size":"10m"}
}

迁移yaml文件

k8s redis.yaml文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
  labels:
    app: redis
data:
  redis.conf: |-
    port 6379
    #bind 127.0.0.1 -::1
    protected-mode no
    #daemonize yes
    maxmemory-policy volatile-lru
    #loadmodule /data/redisearch_v2.4.8.so
    #loadmodule /data/librejson_v2.0.8.so
---  

###声明 Deployment####
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  ###更新:容器准备完成之后,延迟60s,配合strategy.maxUnavailable: 0时,可以忽略###
  #minReadySeconds: 60
  strategy:
    ###升级方式,默认的方式###
    type: RollingUpdate 
    ###严格控制,每次升级一个pod,不可用状态为0个pod###
    rollingUpdate:
      ###滚动升级时会先启动1个pod###
      maxSurge: 1
      ###滚动升级时允许的最大不可用的pod个数###      
      maxUnavailable: 0
  
  selector: 
    matchLabels: 
      app: redis
  template:
    metadata:
    
      ####禁用istio自动注入sidecar###
      annotations:
        sidecar.istio.io/inject: "false"
           
      ###istio需要app和version两个标签###
      labels: 
        app: redis
        version: v1
    spec:
      containers:
      - name: redis
        image: redis:7.4.2
        ###
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        command:
        - "sh"
        - "-c"
        - "redis-server /etc/redis/redis.conf"

        env:
        ###设置时区###
        - name: TZ
          value: Asia/Shanghai 
        #- name: LC_ALL
          value: zh_CN.UTF-8
        #- name: LANG
          value: zh_CN.UTF-8                      
                
        ports:
        - containerPort: 7070
        volumeMounts:
        ###挂载点###
        - mountPath: /data
          ###对应下面卷 cephfs-pvc-pod 的名称###
          name: redis-data
          ###指定子目录,会在cephfs里创建子文件夹####
          subPath: redis/pvc

        ###挂载点###
        - mountPath: /etc/redis/redis.conf
          ### volumes.name ###
          name: redis-config
          ### 文件名 ####
          subPath: redis.conf

      volumes:
      ###卷名称,对应上面的挂载名称###
      - name: redis-data
        persistentVolumeClaim:
          ###对应cephfs-pvc.yaml的metadata.name###
          claimName: k8s-pvc

      - name: redis-config
        configMap:
          defaultMode: 0600
          ### 对应的ConfigMap名称 ###
          name: redis-config          
          
---

###可以使用 kubectl api-versions 查询支持的version###
apiVersion: v1 
### service 类型####
kind: Service
###元数据###
metadata:
  ###service的名称####
  name: redis
###具体描述###
spec:
  ###标签选择器###
  selector:
    ###标签是 nginx 的pod###
    app: redis
  ###节点类型是 NodePort ###
  type: NodePort

  ###虚拟IP###
  #clusterIP: 10.98.239.102
  ###端口列表###
  ports:
  ###http的端口说明,istio需要端口的命名为协议名(http)或者协议名加后缀(http-a)###
  - name: tcp
    ###TCP协议###
    protocol: TCP
    ###虚拟IP的端口是80###
    port: 6379
    ###pod的端口是80,一般和port属性一致###
    #targetPort: 80
    ###实际物理机IP映射的端口,一般自动分配, kubectl get services 可以查看,如果外部有LB,可以指定,方便管理####
    nodePort: 30379

docker compose

目录结构

/redis
├── docker-compose.yml
├── conf
│   └── redis.conf
└── data

docker-compose.yaml

services:
  redis:
    image: redis:7.4.2
    container_name: redis
    restart: unless-stopped
    command: sh -c "redis-server /etc/redis/redis.conf"
    environment:
      TZ: Asia/Shanghai
    ports:
      - "30379:6379"
    volumes:
      - ./data:/data
      - ./conf/redis.conf:/etc/redis/redis.conf
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 30s
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G      

redis.conf

bind 0.0.0.0
protected-mode no
# requirepass your_strong_password
maxmemory 4gb
maxmemory-policy volatile-lru
appendonly yes
dir /data
tcp-keepalive 300

常用命令

## 进入容器
docker exec -it 容器名 /bin/bash

## 后台启动, -d代表后台启动,会应用配置
docker compose up -d

## 强制重建服务
docker compose up -d --build --force-recreate

## 仅启动 web 和 db 服务
docker compose up -d web db

## 仅停止容器(不删除)
docker compose stop

## 仅启动容器(不更新配置)
docker compose start

## 停止并清理
docker compose down

## 彻底清理(含数据卷)
docker compose down -v

## 查看容器运行状态
docker compose ps

## 实时查看日志
docker compose logs -f

## 查看服务依赖关系
docker compose config --services