net.LookupSRV()查询k8s无头服务

net.LookupSRV()查询k8s无头服务

(金庆的专栏 2021.2)

如下创建 StatefulSet 和 Headless Service: test.yaml

apiVersion: v1
kind: Service
metadata:
  name: headless-svc
  labels:
    app: headless-svc
spec:
  ports:
  - port: 80
    name: aaaa
  - port: 20080
    name: bbbb
  selector:
    app: headless-pod
  clusterIP: None
  
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-test
spec:
  serviceName: headless-svc
  replicas: 3
  selector:
    matchLabels:
      app: headless-pod
  template:
    metadata:
      labels:
        app: headless-pod
    spec:
      containers:
      - name: myhttpd
        image: httpd
        ports:
        - containerPort: 80
        - containerPort: 20080

部署:

kubectl apply -f test.yaml

然后开一个 shell:

kubectl run mygolang -it --image golang -- bash
If you don't see a command prompt, try pressing enter.
root@mygolang:/go#

先装个 vim:

apt install vim

然后写个 golang 测试程序,向 DNS 查询 bbbb 服务的地址与端口:

root@mygolang:/jinqing# cat main.go
package main

import (
    "fmt"
    "github.com/davecgh/go-spew/spew"
    "net"
)

func main() {
    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc.default.svc.cluster.local")
    if err != nil {
        fmt.Printf("failed: %s\n", err)
    }
    fmt.Printf("cname: %s\n", cname)
    spew.Dump(addresses)
}
root@mygolang:/jinqing#

运行结果为:

cname: _bbbb._tcp.headless-svc.default.svc.cluster.local.
([]*net.SRV) (len=3 cap=4) {
 (*net.SRV)(0xc00000e220)({
  Target: (string) (len=58) "statefulset-test-0.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 }),
 (*net.SRV)(0xc00000e1e0)({
  Target: (string) (len=58) "statefulset-test-2.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 }),
 (*net.SRV)(0xc00000e200)({
  Target: (string) (len=58) "statefulset-test-1.headless-svc.default.svc.cluster.local.",
  Port: (uint16) 20080,
  Priority: (uint16) 0,
  Weight: (uint16) 33
 })
}

多次运行发现结果项次序固定,并没有按权重随机。

Service yaml 定义中,必须为每个端口命名,不然没法查询。

    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc.default.svc.cluster.local")

可利用默认域名后缀简写为

    cname, addresses, err := net.LookupSRV("bbbb", "tcp", "headless-svc")

输出相同。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值