Skip to content

Memcached Docker/K8s部署

Docker部署Memcached

Docker是目前最流行的容器化平台,使用Docker部署Memcached具有快速、便捷、一致性好等优点。通过Docker,我们可以轻松实现Memcached的环境隔离、版本管理和快速迁移,非常适合开发、测试和生产环境。以下是几种常见的Docker部署方式:

基础Docker部署

这是最简单的Memcached Docker部署方式,直接使用官方镜像启动一个Memcached容器。官方Memcached镜像由Docker Hub维护,包含了最新的稳定版本,适合快速部署和测试:

bash
docker run -d --name memcached -p 11211:11211 memcached:latest

参数详细说明:

  • -d: 以守护进程模式运行容器,即在后台运行,不占用当前终端
  • --name memcached: 为容器指定一个易于识别的名称,方便后续管理和操作
  • -p 11211:11211: 将容器内部的11211端口(Memcached默认端口)映射到宿主机的11211端口,这样外部应用可以通过宿主机IP访问Memcached服务
  • memcached:latest: 使用Docker Hub上的官方Memcached镜像,并指定使用最新版本

这种部署方式适合快速搭建测试环境或开发环境,只需一条命令即可完成部署,非常便捷。

自定义配置的Docker部署

在生产环境中,通常需要根据实际业务需求和服务器资源情况,对Memcached进行自定义配置,包括内存分配、连接数限制、线程数量等。以下是带有资源限制和自定义参数的生产环境部署示例:

bash
docker run -d --name memcached \
  -p 11211:11211 \
  -m 128m \
  memcached:latest memcached -m 128 -c 2048 -t 4

参数详细说明:

  • -d: 以守护进程模式运行容器,确保服务在后台稳定运行
  • --name memcached: 为容器指定明确的名称,便于后续管理和监控
  • -p 11211:11211: 端口映射配置,允许外部应用访问Memcached服务
  • -m 128m: 设置Docker容器的内存限制为128MB,防止容器占用过多主机资源
  • memcached:latest: 使用官方Memcached镜像的最新稳定版本
  • memcached -m 128: 配置Memcached服务本身分配128MB内存用于缓存数据
  • -c 2048: 设置Memcached最大允许的并发连接数为2048,根据业务并发量调整
  • -t 4: 设置Memcached使用4个工作线程处理请求,根据CPU核心数量调整

这种部署方式适合生产环境使用,通过自定义配置可以优化Memcached的性能,提高资源利用率,并根据业务需求进行调整。

Docker Compose部署

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Docker Compose可以更方便地管理Memcached服务的配置和依赖关系:

  1. 创建docker-compose.yml文件,定义Memcached服务配置:
yaml
version: '3'
services:
  memcached:
    image: memcached:latest  # 使用最新版本的Memcached镜像
    container_name: memcached  # 容器名称
    ports:
      - "11211:11211"  # 端口映射,将宿主机11211端口映射到容器11211端口
    mem_limit: 256m  # 容器内存限制为256MB
    command: memcached -m 256 -c 4096 -t 4  # Memcached服务启动参数
    restart: always  # 容器退出时自动重启
    networks:
      - memcached-net  # 将容器连接到自定义网络

networks:
  memcached-net:  # 定义自定义网络
    driver: bridge  # 使用桥接网络模式
  1. 使用以下命令启动服务:
bash
docker-compose up -d
  1. 查看服务状态:
bash
docker-compose ps
  1. 停止服务:
bash
docker-compose down

Kubernetes部署Memcached

Kubernetes是目前最流行的容器编排平台,使用Kubernetes部署Memcached可以实现自动扩缩容、高可用、滚动更新等高级特性。以下是几种常见的Kubernetes部署方式:

单实例Deployment

对于小规模应用,单实例Memcached可能已经足够。以下是使用Deployment部署单实例Memcached的示例:

  1. 创建memcached-deployment.yaml文件:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: memcached  # Deployment名称
  namespace: default  # 命名空间
