1. 原理

有时,我们需要向外部暴露一些k8s集群的服务。这时,我们可以指定serviceport类型为nodePort来实现。例如k8s集群中有三个node节点:

  • 192.168.0.1
  • 192.168.0.2
  • 192.168.0.3

则我们可以通过192.168.0.1:nodePort(也可以是192.168.0.2:nodePort192.168.0.3:nodePort)访问k8s集群内部的服务。

默认的nodePort的范围是30000-32767, k8s会从中随机选择一个端口,我们也可以在spec.ports.nodePort中指定一个端口。

当然,我们可以修改apiserver的启动参数 --service-node-port-range来指定nodePort范围,如:--service-node-port-range 8000-9000

2. 实现

我们需要在service的yaml定义中指定nodePort:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: NodePort        // 指定service类型
  selector:
    app: forme
  ports:
    - port: 80         // 供集群中其它服务访问的端口
      targetPort: 8020 // 后端pod中container暴露的端口
      nodePort: 9000   //  节点暴露的端口

---
apiVersion: v1
kind: ReplicationController
metadata:
  name: forme
  namespace: default
spec:
  replicas: 1
  selector:
    app: forme
  template:
    metadata:
      name: forme
      labels:
        app: forme
    spec:
      volumes:
      - name: "config"
        hostPath:
          path: "/data/xxx"
      containers:
      - name: forme
        image: forme:k8s
        #command: ["/bin/sh", "-c"]
        #args: ["tail -f /dev/null"]
        #args: ["sleep 20"]
        resources:
          limits:
            alpha.kubernetes.io/nvidia-gpu: 1
            #cpu: 8
            #memory: 4Gi
        ports:
        - containerPort: 8020  // 该container监听的端口
        volumeMounts:
        - name: "config"
          mountPath: "/home/docker/code"

3. 验证

当服务启动以后,我们可以通过

# lsof -i:9000

查看端口情况。如果端口已经打开,但是其他节点无法访问,要查看防火墙设置,关闭防火墙即可。

4. 参考文章

https://www.jianshu.com/p/ce1028c1cbc0

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