標準のKubernetesリソース
この例では、標準のKubernetesリソースをOAMリソースとともに使用して、アプリケーションを定義およびデプロイする方法を示します。この例では、ワークロードとトレイトの両方として、いくつかの標準のKubernetesリソースが使用されています。
- Deploymentは、Component内でワークロードとして使用されます。
- ServiceはComponent内でワークロードとして使用されます。
- Ingressは、ApplicationConfiguration内でトレイトとして使用されます。
始める前に
インストールの手順に従って、Verrazzanoをインストールします。
権限の付与
oam-kubernetes-runtime
は、この例で使用されているKubernetes Ingressリソースを作成できるようにする権限付きでインストールされません。次のステップでは、Ingressリソースの作成を許可するロールを作成し、そのロールをoam-kubernetes-runtime
サービス・アカウントにバインドします。この例が機能するには、クラスタ管理者が次のステップを実行してClusterRoleおよびClusterRoleBindingを作成する必要があります。
$ kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: oam-kubernetes-runtime-ingresses
rules:
- apiGroups:
- networking.k8s.io
- extensions
resources:
- ingresses
verbs:
- create
- delete
- get
- list
- patch
- update
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: oam-kubernetes-runtime-ingresses
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: oam-kubernetes-runtime-ingresses
subjects:
- kind: ServiceAccount
name: oam-kubernetes-runtime
namespace: verrazzano-system
EOF
アプリケーションのデプロイ
この例では、一般的なサンプル・アプリケーション・イメージを使用するWebアプリケーションを示します。アクセスすると、アプリケーションは構成済テキストを返します。
-
アプリケーション・ネームスペースを作成し、ネームスペースがVerrazzanoによって管理されることを示すラベルを追加します。
$ kubectl create namespace oam-kube $ kubectl label namespace oam-kube verrazzano-managed=true istio-injection=enabled
-
Deploymentワークロードを含むComponentを作成します。
$ kubectl apply -f - <<EOF apiVersion: core.oam.dev/v1alpha2 kind: Component metadata: name: oam-kube-dep-comp namespace: oam-kube spec: workload: kind: Deployment apiVersion: apps/v1 name: oam-kube-dep spec: replicas: 1 selector: matchLabels: app: oam-kube-app template: metadata: labels: app: oam-kube-app spec: containers: - name: oam-kube-cnt image: hashicorp/http-echo args: - "-text=hello" EOF
-
Serviceワークロードを含むComponentを作成します。
$ kubectl apply -f - <<EOF apiVersion: core.oam.dev/v1alpha2 kind: Component metadata: name: oam-kube-svc-comp namespace: oam-kube spec: workload: kind: Service apiVersion: v1 metadata: name: oam-kube-svc spec: selector: app: oam-kube-app ports: - port: 5678 # Default port for image EOF
-
両方のComponentを参照し、イングレス・トレイトを構成するApplicationConfigurationを作成します。
$ kubectl apply -f - <<EOF apiVersion: core.oam.dev/v1alpha2 kind: ApplicationConfiguration metadata: name: oam-kube-appconf namespace: oam-kube spec: components: - componentName: oam-kube-dep-comp - componentName: oam-kube-svc-comp traits: - trait: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: oam-kube-ing annotations: kubernetes.io/ingress.class: istio spec: rules: - host: oam-kube-app.example.com http: paths: - path: /example backend: serviceName: oam-kube-svc servicePort: 5678 EOF
アプリケーションの探索
- アプリケーションのホスト名を取得します。
$ export HOST=$(kubectl get ingress \ -n oam-kube oam-kube-ing \ -o jsonpath='{.spec.rules[0].host}') $ echo "HOST=${HOST}"
- イングレス・ゲートウェイのロード・バランサ・アドレスを取得します。
$ export LOADBALANCER=$(kubectl get ingress \ -n oam-kube oam-kube-ing \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ echo "LOADBALANCER=${LOADBALANCER}"
- アプリケーションにアクセスします。
$ curl http://${HOST}/example --resolve ${HOST}:80:${LOADBALANCER} # Expected response hello
アプリケーションのアンデプロイ
アプリケーションをアンデプロイするには、作成されたネームスペースを削除します。これにより、ネームスペース内に明示的および暗黙的に作成されたすべてのリソースが削除されます。
$ kubectl delete namespace oam-kube
必要に応じて、クラスタ管理者は、作成されたClusterRoleおよびClusterRoleBindingを削除することもできます。
$ kubectl delete ClusterRoleBinding oam-kubernetes-runtime-ingresses
$ kubectl delete ClusterRole oam-kubernetes-runtime-ingresses