Nginx入力コントローラーをkubernetesクラスターに追加して作成しようとしています。私の現在のクラスターには3つのノードがあり、すべてのノード間にファイアウォールルールが開かれています。 (注:これは教育目的のベアメタルクラスタです)
次の構成でデプロイを作成しました
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-test
labels:
app: nodejs
spec:
replicas: 5
selector:
matchLabels:
app: nodejs
template:
metadata:
labels:
app: nodejs
spec:
containers:
- name: nodejs-container
image: gcr.io/infrastructure/test-nodejs-server
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: test-deployment-service
spec:
selector:
app: nodejs
ports:
- protocol: TCP
port: 80
targetPort: 3000
Kubectl create -f file.yamlを実行した後
すべてのポッドとサービスが実行されているのがわかります。クラスター内では、そのサービスIPを丸めて、ポッドから応答を取得できます。
次に、イングレスを作成します。
https://github.com/kubernetes/ingress-nginx/tree/master/deploy にあるインストール手順を最初に実行しました
Ingressコントローラーが実行されているのがわかります。
NAMESPACE NAME READY STATUS RESTARTS AGE
default my-test-6445d9bb7b-blm7t 1/1 Running 0 3h
default nodejs-test-5657f7bb74-7hwqk 1/1 Running 0 23h
default nodejs-test-5657f7bb74-bh44x 1/1 Running 0 23h
default nodejs-test-5657f7bb74-dw4g4 1/1 Running 0 23h
default nodejs-test-5657f7bb74-k7bf4 1/1 Running 0 23h
default nodejs-test-5657f7bb74-xdthl 1/1 Running 0 23h
ingress-nginx default-http-backend-55c6c69b88-4d5bf 1/1 Running 0 26m
ingress-nginx nginx-ingress-controller-5c6698dfbf-gs9zd 1/1 Running 0 25m
kube-system etcd-yoda.me.com 1/1 Running 1 1d
kube-system kube-apiserver-yoda.me.com 1/1 Running 1 1d
kube-system kube-controller-manager-yoda.me.com 1/1 Running 1 1d
kube-system kube-dns-6f4fd4bdf-62bxg 3/3 Running 3 1d
kube-system kube-flannel-ds-jbmwg 1/1 Running 1 1d
kube-system kube-flannel-ds-r8nfb 1/1 Running 2 1d
kube-system kube-flannel-ds-rczbx 1/1 Running 0 1d
kube-system kube-proxy-brm2g 1/1 Running 0 1d
kube-system kube-proxy-qjgcv 1/1 Running 1 1d
kube-system kube-proxy-sz6rw 1/1 Running 1 1d
kube-system kube-scheduler-yoda.me.com 1/1 Running 1 1d
kube-system kubernetes-dashboard-5bd6f767c7-stscl 1/1 Running 1 23h
kube-system tiller-deploy-59d854595c-tngg6 1/1 Running 0 23h
次に、次のファイルでイングレスを作成します
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /whoop
backend:
serviceName: test-deployment-service
servicePort: 80
次に、kubectl get services --all-namespacesを実行して、イングレスコントローラーポートを見つけます。
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d
default my-test ClusterIP 10.110.102.5 <none> 80/TCP 4h
default test-deployment-service ClusterIP 10.104.239.37 <none> 80/TCP 23h
ingress-nginx default-http-backend ClusterIP 10.105.218.87 <none> 80/TCP 29m
ingress-nginx ingress-nginx NodePort 10.110.39.104 <none> 80:30652/TCP,443:31624/TCP 27m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 1d
kube-system kubernetes-dashboard ClusterIP 10.100.219.110 <none> 443/TCP 23h
kube-system tiller-deploy ClusterIP 10.101.179.202 <none> 44134/TCP 23h
次に、サーバーをカールします。
curl -v myserver:30652/whoop/
結果の応答は次のとおりです。
* Trying myip...
* TCP_NODELAY set
* Connected to myserver (myip) port 30652 (#0)
> GET /whoop/ HTTP/1.1
> Host: myserver:30652
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 308 Permanent Redirect
< Server: nginx/1.13.9
< Date: Fri, 02 Mar 2018 14:38:21 GMT
< Content-Type: text/html
< Content-Length: 187
< Connection: keep-alive
< Location: https://myserver:30652/whoop/
< Strict-Transport-Security: max-age=15724800; includeSubDomains;
<
<html>
<head><title>308 Permanent Redirect</title></head>
<body bgcolor="white">
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.13.9</center>
</body>
</html>
* Connection #0 to Host myserver left intact
ポッドからの応答を期待しています。ただし、常に308が表示されます。
ランダムなパスをカールさせると
カールmyserver:30652 /ランダム
私が得る応答は
default backend - 404
ルーティングが正しく機能するように、イングレスとイングレスコントローラを接続するにはどうすればよいですか?
ここで重要なのは、ホストに名前を付けることです。それ以外の場合、上りルールは、デフォルトでHTTPをHTTPSにリダイレクトするように構成されているデフォルトサーバーに適用されます。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- Host: foo.bar.com
http:
paths:
- path: /whoop
backend:
serviceName: test-deployment-service
servicePort: 80
デフォルトのサーバーのリダイレクト動作を無効にできるはずですが、私はまだ試していません。
同じ問題が発生しましたが、Host
値を追加したくありませんでした。 David のようなデフォルトサーバーによるHTTPからHTTPSへのリダイレクトを防ぐために、代わりにこのアノテーションを入力に追加し、それを修正しました:nginx.ingress.kubernetes.io/ssl-redirect: "false"
。
私の動作するイングレスは今このように見えます:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: "internal-nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: app1
servicePort: 80
- path: /app2/*
backend:
serviceName: app2
servicePort: 80