第5章 開発
5.1. Serverless アプリケーション リンクのコピーリンクがクリップボードにコピーされました!
サーバーレスアプリケーションは、ルートと設定で定義され、YAML ファイルに含まれる Kubernetes サービスとして作成およびデプロイされます。OpenShift Serverless を使用してサーバーレスアプリケーションをデプロイするには、Knative Service オブジェクトを作成する必要があります。
Knative Service オブジェクトの YAML ファイルの例
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello
namespace: default
spec:
template:
spec:
containers:
- image: docker.io/openshift/hello-openshift
env:
- name: RESPONSE
value: "Hello Serverless!"
以下の方法のいずれかを使用してサーバーレスアプリケーションを作成できます。
- OpenShift Container Platform Web コンソールからの Knative サービスの作成Developer パースペクティブを使用したアプリケーションの作成 についてのドキュメントを参照してください。
-
Knative (
kn) CLI を使用して Knative サービスを作成します。 -
ocCLI を使用して、KnativeServiceオブジェクトを YAML ファイルとして作成し、適用します。
5.1.1. Knative CLI を使用したサーバーレスアプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
Knative (kn) CLI を使用してサーバーレスアプリケーションを作成すると、YAML ファイルを直接修正するよりも合理的で直感的なユーザーインターフェイスが得られます。kn service create コマンドを使用して、基本的なサーバーレスアプリケーションを作成できます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
-
Knative (
kn) CLI をインストールしている。 - OpenShift Container Platform でアプリケーションおよび他のワークロードを作成するために、プロジェクトを作成しているか、適切なロールおよびパーミッションを持つプロジェクトにアクセスできる。
手順
Knative サービスを作成します。
$ kn service create <service_name> --image <image> --tag <tag-value>詳細は以下のようになります。
-
--imageは、アプリケーションのイメージの URI です。 --tagは、サービスで作成される初期リビジョンにタグを追加するために使用できるオプションのフラグです。コマンドの例
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest出力例
Creating service 'event-display' in namespace 'default': 0.271s The Route is still working to reflect the latest desired specification. 0.580s Configuration "event-display" is waiting for a Revision to become ready. 3.857s ... 3.861s Ingress has not yet been reconciled. 4.270s Ready to serve. Service 'event-display' created with latest revision 'event-display-bxshg-1' and URL: http://event-display-default.apps-crc.testing
-
5.1.2. オフラインモードを使用したサービスの作成 リンクのコピーリンクがクリップボードにコピーされました!
オフラインモードで kn service コマンドを実行すると、クラスター上で変更は発生せず、代わりにサービス記述子ファイルがローカルマシンに作成されます。記述子ファイルを作成した後、クラスターに変更を伝播する前にファイルを変更することができます。
Knative CLI のオフラインモードはテクノロジープレビュー機能としてのみご利用いただけます。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
-
Knative (
kn) CLI をインストールしている。
手順
オフラインモードでは、ローカルの Knative サービス記述子ファイルを作成します。
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest \ --target ./ \ --namespace test出力例
Service 'event-display' created in namespace 'test'.--target ./フラグはオフラインモードを有効にし、./を新しいディレクトリーツリーを保存するディレクトリーとして指定します。既存のディレクトリーを指定せずに、
--target my-service.yamlなどのファイル名を使用すると、ディレクトリーツリーは作成されません。代わりに、サービス記述子ファイルmy-service.yamlのみが現在のディレクトリーに作成されます。ファイル名には、
.yaml、.ymlまたは.json拡張子を使用できます。.jsonを選択すると、JSON 形式でサービス記述子ファイルが作成されます。--namespace testオプションは、新規サービスをテストnamespace に配置します。--namespaceを使用せずに、OpenShift クラスターにログインしている場合には、記述子ファイルが現在の namespace に作成されます。それ以外の場合は、記述子ファイルがdefaultの namespace に作成されます。
作成したディレクトリー構造を確認します。
$ tree ./出力例
./ └── test └── ksvc └── event-display.yaml 2 directories, 1 file-
--targetで指定する現在の./ディレクトリーには新しいtest/ディレクトリーが含まれます。このディレクトリーの名前は、指定の namespace をもとに付けられます。 -
test/ディレクトリーには、リソースタイプの名前が付けられたksvcディレクトリーが含まれます。 -
ksvcディレクトリーには、指定のサービス名に従って命名される記述子ファイルevent-display.yamlが含まれます。
-
生成されたサービス記述子ファイルを確認します。
$ cat test/ksvc/event-display.yaml出力例
apiVersion: serving.knative.dev/v1 kind: Service metadata: creationTimestamp: null name: event-display namespace: test spec: template: metadata: annotations: client.knative.dev/user-image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest creationTimestamp: null spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest name: "" resources: {} status: {}新しいサービスに関する情報を一覧表示します。
$ kn service describe event-display --target ./ --namespace test出力例
Name: event-display Namespace: test Age: URL: Revisions: Conditions: OK TYPE AGE REASON--target ./オプションは、namespace サブディレクトリーを含むディレクトリー構造のルートディレクトリーを指定します。または、
--targetオプションで YAML または JSON ファイルを直接指定できます。使用可能なファイルの拡張子は、.yaml、.yml、および.jsonです。--namespaceオプションは、namespace を指定し、この namespace は必要なサービス記述子ファイルを含むサブディレクトリーのknと通信します。--namespaceを使用せず、OpenShift クラスターにログインしている場合には、knは現在の namespace をもとに名前が付けられたサブディレクトリーでサービスを検索します。それ以外の場合は、knはdefault/サブディレクトリーで検索します。
サービス記述子ファイルを使用してクラスターでサービスを作成します。
$ kn service create -f test/ksvc/event-display.yaml出力例
Creating service 'event-display' in namespace 'test': 0.058s The Route is still working to reflect the latest desired specification. 0.098s ... 0.168s Configuration "event-display" is waiting for a Revision to become ready. 23.377s ... 23.419s Ingress has not yet been reconciled. 23.534s Waiting for load balancer to be ready 23.723s Ready to serve. Service 'event-display' created to latest revision 'event-display-00001' is available at URL: http://event-display-test.apps.example.com
5.1.3. YAML を使用したサーバーレスアプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
YAML ファイルを使用して Knative リソースを作成する場合、宣言的 API を使用するため、再現性の高い方法でアプリケーションを宣言的に記述することができます。YAML を使用してサーバーレスアプリケーションを作成するには、Knative Service を定義する YAML ファイルを作成し、oc apply を使用してこれを適用する必要があります。
サービスが作成され、アプリケーションがデプロイされると、Knative はこのバージョンのアプリケーションのイミュータブルなリビジョンを作成します。また、Knative はネットワークプログラミングを実行し、アプリケーションのルート、ingress、サービスおよびロードバランサーを作成し、Pod をトラフィックに基づいて自動的にスケールアップ/ダウンします。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
- OpenShift Container Platform でアプリケーションおよび他のワークロードを作成するために、プロジェクトを作成しているか、適切なロールおよびパーミッションを持つプロジェクトにアクセスできる。
-
OpenShift CLI (
oc) をインストールしている。
手順
以下のサンプルコードを含む YAML ファイルを作成します。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-delivery namespace: default spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest env: - name: RESPONSE value: "Hello Serverless!"YAML ファイルが含まれるディレクトリーに移動し、YAML ファイルを適用してアプリケーションをデプロイします。
$ oc apply -f <filename>
5.1.4. サーバーレスアプリケーションのデプロイメントの確認 リンクのコピーリンクがクリップボードにコピーされました!
サーバーレスアプリケーションが正常にデプロイされたことを確認するには、Knative によって作成されたアプリケーション URL を取得してから、その URL に要求を送信し、出力を確認する必要があります。OpenShift Serverless は HTTP および HTTPS URL の両方の使用をサポートしますが、oc get ksvc からの出力は常に http:// 形式を使用して URL を出力します。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
-
ocCLI がインストールされている。 - Knative サービスを作成している。
前提条件
-
OpenShift CLI (
oc) をインストールしている。
手順
アプリケーション URL を検索します。
$ oc get ksvc <service_name>コマンドの例
$ oc get ksvc event-delivery出力例
NAME URL LATESTCREATED LATESTREADY READY REASON event-delivery http://event-delivery-default.example.com event-delivery-4wsd2 event-delivery-4wsd2 Trueクラスターに対して要求を実行し、出力を確認します。
HTTP 要求の例
$ curl http://event-delivery-default.example.comHTTPS 要求の例
$ curl https://event-delivery-default.example.com出力例
Hello Serverless!オプション。証明書チェーンで自己署名証明書に関連するエラーが発生した場合は、curl コマンドに
--insecureフラグを追加して、エラーを無視できます。$ curl https://event-delivery-default.example.com --insecure出力例
Hello Serverless!重要自己署名証明書は、実稼働デプロイメントでは使用しないでください。この方法は、テスト目的にのみ使用されます。
オプション。OpenShift Container Platform クラスターが認証局 (CA) で署名されているが、システムにグローバルに設定されていない証明書で設定されている場合、
curlコマンドでこれを指定できます。証明書へのパスは、--cacertフラグを使用して curl コマンドに渡すことができます。$ curl https://event-delivery-default.example.com --cacert <file>出力例
Hello Serverless!
5.1.5. HTTP2 および gRPC を使用したサーバーレスアプリケーションとの対話 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Serverless はセキュアでないルートまたは edge termination ルートのみをサポートします。非セキュアなルートまたは edge termination ルートは OpenShift Container Platform で HTTP2 をサポートしません。gRPC は HTTP2 によって転送されるため、これらのルートは gRPC もサポートしません。アプリケーションでこれらのプロトコルを使用する場合は、Ingress ゲートウェイを使用してアプリケーションを直接呼び出す必要があります。これを実行するには、Ingress ゲートウェイのパブリックアドレスとアプリケーションの特定のホストを見つける必要があります。
この方法は、LoadBalancer サービスタイプを使用して Kourier Gateway を公開する必要があります。これは、以下の YAML を KnativeServing カスタムリソース定義 (CRD) に追加して設定できます。
...
spec:
ingress:
kourier:
service-type: LoadBalancer
...
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
-
OpenShift CLI (
oc) をインストールしている。 - Knative サービスを作成している。
手順
- アプリケーションホストを検索します。サーバーレスアプリケーションのデプロイメントの確認の説明を参照してください。
Ingress ゲートウェイのパブリックアドレスを見つけます。
$ oc -n knative-serving-ingress get svc kourier出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kourier LoadBalancer 172.30.51.103 a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com 80:31380/TCP,443:31390/TCP 67mパブリックアドレスは
EXTERNAL-IPフィールドで表示され、この場合はa83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.comになります。HTTP 要求のホストヘッダーを手動でアプリケーションのホストに手動で設定しますが、Ingress ゲートウェイのパブリックアドレスに対して要求自体をダイレクトします。
$ curl -H "Host: hello-default.example.com" a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com出力例
Hello Serverless!Ingress ゲートウェイに対して要求を直接ダイレクトする間に、権限をアプリケーションのホストに設定して gRPC 要求を行うこともできます。
grpc.Dial( "a83e86291bcdd11e993af02b7a65e514-33544245.us-east-1.elb.amazonaws.com:80", grpc.WithAuthority("hello-default.example.com:80"), grpc.WithInsecure(), )注記直前の例のように、それぞれのポート (デフォルトでは 80) を両方のホストに追加します。
5.1.6. 制限のあるネットワークポリシーを持つクラスターでの Knative アプリケーションとの通信の有効化 リンクのコピーリンクがクリップボードにコピーされました!
複数のユーザーがアクセスできるクラスターを使用している場合、クラスターはネットワークポリシーを使用してネットワーク経由で相互に通信できる Pod、サービス、および namespace を制御する可能性があります。クラスターで制限的なネットワークポリシーを使用する場合は、Knative システム Pod が Knative アプリケーションにアクセスできない可能性があります。たとえば、namespace に、すべての要求を拒否する以下のネットワークポリシーがある場合、Knative システム Pod は Knative アプリケーションにアクセスできません。
namespace へのすべての要求を拒否する NetworkPolicy オブジェクトの例
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
namespace: example-namespace
spec:
podSelector:
ingress: []
Knative システム Pod からアプリケーションへのアクセスを許可するには、ラベルを各 Knative システム namespace に追加し、このラベルを持つ他の namespace の namespace へのアクセスを許可する アプリケーション namespace に NetworkPolicy オブジェクトを作成する必要があります。
クラスターの非 Knative サービスへの要求を拒否するネットワークポリシーは、これらのサービスへのアクセスを防止するネットワークポリシーです。ただし、Knative システム namespace から Knative アプリケーションへのアクセスを許可することにより、クラスターのすべての namespace から Knative アプリケーションへのアクセスを許可する必要があります。
クラスターのすべての namespace から Knative アプリケーションへのアクセスを許可しない場合は、代わりに Knative サービスの JSON Web Token 認証 を使用するようにしてください。Knative サービスの JSON Web トークン認証にはサービスメッシュが必要です。
前提条件
-
OpenShift CLI (
oc) をインストールしている。 - OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
手順
アプリケーションへのアクセスを必要とする各 Knative システム namespace に
knative.openshift.io/system-namespace=trueラベルを追加します。knative-servingnamespace にラベルを付けます。$ oc label namespace knative-serving knative.openshift.io/system-namespace=trueknative-serving-ingressnamespace にラベルを付けます。$ oc label namespace knative-serving-ingress knative.openshift.io/system-namespace=trueknative-eventing namespaceにラベルを付けます。$ oc label namespace knative-eventing knative.openshift.io/system-namespace=trueknative-kafka namespaceにラベルを付けます。$ oc label namespace knative-kafka knative.openshift.io/system-namespace=true
アプリケーション namespace で
NetworkPolicyオブジェクトを作成し、knative.openshift.io/system-namespaceラベルのある namespace からのアクセスを許可します。サンプル
NetworkPolicyオブジェクトapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: <network_policy_name>1 namespace: <namespace>2 spec: ingress: - from: - namespaceSelector: matchLabels: knative.openshift.io/system-namespace: "true" podSelector: {} policyTypes: - Ingress
5.1.7. init コンテナーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Init コンテナー は、Pod 内のアプリケーションコンテナーの前に実行される特殊なコンテナーです。これらは通常、アプリケーションの初期化ロジックを実装するために使用されます。これには、セットアップスクリプトの実行や、必要な設定のダウンロードが含まれる場合があります。
Init コンテナーを使用すると、アプリケーションの起動時間が長くなる可能性があるため、頻繁にスケールアップおよびスケールダウンすることが予想されるサーバーレスアプリケーションには注意して使用する必要があります。
複数の複数の init コンテナーは単一の Knative サービス仕様でサポートされます。テンプレート名が指定されていない場合、Knative はデフォルトの設定可能な名前付けテンプレートを提供します。初期化コンテナーテンプレートは、Knative Service オブジェクト仕様に適切な値を追加することで設定できます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされていること。
-
Knative サービスに init コンテナーを使用する前に、管理者は
kubernetes.podspec-init-containersフラグをKnativeServingカスタムリソース (CR) に追加する必要があります。詳細については、OpenShift Serverless のグローバルコンフィギュレーションドキュメントを参照してください。
手順
initContainers仕様をKnativeServiceオブジェクトに追加します。サービス仕様の例
apiVersion: serving.knative.dev/v1 kind: Service ... spec: template: spec: initContainers: - imagePullPolicy: IfNotPresent1 image: <image_uri>2 volumeMounts:3 - name: data mountPath: /data ...- 1
- イメージのダウンロード時の イメージプルポリシー。
- 2
- init コンテナーイメージの URI。
- 3
- コンテナーファイルシステム内でボリュームがマウントされる場所。
5.1.8. サービスごとの HTTPS リダイレクト リンクのコピーリンクがクリップボードにコピーされました!
networking.knative.dev/http-option アノテーションを設定することにより、サービスの HTTPS リダイレクトを有効または無効にできます。次の例は、Knative Service YAML オブジェクトでこのアノテーションを使用する方法を示しています。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: example
namespace: default
annotations:
networking.knative.dev/http-option: "redirected"
spec:
...