Files
kubevela/docs/en/end-user/debug.md
Lei Zhang 2ca7ce5c8b Fix docs
2021-05-04 11:28:11 -07:00

9.0 KiB

title
title
Dry-Run and Live-Diff

KubeVela allows you to dry-run and live-diff your application.

Dry-Run the Application

Dry run will help you to understand what are the real resources which will to be expanded and deployed to the Kubernetes cluster. In other words, it will mock to run the same logic as KubeVela's controller and output the results locally.

For example, let's dry-run the following application:

# app.yaml
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: vela-app
spec:
  components:
    - name: express-server
      type: webservice
      properties:
        image: crccheck/hello-world
        port: 8000
      traits:
        - type: ingress
          properties:
            domain: testsvc.example.com
            http:
              "/": 8000
kubectl vela dry-run -f app.yaml
---
# Application(vela-app) -- Comopnent(express-server)
---

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.oam.dev/appRevision: ""
    app.oam.dev/component: express-server
    app.oam.dev/name: vela-app
    workload.oam.dev/type: webservice
spec:
  selector:
    matchLabels:
      app.oam.dev/component: express-server
  template:
    metadata:
      labels:
        app.oam.dev/component: express-server
    spec:
      containers:
      - image: crccheck/hello-world
        name: express-server
        ports:
        - containerPort: 8000

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.oam.dev/appRevision: ""
    app.oam.dev/component: express-server
    app.oam.dev/name: vela-app
    trait.oam.dev/resource: service
    trait.oam.dev/type: ingress
  name: express-server
spec:
  ports:
  - port: 8000
    targetPort: 8000
  selector:
    app.oam.dev/component: express-server

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  labels:
    app.oam.dev/appRevision: ""
    app.oam.dev/component: express-server
    app.oam.dev/name: vela-app
    trait.oam.dev/resource: ingress
    trait.oam.dev/type: ingress
  name: express-server
spec:
  rules:
  - host: testsvc.example.com
    http:
      paths:
      - backend:
          serviceName: express-server
          servicePort: 8000
        path: /

---

In this example, the definitions(webservice and ingress) which vela-app depends on is the built-in components and traits of KubeVela. You can also use -d or --definitions to specify your local definition files.

-d or --definitions permitting user to provide capability definitions used in the application from local files. dry-run cmd will prioritize the provided capabilities than the living ones in the cluster.

Live-Diff the Application

Live-diff helps you to have a preview of what would change if you're going to upgrade an application without making any changes to the living cluster. This feature is extremely useful for serious production deployment, and make the upgrade under control

It basically generates a diff between the specific revision of running instance and the local candidate application. The result shows the changes (added/modified/removed/no_change) of the application as well as its sub-resources, such as components and traits.

Assume you have just deployed the application in dry-run section. Then you can list the revisions of the Application.

$ kubectl get apprev -l app.oam.dev/name=vela-app
NAME          AGE
vela-app-v1   50s

Assume we're going to upgrade the application like below.

# new-app.yaml
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: vela-app
spec:
  components:
    - name: express-server
      type: webservice
      properties:
        image: crccheck/hello-world
        port: 8080 # change port
        cpu: 0.5 # add requests cpu units
    - name: my-task # add a component
      type: task
      properties:
        image: busybox
        cmd: ["sleep", "1000"]
      traits:
        - type: ingress
          properties:
            domain: testsvc.example.com
            http:
              "/": 8080 # change port

Run live-diff like this:

kubectl vela live-diff -f new-app.yaml -r vela-app-v1

-r or --revision is a flag that specifies the name of a living ApplicationRevision with which you want to compare the updated application.

-c or --context is a flag that specifies the number of lines shown around a change. The unchanged lines which are out of the context of a change will be omitted. It's useful if the diff result contains a lot of unchanged content while you just want to focus on the changed ones.

Click to view the details of diff result
---
# Application (vela-app) has been modified(*)
---
  apiVersion: core.oam.dev/v1beta1
  kind: Application
  metadata:
    creationTimestamp: null
    name: vela-app
    namespace: default
  spec:
    components:
    - name: express-server
      properties:
+       cpu: 0.5
        image: crccheck/hello-world