spec:
  replicas: 1  # 副本数,单实例设置为1
  selector:
    matchLabels:
      app: memcached  # 选择器标签
  template:
    metadata:
      labels:
        app: memcached  # Pod标签,必须与selector匹配
    spec:
      containers:
      - name: memcached  # 容器名称
        image: memcached:latest  # 容器镜像
        resources:  # 资源请求和限制
          requests:  # 资源请求,调度时使用
            memory: "256Mi"  # 请求256MB内存
            cpu: "100m"  # 请求100m CPU
          limits:  # 资源限制,运行时使用
            memory: "512Mi"  # 限制512MB内存
            cpu: "500m"  # 限制500m CPU
        ports:
        - containerPort: 11211  # 容器内部端口
        args: ["-m", "256", "-c", "4096", "-t", "4"]  # Memcached启动参数
---
apiVersion: v1
kind: Service  # Service定义,用于访问Pod
metadata:
  name: memcached  # Service名称
  namespace: default  # 命名空间
spec:
  selector:
    app: memcached  # 选择器标签,与Pod标签匹配
  ports:
  - port: 11211  # Service端口
    targetPort: 11211  # 目标Pod端口
  type: ClusterIP  # Service类型,ClusterIP表示仅集群内部可访问
  1. 使用以下命令应用部署:
bash
kubectl apply -f memcached-deployment.yaml
  1. 查看部署状态:
bash
kubectl get pods -l app=memcached
kubectl get services memcached
  1. 访问Memcached服务:
bash
# 在集群内部访问
kubectl run -it --rm --image=busybox busybox -- telnet memcached 11211

分布式Memcached集群

对于大规模应用,单实例Memcached可能无法满足需求。使用StatefulSet可以部署分布式Memcached集群,实现高可用和横向扩展。StatefulSet适合部署有状态应用,每个Pod有稳定的网络标识和持久存储:

  1. 创建memcached-statefulset.yaml文件:
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: memcached-cluster  # StatefulSet名称
  namespace: default  # 命名空间
spec:
  serviceName: memcached-cluster  # Headless Service名称
  replicas: 3  # 副本数,分布式集群建议3个或更多
  selector:
    matchLabels:
      app: memcached-cluster  # 选择器标签
  template:
    metadata:
      labels:
        app: memcached-cluster  # Pod标签,必须与selector匹配
    spec:
      containers:
      - name: memcached  # 容器名称
        image: memcached:latest  # 容器镜像
        resources:  # 资源请求和限制
          requests:  # 资源请求,调度时使用
            memory: "512Mi"  # 请求512MB内存
            cpu: "200m"  # 请求200m CPU
          limits:  # 资源限制,运行时使用
            memory: "1Gi"  # 限制1GB内存
            cpu: "1"  # 限制1 CPU核心
        ports:
        - containerPort: 11211  # 容器内部端口
        args: ["-m", "512", "-c", "8192", "-t", "8"]  # Memcached启动参数
---
apiVersion: v1
kind: Service  # Headless Service定义,用于StatefulSet的网络标识
metadata:
  name: memcached-cluster  # Service名称,必须与StatefulSet的serviceName匹配
  namespace: default  # 命名空间
spec:
  selector:
    app: memcached-cluster  # 选择器标签,与Pod标签匹配
  ports:
  - port: 11211  # Service端口
    targetPort: 11211  # 目标Pod端口
  clusterIP: None  # Headless Service,clusterIP设置为None
  1. 使用以下命令应用部署:
bash
kubectl apply -f memcached-statefulset.yaml
  1. 查看部署状态:
bash
kubectl get statefulsets memcached-cluster
kubectl get pods -l app=memcached-cluster
kubectl get services memcached-cluster
  1. 访问分布式Memcached集群:
bash
# 在集群内部访问第一个节点
kubectl run -it --rm --image=busybox busybox -- telnet memcached-cluster-0.memcached-cluster 11211

# 在集群内部访问第二个节点
kubectl run -it --rm --image=busybox busybox -- telnet memcached-cluster-1.memcached-cluster 11211

使用Helm部署Memcached

Helm是Kubernetes的包管理工具,可以更方便地部署和管理应用。Bitnami提供了维护良好的Memcached Helm Chart:

  1. 添加Bitnami Helm仓库:
bash
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
  1. 安装Memcached:
