zoukankan      html  css  js  c++  java
  • Traefik 2.0 暴露 Redis(TCP) 服务

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484452&idx=1&sn=0a17b907b4b214b498eb99bacfefec0d&chksm=fdb90b39cace822fdd48a8e9499ccd53d4c53a11a464ad0be63235176e509342da0d5ec48a22&scene=178&cur_album_id=1319287026209947648#rd

    本文是来演示如何在 Kubernetes 下面通过 Traefik 暴露一个 TCP 服务的,这里我们以 Redis 为例。

    UDP的服务看这篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/15749641.html
    或者这篇:https://www.cnblogs.com/sanduzxcvbnm/p/15749677.html

    参考转载的文章内容经过实践操作
    k8s版本:1.20.12
    traefik版本:2.4.8

    部署 Redis

    为了演示方便,我们这里只部署单节点的 Redis,对于 Redis 集群模式并不是我们这里的重点,下面是我们部署使用的资源清单文件:(redis.yaml)

    # redis.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis
      namespace: test
    spec:
      selector:
        matchLabels:
            app: redis
      template:
        metadata:
          labels:
            app: redis
        spec:
          containers:
          - name: redis
            image: redis:6.2.6
            ports:
            - containerPort: 6379
              protocol: TCP
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: redis
      namespace: test
    spec:
      ports:
      - port: 6379
        targetPort: 6379
      selector:
        app: redis
    

    直接创建即可:

    $ kubectl apply -f redis.yaml
    

    暴露 TCP 服务

    由于 Traefik 中使用 TCP 路由配置需要 SNI,而 SNI 又是依赖 TLS 的,所以我们需要配置证书才行,但是如果没有证书的话,我们可以使用通配符 * 进行配置,我们这里创建一个 IngressRouteTCP 类型的 CRD 对象(前面我们就已经安装了对应的 CRD 资源):(ingressroute-redis.yaml)

    # cat ingressroute-redis.yaml
    
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRouteTCP
    metadata:
      name: redis
      namespace: test
    spec:
      entryPoints:
        - redis
      routes:
      - kind: Rule
        match: HostSNI(`*`)
        services:
          - name: redis
            port: 6379
    

    要注意的是这里的entryPoints部分,是根据我们启动的 Traefik 的静态配置中的 entryPoints 来决定的,在这里我们可以自己添加一个用于 Redis 的专门的入口点:

    # 这个文档内容做参考,不实际执行
    containers:
    - image: traefik:v2.0
      name: traefik-ingress-lb
      ports:
      - name: web
        containerPort: 80
        hostPort: 80
      - name: websecure
        containerPort: 443
        hostPort: 443
      # 如下三行是新增
      - name: redis
        containerPort: 6379
        hostPort: 6379
      - name: admin
        containerPort: 8080
      args:
      - --entrypoints.web.Address=:80
      - --entrypoints.websecure.Address=:443
      - --entrypoints.redis.Address=:6379 # 新增
      - --api.insecure=true
      - --providers.kubernetescrd
      - --api
      - --api.dashboard=true
      - --accesslog
    

    这里给入口点添加 hostPort 是为了能够通过节点的端口访问到服务

    我这里安装的traefik是使用kubeoperator安装k8s集群时选择的,对照上面的文件,修改步骤有两种,第一种是修改对应的yaml文件,第二种是通过kubepi进行修改

    修改对应的yaml文件

    通过kubepi进行修改


    创建上面的 IngressRouteTCP 对象:

    $ kubectl apply -f ingressroute-redis.yaml
    

    创建完成后,同样我们可以去 Traefik 的 Dashboard 页面上查看是否生效:


    然后我们配置一个域名解析到 Traefik 所在的节点,然后通过 6379 端口来连接 Redis 服务:

    $ redis-cli -h www.daniel.com -p 6379
    www.daniel.comm:6379> ping
    PONG
    www.daniel.com:6379> set hello world
    OK
    www.daniel.com:6379> get hello
    "world"
    www.daniel.com:6379>
    

    也能使用客户端进行连接

  • 相关阅读:
    从键盘输入一串数据,以“exit"结束输入,且输出数据。
    判断指定盘符下文件夹是否存在
    java 输出图形
    Object对象类
    java继承
    Java封装
    java环境搭建系列:JDK环境变量详细配置
    java环境搭建系列:JDK从下载安装到简单使用
    ORACLE常见错误代码的分析与解决
    Java与C++面向对象不同点
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/15745150.html
Copyright © 2011-2022 走看看