Edited at

快適な kubernetes オンプレミス環境を構築する(5. nginx-ingress-controllerを使ったIngress環境のセットアップ)

More than 1 year has passed since last update.


シリーズ目次


  1. 設計編

  2. RancherOSインストール & セットアップ

  3. Rancher Server のセットアップ

  4. Kubernetes環境にホストを追加する

  5. nginx-ingress-controllerを使ったIngress環境のセットアップ

  6. SSL自動発行環境セットアップ(kube-lego)

  7. NFSサーバ&NFSクライアントセットアップ

  8. プライベートレジストリを構築する

  9. 総括


nginx-ingress-controllerを使ったIngress環境のセットアップ


ざっくりとした流れ


  • nginx-ingress-controller を動作させるノードにラベルを付ける

  • default http backend を kubectl でデプロイ

  • nginx-ingress-controller を kubectl でデプロイ

  • Amazon Route53 などで Router Node に付与しているグローバル IP アドレス向けにレコードを追加する


nginx-ingress-controller を動作させるノードにラベルを付ける


  • kubectl コマンドで特定のノードにラベルを付けて、Router Node として動作させるようにします

kubectl get nodes

NAME STATUS ROLES AGE VERSION
host_b Ready <none> 1d v1.8.3-rancher3
host_c Ready <none> 16d v1.8.3-rancher3
host_d Ready <none> 1d v1.8.3-rancher3


  • router node にしたいノードは host_d なので host_d に label を付けます

kubectl label node "role=router" -l "kubernetes.io/hostname=host_d"


default http backend を構築する


  • nginx-ingress-controller が解決できなかった URL などで 404 を返すために default http backend を構築しておきます

  • 以下のコマンドを CLI から実行します

  • k8s の namespace は ingress として分けておきます

$ cat <<EOF | kubectl create -f -

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: default-http-backend
labels:
app: default-http-backend
namespace: ingress
spec:
replicas: 1
selector:
matchLabels:
app: default-http-backend
template:
metadata:
labels:
app: default-http-backend
spec:
terminationGracePeriodSeconds: 60
containers:
- name: default-http-backend
# Any image is permissible as long as:
# 1. It serves a 404 page at /
# 2. It serves 200 on a /healthz endpoint
image: gcr.io/google_containers/defaultbackend:1.4
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- containerPort: 8080
resources:
limits:
cpu: 10m
memory: 20Mi
requests:
cpu: 10m
memory: 20Mi
---

apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: ingress
labels:
app: default-http-backend
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: default-http-backend
EOF


nginx-ingress-controller を kubectl でデプロイ


  • 以下のようなコマンドを実行して nginx-ingress-controller をデプロイします

  • DaemonSet でデプロイします

  • こちらも k8s の namespace は ingress として分けておきます

$ cat <<EOF | kubectl create -f -

apiVersion: extensions/v1beta1

kind: DaemonSet
metadata:
name: nginx-ingress-controller-v1
namespace: ingress
labels:
k8s-app: nginx-ingress-lb
kubernetes.io/cluster-service: "true"
spec:
template:
metadata:
labels:
k8s-app: nginx-ingress-lb
name: nginx-ingress-lb
spec:
hostNetwork: true
terminationGracePeriodSeconds: 60
nodeSelector:
role: router
containers:
- image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.10.2
name: nginx-ingress-lb
imagePullPolicy: Always
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 1
# use downward API
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
args:
- /nginx-ingress-controller
- --default-backend-service=ingress/default-http-backend
EOF


Amazon Route53 などで Router Node に付与しているグローバル IP アドレス向けにレコードを追加する


  • タイトル通りですが、ここでワイルドカードのレコードを追加します

  • 例として Router Node (host_d) が XX.XX.XX.XX というグローバル IP アドレスを持っていたとしたら、 XX.XX.XX.XX を *.k8s.example.com などのレコードに紐づけるようにしておきます


構築した Ingress を実際に使ってみる


  • k8s 内にコンテナを作って、そのコンテナのサービスを外部に公開できるか確認しましょう


Pod を作成

kubectl run echoheaders --image=gcr.io/google_containers/echoserver:1.4 --replicas=1 --port=8080


作成した Pod のサービスを公開する

kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders


Ingress で外部に公開する


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echomap
spec:
rules:
- host: echo.k8s.example.com
http:
paths:
- path: /
backend:
serviceName: echoheaders
servicePort: 80


  • ここでのポイントは host が echo.k8s.example.com になっているところです


  • http://echo.k8s.example.com/ にアクセスして確認してみてください


まとめ


  • k8s クラスタに Ingress 環境を構築するところを紹介しました

  • 次回は公開したサービスの SSL 証明書を自動発行する機構(kube-lego)を構築していきます


  • SSL自動発行環境セットアップ(kube-lego) に続く