Rancher 2.x ClusterIP 和服务发现
在 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。
当我们部署好后,可以看到访问端口显示的n/a。
我们在 master 节点上利用 curl 访问 容器的IP。
我们对容器进行重新部署,这个时候你会发现,ip 地址变了,我们不可能每一次重新部署后都去关注这个 ip 的变化,所以就需要利用到服务发现了。
当我们创建好 workloads 后,其实 rancher 已经帮助我们创建好了服务发现,我们点击服务发现。
在其中我们可以看到 counterservice。
在这里简单说一下服务发现的机制,在 Rancher 2.4 版本以后使用 k8s-coredns 作为服务发现的基础, serivce 后会自动增加一条解析记录,如果在同一 namespace 下,我们直接可以在容器内访问 counterservice。不同空间需要利用 service_name.namespace 进行访问。
我们进入my-go-api 容器中可以试验一下。
这一步需要安装 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 名字,将改造后的代码上传至服务器,重新部署。
我们直接可以点击克隆,然后新建一个叫做 demo 的命名空间,并且将名称改为counterservice2。
当我们在浏览器内输入 counterservce2 的时候会发现报错了。
我们现在输入 counterservce2.demo 就可以访问另外一个命名空间下的项目了
这是服务发现的基本机制,如果不需要做健康检查的话,我们完全可以直接用 k8s 来做服务发现。