{"id":857,"date":"2026-03-10T01:31:54","date_gmt":"2026-03-10T01:31:54","guid":{"rendered":"https:\/\/opshub.com.cn\/?p=857"},"modified":"2026-03-10T09:24:43","modified_gmt":"2026-03-10T09:24:43","slug":"k8s%e9%83%a8%e7%bd%b2redis-sentinel%e5%93%a8%e5%85%b5%e7%9a%84%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/opshub.com.cn\/?p=857","title":{"rendered":"k8s\u90e8\u7f72redis sentinel(\u54e8\u5175)\u7684\u5b9e\u73b0"},"content":{"rendered":"\n<p>Dockerfile:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM redis:latest\nWORKDIR \/app\nCOPY *.conf conf\/\nCOPY run.sh .\nRUN chmod +x run.sh\nCMD \/app\/run.sh<\/code><\/pre>\n\n\n\n<p>redis.conf:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bind 0.0.0.0\ndaemonize yes\nlogfile \"\/var\/log\/redis.log\"\nmasterauth 123456\nrequirepass 123456\nappendonly yes<\/code><\/pre>\n\n\n\n<p>sentinel.conf:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bind 0.0.0.0\nport 26379\nsentinel monitor redis-master redis-0.redis 6379 2\nsentinel auth-pass redis-master 123456\nsentinel down-after-milliseconds redis-master 10000\nsentinel resolve-hostnames yes<\/code><\/pre>\n\n\n\n<p>sentinel resolve-hostnames \u4e00\u5b9a\u8981\u663e\u793a\u5f00\u542f\uff0c\u5426\u5219\uff1a<\/p>\n\n\n\n<p>\u9ed8\u8ba4\u503c\u662fNO\uff0csentinel\u4e0d\u89e3\u6790\u4e3b\u673a\u540d\uff0c\u4f1a\u628aredis-0.redis\u5f53\u4f5cIP\u5904\u7406\u2014\u2014\u65e0\u6cd5\u89e3\u6790\uff0c\u8fd9\u79cd\u60c5\u51b5\u5728docker bridge\u7f51\u7edc\u3001kubernetes service\u540d\u79f0\u4ee5\u53ca\u8de8\u4e3b\u673a\u90e8\u7f72\u4e2d\u6781\u6613\u51fa\u73b0\u3002<\/p>\n\n\n\n<p>run.sh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\npod_seq=$(echo $POD_NAME |awk -F'-' '{print $2}')\nif &#91;&#91; $pod_seq -gt 0 ]];then\n  sed -i '\/^slaveof \/d' \/app\/conf\/redis.conf\n  echo \"slaveof redis-0.redis 6379\" >>\/app\/conf\/redis.conf\nfi\nredis-server \/app\/conf\/redis.conf\nsleep 15\nredis-sentinel \/app\/conf\/sentinel.conf &amp;\ntail -f \/var\/log\/redis.log<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t redis-sentinel:latest .\ndocker save redis-sentinel:latest |gzip -9 &gt;redis-sentinel.img.gz\nfor i in node1 node2;do scp redis-sentinel.img.gz $i:\/root;done\nfor i in node1 node2;do ssh $i \"docker load -i \/root\/redis-sentinel.img.gz\";done<\/code><\/pre>\n\n\n\n<p>redis-sentinel.yml:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Namespace\nmetadata:\n  name: redis-ns\n---\napiVersion: apps\/v1\nkind: StatefulSet\nmetadata:\n  name: redis\n  namespace: redis-ns\nspec:\n  serviceName: redis\n  selector:\n    matchLabels:\n      app: redis\n  replicas: 3\n  template:\n    metadata:\n      labels:\n        app: redis\n    spec:\n      nodeSelector:\n        productLine: redis-ns\n        area: wuhan\n      restartPolicy: Always\n      containers:\n        - name: redis\n          image: redis_sentinel:latest\n          imagePullPolicy: IfNotPresent\n          env:\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n          livenessProbe:\n            tcpSocket:\n              port: 6379\n            initialDelaySeconds: 3\n            periodSeconds: 5\n          readinessProbe:\n            tcpSocket:\n              port: 6379\n            initialDelaySeconds: 3\n            periodSeconds: 5\n          ports:\n            - containerPort: 6379\n          resources:\n            requests:\n              memory: 256Mi\n              cpu: 50m\n            limits:\n              memory: 256Mi\n              cpu: 200m\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: redis\n  namespace: redis-ns\nspec:\n  clusterIP: None #\u65e0\u5934\u670d\u52a1\uff0c\u8fd4\u56de\u6240\u6709pod\u7684IP\n  ports:\n    - name: redis\n      port: 26379\n      targetPort: 26379\n  selector:\n    app: redis\n\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f redis-sentinel.yml<\/code><\/pre>\n\n\n\n<p>k8s\u5176\u5b83\u547d\u4ee4\u7a7a\u95f4\u7684java\u8fdb\u7a0b\u8fde\u63a5redis\u54e8\u5175<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u6838\u5fc3\u539f\u7406<\/h3>\n\n\n\n<p>Redis \u54e8\u5175\u7684\u5de5\u4f5c\u673a\u5236\u662f\uff1a\u5ba2\u6237\u7aef\u5148\u8fde\u63a5\u54e8\u5175\u96c6\u7fa4\u83b7\u53d6\u4e3b\u8282\u70b9\u5730\u5740\uff0c\u518d\u4e0e\u4e3b\u8282\u70b9\u5efa\u7acb\u8fde\u63a5\u3002\u5728 K8s \u4e2d\uff0c\u8de8\u547d\u540d\u7a7a\u95f4\u8bbf\u95ee\u9700\u8981\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e3a Redis \u54e8\u5175\u96c6\u7fa4\u521b\u5efa<strong>\u65e0\u5934\u670d\u52a1\uff08Headless Service\uff09<\/strong>\uff08\u4fdd\u8bc1\u80fd\u89e3\u6790\u5230\u6240\u6709\u54e8\u5175 Pod \u7684 IP\uff09\uff1b<\/li>\n\n\n\n<li>Java \u5ba2\u6237\u7aef\u914d\u7f6e\u54e8\u5175\u5730\u5740\u65f6\uff0c\u4f7f\u7528 K8s \u8de8\u547d\u540d\u7a7a\u95f4\u7684\u670d\u52a1\u57df\u540d\uff1b<\/li>\n\n\n\n<li>\u786e\u4fdd\u547d\u540d\u7a7a\u95f4\u4e4b\u95f4\u7684\u7f51\u7edc\u7b56\u7565\u5141\u8bb8\u901a\u4fe1\uff08\u5982\u6ca1\u6709\u7981\u7528\u8de8\u547d\u540d\u7a7a\u95f4\u8bbf\u95ee\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8c\u3001\u524d\u63d0\u6761\u4ef6<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Redis \u54e8\u5175\u96c6\u7fa4\u5df2\u90e8\u7f72\u5728 K8s \u4e2d\uff08\u5047\u8bbe\u547d\u540d\u7a7a\u95f4\u4e3a <code>redis-ns<\/code>\uff09\uff1b<\/li>\n\n\n\n<li>Java \u5e94\u7528\u6240\u5728\u547d\u540d\u7a7a\u95f4\uff08\u5982 <code>app-n<\/code>s\uff09\u80fd\u8bbf\u95ee <code>redis-n<\/code>s \u7684 Pod\/Service\uff1b<\/li>\n\n\n\n<li>Java \u9879\u76ee\u5f15\u5165 Redis \u5ba2\u6237\u7aef\uff08\u4ee5\u4e3b\u6d41\u7684 <code>lettuce<\/code> \u6216 <code>jedis<\/code> \u4e3a\u4f8b\uff0c\u63a8\u8350 lettuce\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<p>Java \u5ba2\u6237\u7aef\u914d\u7f6e\uff08\u8de8\u547d\u540d\u7a7a\u95f4\u8fde\u63a5\uff09<\/p>\n\n\n\n<p>1\u3001\u4f9d\u8d56\u5f15\u5165(pom.yml)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Spring Data Redis \u6838\u5fc3\u4f9d\u8d56 --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-data-redis&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n&lt;!-- \u5982\u9700\u4f7f\u7528 jedis\uff0c\u6392\u9664 lettuce \u5e76\u5f15\u5165 jedis --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;redis.clients&lt;\/groupId&gt;\n    &lt;artifactId&gt;jedis&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.apache.commons&lt;\/groupId&gt;\n    &lt;artifactId&gt;commons-pool2&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p>2\u3001\u914d\u7f6e\u6587\u4ef6(application.yml)<\/p>\n\n\n\n<p>\u6838\u5fc3\u662f <code>spring.redis.sentinel.nodes<\/code> \u914d\u7f6e\u4e3a K8s \u8de8\u547d\u540d\u7a7a\u95f4\u7684\u54e8\u5175\u670d\u52a1\u57df\u540d\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring:\n  redis:\n    # Redis \u5bc6\u7801\uff08\u5982\u679c\u6709\uff09\n    password: your-redis-password\n    # \u6570\u636e\u5e93\u7d22\u5f15\uff08\u9ed8\u8ba4 0\uff09\n    database: 0\n    # \u54e8\u5175\u914d\u7f6e\n    sentinel:\n      # \u54e8\u5175\u76d1\u63a7\u7684\u4e3b\u8282\u70b9\u540d\u79f0\uff08\u5fc5\u987b\u548c Redis \u54e8\u5175\u914d\u7f6e\u7684\u4e00\u81f4\uff09\n      master: mymaster\n      # \u8de8\u547d\u540d\u7a7a\u95f4\u7684\u54e8\u5175\u5730\u5740\uff1a\u670d\u52a1\u540d.\u547d\u540d\u7a7a\u95f4.svc.cluster.local:\u7aef\u53e3\n      # \u591a\u4e2a\u54e8\u5175\u7528\u9017\u53f7\u5206\u9694\uff08\u65e0\u5934\u670d\u52a1\u4f1a\u89e3\u6790\u5230\u6240\u6709\u54e8\u5175 Pod IP\uff09\n      nodes: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">redis-sentinel.redis-ns.svc.cluster.local:26379<\/mark>\n    # \u8fde\u63a5\u6c60\u914d\u7f6e\uff08\u6309\u9700\u8c03\u6574\uff09\n    lettuce:\n      pool:\n        max-active: 8   # \u6700\u5927\u8fde\u63a5\u6570\n        max-idle: 8     # \u6700\u5927\u7a7a\u95f2\u8fde\u63a5\n        min-idle: 0     # \u6700\u5c0f\u7a7a\u95f2\u8fde\u63a5\n        max-wait: -1ms  # \u6700\u5927\u7b49\u5f85\u65f6\u95f4\uff08-1 \u8868\u793a\u65e0\u9650\u5236\uff09\n    # \u5982\u679c\u7528 jedis\uff0c\u66ff\u6362 lettuce \u4e3a jedis \u5373\u53ef\n    # jedis:\n    #   pool:\n    #     max-active: 8\n    #     max-idle: 8\n    #     min-idle: 0\n    #     max-wait: -1ms<\/code><\/pre>\n\n\n\n<p>\u5982\u679c\u662f\u7eaf Java \u9879\u76ee\uff08\u65e0 Spring Boot\uff09\uff0c\u4ee5 lettuce \u4e3a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import io.lettuce.core.RedisClient;\nimport io.lettuce.core.RedisURI;\nimport io.lettuce.core.api.StatefulRedisConnection;\nimport io.lettuce.core.api.sync.RedisCommands;\nimport io.lettuce.core.sentinel.api.StatefulRedisSentinelConnection;\n\npublic class RedisSentinelClient {\n    public static void main(String&#91;] args) {\n        \/\/ 1. \u914d\u7f6e\u54e8\u5175\u5730\u5740\uff08\u8de8\u547d\u540d\u7a7a\u95f4\u57df\u540d\uff09\n        RedisURI sentinelUri = RedisURI.builder()\n                .withSentinel(\"<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">redis-sentinel.redis-ns.svc.cluster.local<\/mark>\", 26379)\n                .withSentinelMasterId(\"<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">redis-master<\/mark>\")  \/\/ \u54e8\u5175\u76d1\u63a7\u7684\u4e3b\u8282\u70b9\u540d\u79f0\n                .withPassword(\"<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">123456<\/mark>\".toCharArray())  \/\/ Redis \u5bc6\u7801\n                .withDatabase(0)\n                .build();\n\n        \/\/ 2. \u521b\u5efa\u54e8\u5175\u5ba2\u6237\u7aef\n        RedisClient client = RedisClient.create(sentinelUri);\n        StatefulRedisSentinelConnection&lt;String, String&gt; sentinelConnection = client.connectSentinel();\n        \n        \/\/ 3. \u83b7\u53d6\u4e3b\u8282\u70b9\u8fde\u63a5\n        StatefulRedisConnection&lt;String, String&gt; connection = sentinelConnection.master(\"<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">redis-master<\/mark>\");\n        RedisCommands&lt;String, String&gt; commands = connection.sync();\n\n        \/\/ 4. \u6d4b\u8bd5\u8fde\u63a5\n        try {\n            String result = commands.set(\"test-key\", \"hello-k8s-redis-sentinel\");\n            System.out.println(\"Set \u7ed3\u679c\uff1a\" + result);\n            System.out.println(\"Get \u7ed3\u679c\uff1a\" + commands.get(\"test-key\"));\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            \/\/ 5. \u5173\u95ed\u8fde\u63a5\n            connection.close();\n            sentinelConnection.close();\n            client.shutdown();\n        }\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Dockerfile: redis.conf: sentinel.conf: sentinel resolve-hostnames \u4e00\u5b9a\u8981\u663e\u793a\u5f00\u542f\uff0c\u5426\u5219\uff1a \u9ed8\u8ba4\u503c\u662fNO\uff0csentinel\u4e0d\u89e3\u6790\u4e3b\u673a\u540d\uff0c\u4f1a\u628aredis-0.redis\u5f53\u4f5cIP\u5904\u7406\u2014\u2014\u65e0\u6cd5\u89e3\u6790\uff0c\u8fd9\u79cd\u60c5\u51b5\u5728docker bridge\u7f51\u7edc\u3001kubernetes service\u540d\u79f0\u4ee5\u53ca\u8de8\u4e3b\u673a\u90e8\u7f72\u4e2d\u6781\u6613\u51fa\u73b0\u3002 run.sh: redis-sentinel.yml: k8s\u5176\u5b83\u547d\u4ee4\u7a7a\u95f4\u7684java\u8fdb\u7a0b\u8fde\u63a5redis\u54e8\u5175 \u4e00\u3001\u6838\u5fc3\u539f\u7406 Redis \u54e8\u5175\u7684\u5de5\u4f5c\u673a\u5236\u662f\uff1a\u5ba2\u6237\u7aef\u5148\u8fde\u63a5\u54e8\u5175\u96c6\u7fa4\u83b7\u53d6\u4e3b\u8282\u70b9\u5730\u5740\uff0c\u518d\u4e0e\u4e3b\u8282\u70b9\u5efa\u7acb\u8fde\u63a5\u3002\u5728 K8s \u4e2d\uff0c\u8de8\u547d\u540d\u7a7a\u95f4\u8bbf\u95ee\u9700\u8981\uff1a \u4e8c\u3001\u524d\u63d0\u6761\u4ef6 Java \u5ba2\u6237\u7aef\u914d\u7f6e\uff08\u8de8\u547d\u540d\u7a7a\u95f4\u8fde\u63a5\uff09 1\u3001\u4f9d\u8d56\u5f15\u5165(pom.yml) 2\u3001\u914d\u7f6e\u6587\u4ef6(application.yml) \u6838\u5fc3\u662f spring.redis.sentinel.nodes \u914d\u7f6e\u4e3a K8s \u8de8\u547d\u540d\u7a7a\u95f4\u7684\u54e8\u5175\u670d\u52a1\u57df\u540d\uff1a \u5982\u679c\u662f\u7eaf Java \u9879\u76ee\uff08\u65e0 Spring Boot\uff09\uff0c\u4ee5 lettuce \u4e3a\u4f8b\uff1a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-857","post","type-post","status-publish","format-standard","hentry","category-dockerkubernetes"],"_links":{"self":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=857"}],"version-history":[{"count":6,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/857\/revisions"}],"predecessor-version":[{"id":875,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=\/wp\/v2\/posts\/857\/revisions\/875"}],"wp:attachment":[{"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opshub.com.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}