bash
helm install memcached bitnami/memcached \
  --set replicaCount=3 \
  --set resources.requests.memory=512Mi \
  --set resources.limits.memory=1Gi \
  --set memcached.maxItemMemory=512 \
  --set memcached.maxConnections=8192

参数说明:

  • --set replicaCount=3: 设置副本数为3
  • --set resources.requests.memory=512Mi: 设置内存请求为512MB
  • --set resources.limits.memory=1Gi: 设置内存限制为1GB
  • --set memcached.maxItemMemory=512: 设置Memcached单条数据最大大小为512MB
  • --set memcached.maxConnections=8192: 设置最大连接数为8192
  1. 查看Helm发布状态:
bash
helm status memcached
  1. 查看Pod和Service:
bash
kubectl get pods -l app.kubernetes.io/name=memcached
kubectl get services -l app.kubernetes.io/name=memcached
  1. 访问Memcached服务:
bash
# 获取Memcached密码
export MEMCACHED_PASSWORD=$(kubectl get secret --namespace default memcached -o jsonpath="{.data.memcached-password}" | base64 -d)

# 访问Memcached服务
kubectl run --rm --tty -i --restart='Never' --image docker.io/bitnami/memcached:1.6.21-debian-11-r114 --namespace default memcached-client -- \
  sh -c "printf 'stats\nquit' | nc memcached 11211"
  1. 升级Memcached:
bash
helm upgrade memcached bitnami/memcached --set replicaCount=5
  1. 删除Memcached:
bash
helm delete memcached

部署最佳实践

资源配置建议

部署规模CPU请求CPU限制内存请求内存限制Memcached内存分配最大连接数
小型100m500m256Mi512Mi256MB2048
中型200m1512Mi1Gi512MB4096
大型500m21Gi2Gi1024MB8192
超大型142Gi4Gi2048MB16384

监控配置

在Kubernetes环境中,建议集成Prometheus和Grafana监控:

  1. 部署Memcached Exporter:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: memcached-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: memcached-exporter
  template:
    metadata:
      labels:
        app: memcached-exporter
    spec:
      containers:
      - name: memcached-exporter
        image: prom/memcached-exporter:latest
        ports:
        - containerPort: 9150
        args:
        - --memcached.address=memcached-cluster:11211
---
apiVersion: v1
kind: Service
metadata:
  name: memcached-exporter
spec:
  selector:
    app: memcached-exporter
  ports:
  - port: 9150
    targetPort: 9150
  type: ClusterIP
  1. 配置Prometheus ServiceMonitor:
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: memcached-monitor
spec:
  selector:
    matchLabels:
      app: memcached-exporter
  endpoints:
  - port: 9150
    interval: 30s

常见问题(FAQ)

Q1: Docker部署Memcached时如何持久化数据?

A1: Memcached是内存数据库,本身不支持持久化。如果需要持久化,可以考虑使用第三方工具如Memcachedb或结合客户端实现数据持久化,或者使用带有持久化功能的替代方案如Redis。

Q2: Kubernetes中如何实现Memcached的自动扩缩容?

A2: 可以使用Horizontal Pod Autoscaler (HPA) 基于CPU或内存使用率进行自动扩缩容。对于分布式缓存集群,建议结合应用层的缓存客户端实现一致性哈希,确保扩缩容时数据分布均匀。

Q3: 如何在Kubernetes中配置Memcached的高可用?

A3: 可以通过以下方式实现高可用:

  1. 部署多个Memcached实例,使用StatefulSet保证稳定的网络标识
  2. 应用层实现一致性哈希,确保请求分发到不同实例
  3. 结合监控系统,及时发现并替换故障实例
  4. 使用Readiness和Liveness探针检测实例健康状态

Q4: Docker部署的Memcached如何查看日志?

A4: 使用Docker日志命令查看容器输出:

bash
docker logs memcached
docker logs -f memcached  # 实时查看日志

Q5: Helm部署Memcached时如何自定义配置?

A5: 可以通过以下方式自定义配置:

  1. 使用--set参数在命令行指定配置项
  2. 创建自定义values.yaml文件,包含所需配置
  3. 使用helm install -f values.yaml应用自定义配置
  4. 常见可配置项包括副本数、资源限制、Memcached参数等