我在谷歌雲端上使用 Kubespray 設定了自己的叢集:1 個主節點,1 個節點。我在上面啟動了一個詹金斯應用程式。即使一切看起來都是正確的,該應用程式也不會顯示在瀏覽器中。我的服務和部署(從互聯網上的文章複製,這樣我就不會引入任何潛在的錯誤):
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: jenkins
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins
env:
- name: JAVA_OPTS
value: -Djenkins.install.runSetupWizard=false
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
一切看起來都如你所期望的。運行 kubectl get pods 並查看它是否正在運行:
NAME READY STATUS RESTARTS AGE
jenkins-b64d4d96d-4vj48 1/1 Running 0 22m
為節點連接埠執行 kubectl get svc:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins NodePort 10.233.28.168 <none> 8080:31794/TCP 25m
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 11h
如果我訪問 <worker node ip >:31794 什麼也不會出現。我檢查了工作節點上的端口,我什至在工作節點上手動打開了 30000-32767,以防萬一(通過運行: sudo iptables -A INPUT -p tcp --dport 30000:32767)。運行 sudo netstat -tulpn | grep LISTEN 驗證節點連接埠 31794 是否開啟:
tcp6 0 0 :::10256 :::* LISTEN 9580/kube-proxy
tcp6 0 0 :::80 :::* LISTEN 1200/apache2
tcp6 0 0 :::31794 :::* LISTEN 9580/kube-proxy
tcp6 0 0 :::22 :::* LISTEN 1428/sshd
很明顯 31794 在工作節點上是開啟的。那為什麼我無法在瀏覽器中存取jenkins呢?一切似乎都井然有序。
答案1
在Service
規格中,您必須提及type: LoadBalancer
允許從瀏覽器存取。當您執行此操作時,您將在kubectl get svc
輸出中看到外部 IP 。
請注意,使用type: LoadBalancer
會將您的應用程式暴露在網路上。要限制這一點,您可能需要使用參數 - 新增允許的 IP 清單loadBalancerSourceRanges
。您的最終服務定義應如下所示
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: jenkins
type: LoadBalancer
# Restrict access to this LoadBalancer to the below ips
loadBalancerSourceRanges:
- 100.100.100.100/32
- 1.1.1.2/32