-       port: 8000
+       port: 8080
+     type: webservice
+   - name: my-task
+     properties:
+       cmd:
+       - sleep
+       - "1000"
+       image: busybox
      traits:
      - properties:
          domain: testsvc.example.com
          http:
-           /: 8000
+           /: 8080
        type: ingress
-     type: webservice
+     type: task
  status:
    batchRollingState: ""
    currentBatch: 0
    rollingState: ""
    upgradedReadyReplicas: 0
    upgradedReplicas: 0

---
## Component (express-server) has been modified(*)
---
  apiVersion: core.oam.dev/v1alpha2
  kind: Component
  metadata:
    creationTimestamp: null
    labels:
      app.oam.dev/name: vela-app
    name: express-server
  spec:
    workload:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app.oam.dev/appRevision: ""
          app.oam.dev/component: express-server
          app.oam.dev/name: vela-app
          workload.oam.dev/type: webservice
      spec:
        selector:
          matchLabels:
            app.oam.dev/component: express-server
        template:
          metadata:
            labels:
              app.oam.dev/component: express-server
          spec:
            containers:
            - image: crccheck/hello-world
              name: express-server
              ports:
-             - containerPort: 8000
+             - containerPort: 8080
  status:
    observedGeneration: 0

---
### Component (express-server) / Trait (ingress/service) has been removed(-)
---
- apiVersion: v1
- kind: Service
- metadata:
-   labels:
-     app.oam.dev/appRevision: ""
-     app.oam.dev/component: express-server
-     app.oam.dev/name: vela-app
-     trait.oam.dev/resource: service
-     trait.oam.dev/type: ingress
-   name: express-server
- spec:
-   ports:
-   - port: 8000
-     targetPort: 8000
-   selector:
-     app.oam.dev/component: express-server

---
### Component (express-server) / Trait (ingress/ingress) has been removed(-)
---
- apiVersion: networking.k8s.io/v1beta1
- kind: Ingress
- metadata:
-   labels:
-     app.oam.dev/appRevision: ""
-     app.oam.dev/component: express-server
-     app.oam.dev/name: vela-app
-     trait.oam.dev/resource: ingress
-     trait.oam.dev/type: ingress
-   name: express-server
- spec:
-   rules:
-   - host: testsvc.example.com
-     http:
-       paths:
-       - backend:
-           serviceName: express-server
-           servicePort: 8000
-         path: /

---
## Component (my-task) has been added(+)
---
+ apiVersion: core.oam.dev/v1alpha2
+ kind: Component
+ metadata:
+   creationTimestamp: null
+   labels:
+     app.oam.dev/name: vela-app
+   name: my-task
+ spec:
+   workload:
+     apiVersion: batch/v1
+     kind: Job
+     metadata:
+       labels:
+         app.oam.dev/appRevision: ""
+         app.oam.dev/component: my-task
+         app.oam.dev/name: vela-app
+         workload.oam.dev/type: task
+     spec:
+       completions: 1
+       parallelism: 1
+       template:
+         spec:
+           containers:
+           - command:
+             - sleep
+             - "1000"
+             image: busybox
+             name: my-task
+           restartPolicy: Never
+ status:
+   observedGeneration: 0

---
### Component (my-task) / Trait (ingress/service) has been added(+)
---
+ apiVersion: v1
+ kind: Service
+ metadata:
+   labels:
+     app.oam.dev/appRevision: ""
+     app.oam.dev/component: my-task
+     app.oam.dev/name: vela-app
+     trait.oam.dev/resource: service
+     trait.oam.dev/type: ingress
+   name: my-task
+ spec:
+   ports:
+   - port: 8080
+     targetPort: 8080
+   selector:
+     app.oam.dev/component: my-task

---
### Component (my-task) / Trait (ingress/ingress) has been added(+)
---
+ apiVersion: networking.k8s.io/v1beta1
+ kind: Ingress
+ metadata:
+   labels:
+     app.oam.dev/appRevision: ""
+     app.oam.dev/component: my-task
+     app.oam.dev/name: vela-app
+     trait.oam.dev/resource: ingress
+     trait.oam.dev/type: ingress
+   name: my-task
+ spec:
+   rules:
+   - host: testsvc.example.com
+     http:
+       paths:
+       - backend:
+           serviceName: my-task
+           servicePort: 8080
+         path: /