簡體   English   中英

kubernetes pod 端口暴露/轉發

[英]kubernetes pod port expose/forward

我正在嘗試在 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

你的環境是什么? 您是否使用 docker desktop/minikube/kubeadm 運行本地 k8s 集群?

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

負載平衡不應該在您的單節點機器(使用 Minikube)上實現,存在某種“hack”

如果您在雲提供商上部署集群,負載均衡器將是完全托管的

對於我所說的“hack”,請查看本教程視頻部分關於 Ingress 組件的解釋: https://youtu.be/X48VuDVv0do?t=7312

您應該在入口前面、負載均衡器前面、部署 Pod 前面放置一個帶有 nginx 服務器的 Pod

我看到您在本地運行您的 k8s 集群,在這種情況下,不建議使用 LoadBalancer ServiceType,因為此類型使用雲提供商的負載均衡器將服務暴露在外部。 您可能會使用自托管或硬件負載均衡器,但我認為這對於 minikube 集群來說有點過分了。

在您的 minikube 部署中,我建議使用 NodePort 服務類型,因為它使用節點的 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 服務 go 的更多信息。

您使用端口 8080 上的服務公開了應用程序,但該端口在 kubernetes 之外未知,與服務或 pod 的 ip 地址相同。

該服務打開了一個指向部署端口的NodePort

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

使用 curl 到 ip:port 目標應該工作:

curl <cluster-node>:31461

集群節點 ip 取決於您如何設置 minikube。

問題出在 minikube 本身 - 在檢查kubectl get events --all-namespaces時發現它,發生了一些奇怪的事情,看起來內部代理組件已損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM