/
カテゴリー
概要
サーバーを勉強するためにおうちラックを買った先輩がKubernetesに手を出し始めたらしい。
Ingressを使って Webサイトを用意したところ、なぜかつながらないらしい。
原因を究明してつながるようにしてほしい。
前提条件
- Ingressは
nginx.ingress.kubernetes.io/proxy-buffering
をonにしたまま - はじめにデプロイされていたリソースを削除しない
- デプロイされているPodを変更してはいけない
初期状態
- 問題環境に接続するための
bastion
サーバーからcurl -k https://192.168.13.101
をすると、502が返ってくる 。
終了状態
手元のPCから curl -k https://192.168.13.101
をするとステータスコード200の以下のレスポンスが返ってくる。
welcome to ictsc2021 summer
解説
KubernetesのNginx Ingress に関する問題でした。
問題の初期状態
- Kubeadmによって構築されたK8sクラスタにMetalLB、Nginx ingress Controller、Nginxがデプロイされている。
- MetalLBはサンプル通り、[Nginx ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/#bare-metalはServiceをNodePortからLoadBalancerに変更したもの
- そのほかのマニフェスト,利用したファイルは以下
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-buffering: "on" nginx.ingress.kubernetes.io/proxy-buffer-size: "8" kubernetes.io/ingress.allow-http: "false" name: nginx-ingress spec: tls: - secretName: tls-secret rules: - http: paths: - path: / pathType: Prefix backend: service: name: nginx-svc port: number: 443
nginx.yaml
--- apiVersion: v1 kind: Service metadata: name: nginx-svc labels: app: nginx spec: selector: app: nginx ports: - name: https protocol: TCP port: 443 targetPort: 443 - name: http protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 443 - containerPort: 80 volumeMounts: - name: nginx-conf mountPath: /etc/nginx/conf.d - name: tls-cert mountPath: /etc/nginx/tls - name: index-html mountPath: /usr/share/nginx/html volumes: - name: nginx-conf configMap: name: nginx-conf - name: tls-cert secret: secretName: tls-secret - name: index-html configMap: name: index-html
index.html
welcome to ictsc2021 summer
curl -k https://192.168.13.101
を問題環境に接続するための踏み台や K8sクラスタのVMから行うと、502 Bad Gateway
が返ってくる。
解答解説
ingress.yamlでnginx.ingress.kubernetes.io/proxy-buffer-size: "8"
と指定されており、バックエンドからプロキシが受け取ることができるヘッダーサイズがとても小さくなっている。
また、Ingressがバックエンドの443番ポートにアクセスしているが、Nginx ingress controllerはデフォルトでHTTPを使うため、プロトコルの違いによってコンテンツが取得できない。
nginx.ingress.kubernetes.io/proxy-buffer-size
が “8” から”256″や”8k”などコンテンツを配信できるバッファサイズに変更nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
をannotationに追加
することで解決できる。
その他
割と、PodのSVCに直接指定したIPアドレスを割り当てる解答がありましたが、Ingressを使う旨が問題文にあったので終了条件は満たしていますが減点しました。
また、Pod/PodのSVCは80で受け付けているので、backend-protocol アノテーションをつけなくても解答できることに今気づきました。