Oracle Container Engine for Kubernetes(OKE)にIngressを設定する

#　はじめに
この記事は[Oracle Cloud Infrastructure Advent Calendar 2020](https://qiita.com/advent-calendar/2020/oci) 23日目の記事です。

Oracle Container Engine for Kubernetes(以下略OKE)へIngressを設定してみたので、手順をまとめます。

# 準備作業(OKEの作成・クライアント環境の準備)
以下を参考にOKEクラスターを作成し、Cloud ShellからOKEクラスターへアクセスできることを確認します。

以下の手順の1~4を実施
https://oracle-japan.github.io/paasdocs/documents/containers/common/#_7

Cloud Shellでkubectl get nodeを実行し、ノードの情報が取得できればOK

    xxxxxxx@cloudshell:~ (ap-seoul-1)$ kubectl get node
    NAME        STATUS   ROLES   AGE   VERSION
    10.0.10.2   Ready    node    26h   v1.18.10

# TLSシークレットの作成
ingressに設定する自己証明書を作成します。Cloud Shell環境で以下のコマンドを実行します。

    $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
    $ kubectl create secret tls tls-secret --key tls.key --cert tls.crt


# Ingress Controllerの作成
OKEはingressにネイティブに対応していないため、ingress-nginxを利用する必要があります。以下のコマンドを実行しingress-nginxをOKEに作成します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

ingressリソースを作成します。
以下のファイルを`cloud-generic.yaml`の名前で作成します。

```yaml:cloud-generic.yaml
kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
```

次に以下のコマンドを実行して、ingress-nginxイングレス・コントローラ・サービスを作成します。

    kubectl apply -f cloud-generic.yaml

# Ingress、サンプルアプリケーションの適用

以下のファイルを`hello-world-ingress.yaml`の名前で作成します。

```yaml:hello-world-ingress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-hello-world
  labels:
    app: docker-hello-world
spec:
  selector:
    matchLabels:
      app: docker-hello-world
  replicas: 3
  template:
    metadata:
      labels:
        app: docker-hello-world
    spec:
      containers:
      - name: docker-hello-world
        image: scottsbaldwin/docker-hello-world:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: docker-hello-world-svc
spec:
  selector:
    app: docker-hello-world
  ports:
    - port: 8088
      targetPort: 80
  type: ClusterIP
```

次に以下のコマンドで作成します。

    kubectl create -f hello-world-ingress.yaml


# イングレス・リソースの作成

以下のファイルを`ingress.yaml`の名前で作成します。

```yaml:ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-world-ing
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - secretName: tls-secret
  rules:
  - http:
      paths:
      - backend:
          serviceName: docker-hello-world-svc
          servicePort: 8088
```

以下のコマンドでingressを作成します。

    kubectl create -f ingress.yaml

# サンプルアプリへ接続テスト

以下のコマンドを実行し、ロードバランサーのIPを取得します。

    xxxxxxxx_n@cloudshell:~ (ap-seoul-1)$ kubectl get svc -n ingress-nginx
    NAME            TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
    ingress-nginx   LoadBalancer   10.96.226.152   193.123.246.212   80:32177/TCP,443:30362/TCP   5m54s

表示されたEXTERNAL-IPにcurlコマンドを実行して応答を確認します。

    xxxxxxxx_n@cloudshell:~ (ap-seoul-1)$ curl -k https://193.123.246.212
    <h1>Hello webhook world from: docker-hello-world-665df7fd49-fftl8</h1>

参考
https://docs.cloud.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengsettingupingresscontroller.htm