Rancher 2.x ClusterIP 和服务发现

Docker & K8S 560 字

在 ClusterIP 模式下应用只能在集群内部进行访问,外部(公网)无法访问它,例如 MySQL,Redis 这些服务,外网是不许要进行访问的,这个时候就可以选择这个模式。

现在我们来模拟这个场景,例如现在访问 goapi.maksim.wbesite 现在显示的是 hellword,如果我们想在内网增加一个技术服务,显示一共有多少人访问了当前接口。

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
    "sync"
)

type Counter struct {
    counter int
    sync.Mutex
}

func NewCounter() *Counter {
    return &Counter{counter: 0}
}
func (receiver *Counter) Add() {
    receiver.Lock()
    defer receiver.Unlock()
    receiver.counter = receiver.counter + 1
}

func (receiver *Counter) Get() int {
    receiver.Lock()
    defer receiver.Unlock()
    return receiver.counter

}

type Response struct {
    Count int
}

func main() {
    r := gin.Default()
    counter := NewCounter()
    r.Handle("GET", "/count", func(context *gin.Context) {
        counter.Add()
        context.JSON(http.StatusOK, &Response{Count: counter.Get()})
    })
    err := r.Run(":8080")

    if err != nil {
        log.Fatalln(err)
    }
}

代码非常简单,我们继续使用前面讲到的方法将其部署的 k8s 中,在这里就不赘述了,这里主要关注网络模式选择了集群IP,并且暴露的端口号是 80。

2023-03-04T13:49:46.png

当我们部署好后,可以看到访问端口显示的n/a。

2023-03-04T13:50:07.png

我们在 master 节点上利用 curl 访问 容器的IP。

2023-03-04T13:50:37.png

我们对容器进行重新部署,这个时候你会发现,ip 地址变了,我们不可能每一次重新部署后都去关注这个 ip 的变化,所以就需要利用到服务发现了。

2023-03-04T13:50:47.png

当我们创建好 workloads 后,其实 rancher 已经帮助我们创建好了服务发现,我们点击服务发现。

2023-03-04T13:51:01.png

在其中我们可以看到 counterservice。

在这里简单说一下服务发现的机制,在 Rancher 2.4 版本以后使用 k8s-coredns 作为服务发现的基础, serivce 后会自动增加一条解析记录,如果在同一 namespace 下,我们直接可以在容器内访问 counterservice。不同空间需要利用 service_name.namespace 进行访问。

2023-03-04T13:51:14.png

我们进入my-go-api 容器中可以试验一下。

2023-03-04T13:51:34.png

这一步需要安装 curl 工具,具体方法请自查百度。这样一来就证明可以通讯了,接下来,我们改造 my-go-api。

r.Handle("GET", "/", func(context *gin.Context) {
        host := context.Query("host")
        if host == "" {
            context.JSON(400, gin.H{"error": "no host!"})
            return
        }
        resp, err := http.Get("http://" + host + "/count")
        if err != nil {
            context.JSON(400, gin.H{"error": err.Error()})
            return
        }
        body, err := io.ReadAll(resp.Body)
        if err != nil {
            context.JSON(400, gin.H{"error": err.Error()})
            return
        }
        context.String(200, "hello world!"+string(body))
    })

我们来接收一个 host,这个 host 就是 service 名字,将改造后的代码上传至服务器,重新部署。

2023-03-04T13:51:54.png

我们直接可以点击克隆,然后新建一个叫做 demo 的命名空间,并且将名称改为counterservice2。

2023-03-04T13:52:08.png

2023-03-04T13:52:21.png

2023-03-04T13:52:31.png

当我们在浏览器内输入 counterservce2 的时候会发现报错了。

2023-03-04T13:52:40.png

我们现在输入 counterservce2.demo 就可以访问另外一个命名空间下的项目了

2023-03-04T13:53:01.png

这是服务发现的基本机制,如果不需要做健康检查的话,我们完全可以直接用 k8s 来做服务发现。

maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见