標準のKubernetesリソース

標準の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アプリケーションを示します。アクセスすると、アプリケーションは構成済テキストを返します。

  1. アプリケーション・ネームスペースを作成し、ネームスペースがVerrazzanoによって管理されることを示すラベルを追加します。

    $ kubectl create namespace oam-kube
    $ kubectl label namespace oam-kube verrazzano-managed=true istio-injection=enabled
    
  2. 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
    
  3. 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
    
  4. 両方の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
    

アプリケーションの探索

  1. アプリケーションのホスト名を取得します。
    $ export HOST=$(kubectl get ingress \
        -n oam-kube oam-kube-ing \
        -o jsonpath='{.spec.rules[0].host}')
    $ echo "HOST=${HOST}"
    
  2. イングレス・ゲートウェイのロード・バランサ・アドレスを取得します。
    $ export LOADBALANCER=$(kubectl get ingress \
        -n oam-kube oam-kube-ing \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    $ echo "LOADBALANCER=${LOADBALANCER}"
    
  3. アプリケーションにアクセスします。
    $ 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