V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ydongd
V2EX  ›  Kubernetes

新手,请教一个 k8s 的问题

  •  
  •   ydongd · 46 天前 · 1862 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。
    中心服 A ,对外提供服务的 B 。B 需要将自己链接到 A ,同时需要对外提供服务。用户先到 A 去拿取 B 的地址在链接到 B 。

    A 可以部署多个,A 服务功能是一样的,采用 deployment 部署。对外访问用 service ,用户访问任意一个都行。

    B 也需要部署多个,虽然功能是一样,但是有服务的逻辑地址,又算是不同的服务。采用 statefulSet 部署,由 podID 来生成逻辑地址。

    类似于官方的案列:部署多个 mysql 服务。但是教程只到了 k8s 集群内通过 ip 来区分并访问不同的 mysql 。对于外部的访问怎么区分访问呢?

    问题:
    service 的方式是将一批 pod 统一暴露出去了,不能做到定向访问。怎么将 statefulSet 部署的 pod 通过外部访问,且用户能选择访问那一个 pod ?
    第 1 条附言  ·  46 天前
    假设部署 3 个 B ,要把他们代理到本地网络。那就需要 3 个端口来分别代理( ip 地址是一样的),通过不同的端口来访问不同的 B 服务。
    第 2 条附言  ·  45 天前
    Mac mini. docker 桌面版,k8s 是 docker 自带的。

    之前安装的 minikube ,但是用 service 外部不能访问。用桌面版后能访问。

    不知道是不是安装的方式版本有什么问题,使用一些外部访问 pod 的方式仍然不是访问。
    22 条回复    2022-07-13 16:29:22 +08:00
    prodan
        1
    prodan  
       46 天前
    service 本质上是一个负载均衡,据我所知是做不到指定用户访问指定的 pod ,你应该从你的程序设计上解决。
    hwdef
        2
    hwdef  
       46 天前
    headless service
    offswitch
        3
    offswitch  
       46 天前
    你需要试试 istio ,istio 可以实现你需要的需求。
    ydongd
        4
    ydongd  
    OP
       46 天前
    @hwdef headless service 好像也是集群内部访问的,集群外不能访问
    Tinet
        5
    Tinet  
       46 天前   ❤️ 1
    两个步骤:
    1. 在集群外解析 headless service 域名地址
    2. 将 clusterIP 与集群外网络打通
    ydongd
        6
    ydongd  
    OP
       46 天前
    @Tinet 能详细说说这两个步骤吗?
    Tinet
        7
    Tinet  
       46 天前
    @ydongd 域名解析不说了,网络打通给你个关键词 calico bgp
    April5
        8
    April5  
       46 天前
    前置一个网关,通过 zk 或 etcd 维护服务 B ,网关订阅服务 B 的地址信息,网关将指定消息代理到相应的 B
    aragakiyuii
        9
    aragakiyuii  
       46 天前 via iPhone
    代理到 {podName}.{headlessServiceName}
    buffzty
        10
    buffzty  
       46 天前
    mysql-0.mysql.svc.cluster.local:3306
    Jiki
        11
    Jiki  
       46 天前 via iPhone
    最近也遇到这个问题,关注一下
    ydongd
        12
    ydongd  
    OP
       45 天前
    @aragakiyuii @buffzty 我用的 docker 自带的 k8s , 好像代理不了。之前用 minikube 普通的 service 都转发不出来。用的 mac 。 可能新手就需要踩这些坑吧
    ydongd
        13
    ydongd  
    OP
       45 天前
    @buffzty k8s 集群内部可以访问,外边不行
    aragakiyuii
        14
    aragakiyuii  
       45 天前
    可以在集群里面部署一个 nginx ,配置好 TCP 转发规则,转发至 {podName}.{headlessServiceName},然后可以通过 hostPort 或者 nodePort 形式将 nginx 暴露到集群外部
    qianhun
        15
    qianhun  
       45 天前
    用 statefulset 模式,然后通过脚本获取主机名,并修改应用服务的端口,在通过 hostNetwork 映射到宿主机上
    ydongd
        16
    ydongd  
    OP
       45 天前
    @qianhun 不知到啥原因 这种方式也不行
    apiVersion: v1
    kind: Pod
    metadata:
    name: server-pod
    spec:
    hostNetwork: true
    dnsPolicy: ClusterFirstWithHostNet
    containers:
    - name: server
    image: yddeng/server:1.1
    command: ["./server"]
    args: ["server-0","127.0.0.1:9563"]
    qianhun
        17
    qianhun  
       45 天前
    用 statefulset 控制器,启动一个 initcontainer ,写一个 shell 脚本,判断主机名,如果是 server-0 ,port 为 9563 ,如果是 server-1 ,port 为 9564 ,然后把具体的执行命令输出到启动脚本里,给你的 server pod 执行,不要在 args 里面写参数,在 args 里写参数只能启动一个 pod
    ydongd
        18
    ydongd  
    OP
       45 天前
    @qianhun 我知道你这种方式,我这里只是做了一个测试,结果仍然是不能访问
    qianhun
        19
    qianhun  
       45 天前
    不能访问,有什么报错么
    1.看看 pod 是否运行正常,日志有报错没有
    2.到宿主机上看看端口启动了没
    3.防火墙是否关闭
    ydongd
        20
    ydongd  
    OP
       45 天前
    @qianhun 248244142 我 QQ 。我想请教一下,这个上面回复太慢了
    yyttrr
        21
    yyttrr  
       44 天前
    研究一下 ingress ,集群入口有很多种
    lostsquirrelX
        22
    lostsquirrelX  
       32 天前
    请描述一个你想要做什么,而不是你是怎么做的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1028 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:21 · PVG 05:21 · LAX 14:21 · JFK 17:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.