3

我创建了一个 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

无头服务

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

负载均衡器

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

配置图

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"

存储类

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: redis-storage
provisioner: kubernetes.io/gce-pd

入口

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


4

1 回答 1

0

pod遗嘱中的每个人StatefulSet都需要有一个service链接。

该服务将需要创建:

  selector:
    statefulset.kubernetes.io/pod-name: <POD_NAME>

然后,您将能够设置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            
...            

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

于 2019-08-05T15:06:21.763 回答