Kubernetes - ブラウザにアプリが表示されない

Kubernetes - ブラウザにアプリが表示されない

Google Cloud で Kubespray を使用して独自のクラスターをセットアップしました: マスター 1 台、ノード 1 台。Jenkins アプリを起動しました。すべてが正しいように見えても、アプリはブラウザーに表示されません。私のサービスとデプロイメント (潜在的なエラーが発生しないように、インターネットの記事からコピーしました):

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

< ワーカー ノード 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。これを行うと、出力に外部 IP が表示されますkubectl get svc

を使用すると、アプリがインターネットに公開されることに注意してください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

関連情報