将 Redis 集群公开 - 带有 kubernetes statefulset 到互联网

Dav*_*ien 5 redis kubernetes devops kubernetes-statefulset

我创建了一个有状态集,将 Redis 映像部署到 kubernetes 上的 GCP。我面临的挑战是使用单个域名公开它。这样可以按以下顺序访问 Pod - redis.com/first、redis.com/second、redis.com/third

简单的图表显示了我想要实现的结构类型

这是 YAML 文件

有状态集

kind: StatefulSet
metadata:
  name: app-redis
spec:
  selector:
    matchLabels:
      app: apprenticeship-redis
  serviceName: 'redis-service'
  replicas: 3
  template:
    metadata:
      labels:
        app: app-redis
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: app-redis
          image: redis
          args:
            - /etc/redis/redis.conf
          volumeMounts:
            - mountPath: /etc/redis
              name: redis-config
              readOnly: false
            - name: redis-storage
              mountPath: /data
              readOnly: false
          resources:
            requests:
              cpu: 50m
              memory: 128Mi
            limits:
              cpu: 150m
              memory: 256Mi
          ports:
            - containerPort: 6379
              name: redis
          livenessProbe:
            exec:
              command: ['redis-cli', 'ping']
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 2
      volumes:
        - name: redis-config
          configMap:
            name: redis-config
  volumeClaimTemplates:
    - metadata:
        name: redis-storage
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
Run Code Online (Sandbox Code Playgroud)

无头服务

apiVersion: v1
kind: Service
metadata:
  labels:
    app: app-redis
  name: redis-service
  namespace: default
spec:
  ports:
    - name: server-port
      port: 80
      protocol: TCP
      targetPort: 6379
  clusterIP: None
  selector:
    statefulset.kubernetes.io/pod-name: app-redis-0
Run Code Online (Sandbox Code Playgroud)

负载均衡器

apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis-service
  name: app-redis
spec:
  externalTrafficPolicy: Local
  ports:
  - port: 80
    protocol: TCP
    targetPort: 6379
  selector:
    app: app-redis
  type: LoadBalancer
  loadBalancerIP: xx.xx.xx.xxx
status:
  loadBalancer:
    ingress:
    - ip: xx.xx.xx.xxx

Run Code Online (Sandbox Code Playgroud)

配置图

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
  namespace: default
data:
  redis.conf: |
    dbfilename "dump.rdb"
    dir /data
    save 3600 1
    save 300 10
    save 60 100
    appendonly yes
    appendfilename "appendonly.aof"
Run Code Online (Sandbox Code Playgroud)

存储等级

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: redis-storage
provisioner: kubernetes.io/gce-pd
Run Code Online (Sandbox Code Playgroud)

入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: redis-ingress
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'false'
spec:
  rules:
    - host: app-redis.tk
      http:
        paths:
          - path: /
            backend:
              serviceName: app-redis
              servicePort: 80


Run Code Online (Sandbox Code Playgroud)

Cro*_*rou 0

中的每个pod内容都StatefulSet需要有一个service链接。

该服务需要通过以下方式创建:

  selector:
    statefulset.kubernetes.io/pod-name: <POD_NAME>
Run Code Online (Sandbox Code Playgroud)

然后您将能够设置ingress并使用它来根据以下内容重定向流量path

...
spec:
  rules:
  - http:
      paths:
        - path: /app-redis-0
          backend:
            serviceName: redis-service-0
            servicePort: 6379
        - path: /app-redis-1
          backend:
            serviceName: redis-service-1
            servicePort: 6379
        - path: /app-redis-2
          backend:
            serviceName: redis-service-2
            servicePort: 6379            
...            
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关在 Kubernetes 中公开 StatefulSetKubernetes NodePort vs LoadBalancer vs Ingress?我什么时候应该使用什么?