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,以通知客户端连接该端口。
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 .`