Kubernetes Pod端口暴露/转发

3

我正试图在一个Pod上暴露8080端口,以便我可以直接从服务器wget。使用端口转发(kubectl --namespace jenkins port-forward pods/jenkins-6f8b486759-6vwkj 9000:8080),一切都正常工作,我能够连接到127.0.0.1:9000。

但是当我尝试避免使用端口转发并永久开放端口时(kubectl expose deployment jenkins --type=LoadBalancer -njenkins): 我在svc中看到它(kubectl describe svc jenkins -njenkins):

Name:                     jenkins
Namespace:                jenkins
Labels:                   <none>
Annotations:              <none>
Selector:                 app=jenkins
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.111.244.192
IPs:                      10.111.244.192
Port:                     port-1  8080/TCP
TargetPort:               8080/TCP
NodePort:                 port-1  31461/TCP
Endpoints:                172.17.0.2:8080
Port:                     port-2  50000/TCP
TargetPort:               50000/TCP
NodePort:                 port-2  30578/TCP
Endpoints:                172.17.0.2:50000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

但是端口仍然没有开启,netstat 没有显示任何内容。应该如何正确操作?

使用的 minikube 版本为:v1.20.0,以下是 pod 的 yaml 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      securityContext:

      containers:
      - name: jenkins
        image: jenkins/jenkins:lts

        ports:
          - name: http-port
            containerPort: 8080
            hostPort: 8080
          - name: jnlp-port
            containerPort: 50000
        volumeMounts:
          - name: task-pv-storage
            mountPath: /var/jenkins_home
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim


从部署清单和服务输出来看,情况看起来相当不错。你能描述一下你是如何尝试连接到Jenkins的吗?我的意思是你是否尝试在31461端口上进行连接? - sxddhxrthx
我正在尝试在浏览器中打开 127.0.0.1:<ports>(目前正在我的笔记本上测试此配置),使用 netstat -an 检查这些端口,但什么也没有。端口 31461 也没有启动。 - Lev Bystritskiy
4个回答

2

我看到您正在本地运行k8s集群,在这种情况下,不建议使用LoadBalancer ServiceType,因为此类型使用云提供商的负载均衡器来将服务外部公开。您可以使用自托管或硬件负载均衡器,但我认为这有点过度kill了minikube集群。

在您的minikube部署中,我建议使用NodePort Service Type,因为它使用节点的IP地址来公开服务。示例YAML:

apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
spec:
  type: NodePort
  selector:
    app: jenkins
  ports:
    - port: 8080
      targetPort: 8080
      # nodePort field is optional, Kubernetes will allocate port from a range 30000-32767, but you can choose 
      nodePort: 30007
    - port: 50000
      targetPort: 50000     
      nodePort: 30008
  

那么,您可以通过<NodeIP>:<nodePort>访问您的应用程序。如果您想了解更多关于k8s服务的信息,请点击这里


我注释掉了第二个“port”部分(因为出现了* spec.ports[0].name: Required value and ...[1].name错误),并创建了一个服务:$ kubectl get svc -njenkins NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins-service NodePort 10.101.78.189 <none> 8080:30007/TCP 2m30s但仍然没有反应——本地PC上的8080和30007端口关闭,无法连接到集群IP等。 - Lev Bystritskiy

1
问题出在minikube本身,我在检查kubectl get events --all-namespaces时发现了这个问题,一些奇怪的事情正在发生,看起来内部代理组件已经损坏了。

1
请添加更多细节。您是如何解决问题的?将来,这样的信息可能对面临类似问题的人有用。 - user15659347

0

您在端口8080上使用服务公开了应用程序,但该端口在kubernetes之外是未知的,就像服务或Pod的IP地址一样。

该服务打开了一个指向部署端口的NodePort

[...]
NodePort:                 port-1  31461/TCP
[...]

使用curl访问ip:port目标应该可以正常工作:

curl <cluster-node>:31461

集群节点的IP地址取决于您如何设置minikube。


0

使用kubectl get pods -o=wide检查您的Pod是否具有外部IP。

负载均衡不应该在单节点机器(使用Minikube)上实现,但有一种“hack”方法。

如果您在云提供商上部署集群,则负载均衡器将是完全托管的。

关于我所说的“hack”方法,请查看此教程视频中有关Ingress组件的说明部分:https://youtu.be/X48VuDVv0do?t=7312

您需要在Ingress、负载均衡器和部署Pod之前放置一个带有nginx服务器的Pod。


名称 就绪状态 状态 重启次数 年龄 IP 节点 提名节点 可读性门户 jenkins-6f8b486759-6vwkj 1/1 运行中 0 4小时13分钟 172.17.0.2 minikube 不确定Ingress是否可行 - 添加nginx pod和配置仅用于端口转发将是我的最后选择。 - Lev Bystritskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接