K8s获取NodePort

本文介绍如何使用Kubernetes自动分配NodePort,并通过Go语言示例代码展示如何从Kubernetes API获取分配的具体端口号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

K8s获取NodePort

(金庆的专栏 2018.9)

将服务用NodePort暴露到外网,为避免端口冲突,不指定NodePort,
而是让k8s自动选择一个端口。

$ cat get_node_port.yaml
kind: Service
apiVersion: v1
metadata:
  name: jq-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
$ kubectl apply -f get_node_port.yaml
service "jq-service" configured
$ kubectl describe svc/jq-service
Name:                     jq-service
Namespace:                default
Labels:                   <none>
Annotations:              kubectl...
Selector:                 app=MyApp
Type:                     NodePort
IP:                       10.104.228.187
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32115/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

可以看到k8s分配了NodePort 32115。

然后需要获取这个动态的NodePort,以通知客户端连接该端口。

cat main.go
package main

import (
    "context"
    "fmt"
    "log"
    "io/ioutil"

    "github.com/ghodss/yaml"
    "github.com/ericchiang/k8s"
    corev1 "github.com/ericchiang/k8s/apis/core/v1"
)

func main() {
    data, err := ioutil.ReadFile("config")
    if err != nil {
        panic(err)
    }

    // Unmarshal YAML into a Kubernetes config object.
    var config k8s.Config
    if err := yaml.Unmarshal(data, &config); err != nil {
        panic(err)
    }

    client, err := k8s.NewClient(&config)
    // client, err := k8s.NewInClusterClient()
    if err != nil {
        log.Fatal(err)
    }

    var svc corev1.Service
    if err := client.Get(context.Background(), "default", "jq-service", &svc); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%d\n", *svc.Spec.Ports[0].NodePort)
}

运行时需要复制config: cp ~/.kube/config .

### Kubernetes 中 NodePort 和 LoadBalancer 服务类型的比较 #### NodePort 类型的服务 NodePort 是一种允许外部访问集群内服务的方式。它通过在每个节点上打开一个静态端口来实现这一点,使得可以通过任何集群节点的 IP 地址加上该静态端口号来访问服务[^1]。 对于希望利用现有网络基础设施或需要更细粒度控制流量路由的应用程序来说,NodePort 提供了一种简单而灵活的方法。然而,这种方法通常不适合生产环境中的大规模部署,因为管理大量开放端口可能会变得复杂,并且安全性较低。 ```yaml apiVersion: v1 kind: Service metadata: name: example-service-nodeport spec: type: NodePort ports: - port: 80 targetPort: 9376 nodePort: 30080 # 自定义范围内的可用端口 (默认自动分配) selector: app: MyApp ``` #### LoadBalancer 类型的服务 相比之下,LoadBalancer 则提供了一个更高层次抽象级别的解决方案。当创建此类别的服务时,云提供商将配置并关联一个外部负载均衡器到指定的服务实例上。这不仅简化了对外部世界的暴露过程,还提供了诸如健康检查、SSL 终止等功能支持。 值得注意的是,在某些环境中(如本地数据中心),可能无法直接使用这种类型;而在其他情况下,则可以结合自定义硬件设备或其他第三方工具一起工作以达到相同效果。此外,不同平台上的具体行为也可能有所差异,因此建议查阅特定于所选云服务商的相关文档获取更多信息[^3]。 ```yaml apiVersion: v1 kind: Service metadata: name: example-service-loadbalancer spec: type: LoadBalancer ports: - protocol: TCP port: 80 targetPort: 9376 selector: app: MyApp ``` 这两种方式各有优缺点,选择哪一种取决于具体的业务需求和技术栈偏好等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值