From 6f0c30b5d0aec4bdabba13cfbd004221265e58f1 Mon Sep 17 00:00:00 2001 From: Edward Cheng Date: Wed, 31 Jul 2024 01:49:55 +1000 Subject: [PATCH] App/plane (#730) * add app plane * add app plane --- apps/plane/base/configmap.yaml | 28 ++ apps/plane/base/deployment.yaml | 263 ++++++++++++++++++ apps/plane/base/ingress.yaml | 46 +++ apps/plane/base/job.yaml | 35 +++ apps/plane/base/kustomization.yaml | 9 + apps/plane/base/service-account.yaml | 6 + apps/plane/base/service.yaml | 69 +++++ apps/plane/env/k3s-cluster/config.json | 12 + apps/plane/env/k3s-cluster/kustomization.yaml | 4 + .../env/k3s-cluster/templates/plane-app.yaml | 23 ++ .../templates/plane-doc-store.yaml | 24 ++ .../env/k3s-cluster/templates/plane.yaml | 9 + 12 files changed, 528 insertions(+) create mode 100644 apps/plane/base/configmap.yaml create mode 100644 apps/plane/base/deployment.yaml create mode 100644 apps/plane/base/ingress.yaml create mode 100644 apps/plane/base/job.yaml create mode 100644 apps/plane/base/kustomization.yaml create mode 100644 apps/plane/base/service-account.yaml create mode 100644 apps/plane/base/service.yaml create mode 100644 apps/plane/env/k3s-cluster/config.json create mode 100644 apps/plane/env/k3s-cluster/kustomization.yaml create mode 100644 resources/app-secrets/env/k3s-cluster/templates/plane-app.yaml create mode 100644 resources/app-secrets/env/k3s-cluster/templates/plane-doc-store.yaml create mode 100644 resources/namespaces/env/k3s-cluster/templates/plane.yaml diff --git a/apps/plane/base/configmap.yaml b/apps/plane/base/configmap.yaml new file mode 100644 index 0000000..13b4069 --- /dev/null +++ b/apps/plane/base/configmap.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + namespace: plane + name: plane-app-vars +data: + SENTRY_DSN: "" + SENTRY_ENVIRONMENT: "" + DEBUG: "0" + DOCKERIZED: "1" + GUNICORN_WORKERS: "1" + WEB_URL: "http://plane.cluster.edward.sydney" + CORS_ALLOWED_ORIGINS: "http://plane.cluster.edward.sydney,https:/plane.cluster.edward.sydney" + REDIS_URL: "redis://redis.redis.svc.cluster.local:6379/" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + namespace: plane + name: plane-doc-store-vars +data: + FILE_SIZE_LIMIT: "5242880" + AWS_S3_BUCKET_NAME: "plane" + MINIO_ROOT_USER: "admin" + AWS_S3_ENDPOINT_URL: "http://minio.minio.svc.cluster.local:19000" + USE_MINIO: "1" +--- \ No newline at end of file diff --git a/apps/plane/base/deployment.yaml b/apps/plane/base/deployment.yaml new file mode 100644 index 0000000..a2954db --- /dev/null +++ b/apps/plane/base/deployment.yaml @@ -0,0 +1,263 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-admin-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-admin + template: + metadata: + namespace: plane + labels: + app.name: plane-admin + spec: + containers: + - name: plane-admin + imagePullPolicy: Always + image: makeplane/plane-frontend:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - node + args: + - admin/server.js + - admin + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-api-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-api + template: + metadata: + namespace: plane + labels: + app.name: plane-api + spec: + containers: + - name: plane-api + imagePullPolicy: Always + image: makeplane/plane-backend:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - ./bin/docker-entrypoint-api.sh + envFrom: + - configMapRef: + name: plane-app-vars + optional: false + - secretRef: + name: plane-app-secrets + optional: false + - configMapRef: + name: plane-doc-store-vars + optional: false + - secretRef: + name: plane-doc-store-secrets + optional: false + readinessProbe: + failureThreshold: 30 + httpGet: + path: / + port: 8000 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-beat-worker-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-beat-worker + template: + metadata: + namespace: plane + labels: + app.name: plane-beat-worker + spec: + containers: + - name: plane-beat-worker + imagePullPolicy: Always + image: makeplane/plane-backend:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - ./bin/docker-entrypoint-beat.sh + envFrom: + - configMapRef: + name: plane-app-vars + optional: false + - secretRef: + name: plane-app-secrets + optional: false + - configMapRef: + name: plane-doc-store-vars + optional: false + - secretRef: + name: plane-doc-store-secrets + optional: false + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-space-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-space + template: + metadata: + namespace: plane + labels: + app.name: plane-space + spec: + containers: + - name: plane-space + imagePullPolicy: Always + image: makeplane/plane-space:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - node + args: + - space/server.js + - space + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-web-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-web + template: + metadata: + namespace: plane + labels: + app.name: plane-web + spec: + containers: + - name: plane-web + imagePullPolicy: Always + image: makeplane/plane-frontend:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - node + args: + - web/server.js + - web + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: plane + name: plane-worker-wl +spec: + replicas: 1 + selector: + matchLabels: + app.name: plane-worker + template: + metadata: + namespace: plane + labels: + app.name: plane-worker + spec: + containers: + - name: plane-worker + imagePullPolicy: Always + image: makeplane/plane-backend:stable + stdin: true + tty: true + resources: + requests: + memory: "50Mi" + cpu: "50m" + limits: + memory: "1000Mi" + cpu: "500m" + command: + - ./bin/docker-entrypoint-worker.sh + envFrom: + - configMapRef: + name: plane-app-vars + optional: false + - secretRef: + name: plane-app-secrets + optional: false + - configMapRef: + name: plane-doc-store-vars + optional: false + - secretRef: + name: plane-doc-store-secrets + optional: false + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account + +--- \ No newline at end of file diff --git a/apps/plane/base/ingress.yaml b/apps/plane/base/ingress.yaml new file mode 100644 index 0000000..5670d99 --- /dev/null +++ b/apps/plane/base/ingress.yaml @@ -0,0 +1,46 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + namespace: plane + name: plane-ingress +spec: + ingressClassName: nginx + rules: + - host: plane.cluster.edward.sydney + http: + paths: + - backend: + service: + port: + number: 3000 + name: plane-web + path: / + pathType: Prefix + - backend: + service: + port: + number: 8000 + name: plane-api + path: /api + pathType: Prefix + - backend: + service: + port: + number: 8000 + name: plane-api + path: /auth + pathType: Prefix + - backend: + service: + port: + number: 3000 + name: plane-space + path: /spaces + pathType: Prefix + - backend: + service: + port: + number: 3000 + name: plane-admin + path: /god-mode + pathType: Prefix \ No newline at end of file diff --git a/apps/plane/base/job.yaml b/apps/plane/base/job.yaml new file mode 100644 index 0000000..2a621e1 --- /dev/null +++ b/apps/plane/base/job.yaml @@ -0,0 +1,35 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + namespace: plane + name: plane-api-migrate-{{ .Release.Revision }} +spec: + backoffLimit: 3 + template: + metadata: + labels: + app.name: plane-api-migrate + spec: + containers: + - name: plane-api-migrate + image: makeplane/plane-backend:stable + command: + - ./bin/docker-entrypoint-migrator.sh + imagePullPolicy: Always + envFrom: + - configMapRef: + name: plane-app-vars + optional: false + - secretRef: + name: plane-app-secrets + optional: false + - configMapRef: + name: plane-doc-store-vars + optional: false + - secretRef: + name: plane-doc-store-secrets + optional: false + restartPolicy: OnFailure + serviceAccount: plane-srv-account + serviceAccountName: plane-srv-account \ No newline at end of file diff --git a/apps/plane/base/kustomization.yaml b/apps/plane/base/kustomization.yaml new file mode 100644 index 0000000..60ad62c --- /dev/null +++ b/apps/plane/base/kustomization.yaml @@ -0,0 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ./configmap.yaml + - ./service-account.yaml + - ./job.yaml + - ./deployment.yaml + - ./service.yaml + - ./ingress.yaml \ No newline at end of file diff --git a/apps/plane/base/service-account.yaml b/apps/plane/base/service-account.yaml new file mode 100644 index 0000000..ea5b934 --- /dev/null +++ b/apps/plane/base/service-account.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + namespace: plane + name: plane-srv-account \ No newline at end of file diff --git a/apps/plane/base/service.yaml b/apps/plane/base/service.yaml new file mode 100644 index 0000000..78db580 --- /dev/null +++ b/apps/plane/base/service.yaml @@ -0,0 +1,69 @@ +--- +apiVersion: v1 +kind: Service +metadata: + namespace: plane + name: plane-admin + labels: + app.name: plane-admin +spec: + clusterIP: None + ports: + - name: admin-3000 + port: 3000 + protocol: TCP + targetPort: 3000 + selector: + app.name: plane-admin +--- +apiVersion: v1 +kind: Service +metadata: + namespace: plane + name: plane-api + labels: + app.name: plane-api +spec: + clusterIP: None + ports: + - name: api-8000 + port: 8000 + protocol: TCP + targetPort: 8000 + selector: + app.name: plane-api +--- +apiVersion: v1 +kind: Service +metadata: + namespace: plane + name: plane-space + labels: + app.name: plane-space +spec: + clusterIP: None + ports: + - name: space-3000 + port: 3000 + protocol: TCP + targetPort: 3000 + selector: + app.name: plane-space +--- +apiVersion: v1 +kind: Service +metadata: + namespace: plane + name: plane-web + labels: + app.name: plane-web +spec: + clusterIP: None + ports: + - name: web-3000 + port: 3000 + protocol: TCP + targetPort: 3000 + selector: + app.name: plane-web +--- diff --git a/apps/plane/env/k3s-cluster/config.json b/apps/plane/env/k3s-cluster/config.json new file mode 100644 index 0000000..7dcb086 --- /dev/null +++ b/apps/plane/env/k3s-cluster/config.json @@ -0,0 +1,12 @@ +{ + "appName": "plane", + "userGivenName": "plane", + "namespace": "plane", + "destNamespace": "plane", + "destServer": "https://kubernetes.default.svc", + "srcPath": "apps/plane/env/k3s-cluster", + "srcRepoURL": "https://github.com/3dwardch3ng/home-cluster-ops.git", + "srcTargetRevision": "", + "labels": null, + "annotations": null +} \ No newline at end of file diff --git a/apps/plane/env/k3s-cluster/kustomization.yaml b/apps/plane/env/k3s-cluster/kustomization.yaml new file mode 100644 index 0000000..a227ac4 --- /dev/null +++ b/apps/plane/env/k3s-cluster/kustomization.yaml @@ -0,0 +1,4 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - ../../base \ No newline at end of file diff --git a/resources/app-secrets/env/k3s-cluster/templates/plane-app.yaml b/resources/app-secrets/env/k3s-cluster/templates/plane-app.yaml new file mode 100644 index 0000000..6e43dcc --- /dev/null +++ b/resources/app-secrets/env/k3s-cluster/templates/plane-app.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + annotations: + sealedsecrets.bitnami.com/cluster-wide: "true" + creationTimestamp: null + name: plane-app-secrets + namespace: plane +spec: + encryptedData: + DATABASE_URL: AgBtQ5he7Q8FSo+GyEV+KK11PYdICqrRv5lYnOAVMnngr9gBMA92toE6Xhc3LZfMR25ePZfCGx4UY6z03SE3kaxlC/1+OnsEv2J+/SL/aGHlJoSDZgW7iKDRUsLa4oVgN/ufMNPRSUldyNnUpHo1ZPIo9zJKlckXVHjC+hf8g75GlAGYo0wElolhD/06tsd4Bc188ccyVzZlQXMunri/XqXPdrwuzsPkgsWQHtgJL9RLX/Ew/zvuGrjWRoHHzxlXchu2j+jfhU+aR/kyUnxOtjsjorAhz1acivYeZlFEFhQd3wpFCtwHw2JS4SYfmTBr5UrGOoYbjcXkzuHYUq7uFqUbXG7+PgKlE9BvL3mz0h84MK1tCkWTf/OFFd3o3uMwXnBpDAAnvinV6AUBGuF1XAYVykO3iFR1+kU5c641nkFnJ4M8UI3QP6R9iUQpDmNLtUBvQJ2Wtm9k79IAkA+Wvpj1EiFdzZqdpXXjW8nyWix/PMeNqAD7NBgKpKEiQ0DZMtCVPSsQ0ImZZCHN3wYPar05OTj9cVC6RKogtR9FHqlZLikt78JQXcrl5neUCHjQLWNYOXsLQbzLissNJLt5yViF2a/prbR2Jbjg4seYc4qxb3IQDqeH/2lV0VSJZrcbpC3kL3jQdIVe/jhK5UU3m5KH9e4HTWlNS9S7sP/FTP3f6PLwWVEpnyaR8JS1RQIBFQUD6vCQMTVqiYirZ+3LvKBYepRwBGrNF8yhEzC5DpFml/fpHnsSFogNXOGhqZtEUCJFI1xlfAQNsPL7bXr5Pbmio5AFpnqrNL7yD4FfBd4/5KGY/lHi + SECRET_KEY: AgBALDiQZIzoLufpAjYDaw2Ki3x4TAep0q0zQmLnhWMpsMerPG6q8f18XWLIYhvQ+oFcsg3RLayornryPIu7+knPmccfXGrJlxipqy2n17nh5k6dXg29LNxjWdS8MhechiN65mI1IqpV2cMTHjOUuv1YsT4x/a66biRXASjj8baDzs9EIeEv/2XfWbYk3xCVsOEdfaBomR5oByY5d9LHABzPllZxWxDvlaSm7+AkJsVaOywZHRp0tQNONGT1NCUMGvd5eFSzY3pmV5Xdv8/UFQaxDhC4ffiLXCtI/5cWctpq1/ez9yDThH0l+7bsimkKax6hpHJIwNPuSjluJ33HfvmeR3+59fjWRyP4l2JjCW+mWJEpjOWaCm0lpJLdXAWPCp+GVH+5D5RbYbYbTsgOssYxFgfPtTu77YSHc3CFv7E5BG/0MCVd2OcmEc8fMYWma38oi6FDToTRcJk07p809DJmLfJAOb9m3haSeWDNS/YpKCfQZtWbHO6oF8RYlkBjVy0YleE+nhJWXkiuKp6rF0TLvvk/Nb9u5O1bfpATaPQfqbsMVTpAVJvM+qZFisuzsK6phcXTezhbwzwmptFGyFyaqEUwYSMKLT0dMGlAU7tImmeCvs2/OJuUjCEVQZirO5HTSQYjUD/1t9FwuRXdfG0hcaQwgYl32Eo5Y28Q+A9ZOpeNbFW5H7/X3Kgre5T18NvYdB3Adm1gRd+Gios4d90XGk8MD0hhSbau93/KCNeBAyXPzuVUTDQ+T7nWQLkX3zhr7Q== + template: + metadata: + annotations: + argocd.argoproj.io/sync-options: Prune=false + sealedsecrets.bitnami.com/cluster-wide: "true" + sealedsecrets.bitnami.com/managed: "true" + creationTimestamp: null + name: plane-app-secrets + namespace: plane + type: Opaque diff --git a/resources/app-secrets/env/k3s-cluster/templates/plane-doc-store.yaml b/resources/app-secrets/env/k3s-cluster/templates/plane-doc-store.yaml new file mode 100644 index 0000000..7e3e393 --- /dev/null +++ b/resources/app-secrets/env/k3s-cluster/templates/plane-doc-store.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + annotations: + sealedsecrets.bitnami.com/cluster-wide: "true" + creationTimestamp: null + name: plane-doc-store-secrets + namespace: plane +spec: + encryptedData: + AWS_ACCESS_KEY_ID: AgBStbhakP/fEmALklALSl+uKJbEPBFvELNDvpEmx91k0OBikgvKRPgwNy5kTYAFFHeUt7U3V6Uo8S8OkTtlxSeBD6DKmtdHJwMU0VGbRnOpK48Ju5GLfIGdpMPhQ9djdA8XY4lezkbpiJBaHwu274vYi4eD1kAl21RS73FfpL52Xu8VCgap5X9VG4E1M5BF4B5/EBTqZaIgSjYwNk1nsCc3Qva39DiLEHluHnHR0ByMohjpHv2hbXYy6x9ECezNL1MUzT77PDEfVQs04o0RNS6pLG9tggl6hzzlvHlDA0MsknkGa1Iboi0RPGjFAk0O9yEhrbzqDSQEVn5KqEuglErduF0SB73I5B9lvRQ4ORWzrPKkDhgAqERo0LJY5FmaIFholiMd6k1EeDgX9l8hYtm0rddMlTb8cxjfivrSYwg99auv1S751Hwa0U9HKE7eb0ZVwGm1kAnA/Y2Ki/JeYLaplExMwyYwlacv5oZx+7wsvEFMCaSDP9O0M/Qu248Pc7rslsCtAA79amIhXoTzIwcrwcFE0KOnYFd0Rx7hNb3NJ3IHVwGIxiYZZgWlvKftDVH8MrZW3/+iWixJpy8dN2agZPp9zLzOSuvKm2c7SAcNtAvcJpIjA0FP1NwolPuwczSux3SRhuXDo/HgiD0h+M5hNlGnKM6b7THq6y1vRh2XUDyOT7Tcj3hCN3b0x9scnUQC8p+z3wHf14HFh7GQdWj2mKkn8g== + AWS_SECRET_ACCESS_KEY: AgAsW6ipYue6DmLH4aZsyvoKnD2JdLnsk/vvemycoK8Y1RwVPQLX6vcvG0F020814qingItLqpevzFj5hsd9uRLN0bYAxU1xlVLGV3ySt3lA/88twkBXMFwWi7B+HP9VxHLGD6pe7jlDLdxf9tUIV9pBOLJVr+nfXxzIuWO59rMQBOf6HA9wRtTqeWixdi3gyDUksXx+N7v2OPSuHYQ9gh/SfOyLyI0mavGLWWkzL5VdyUup99clWCCDJaLoFCXuWLj95uh6JGCQBBuyEBnz/y1/7wLPchcJnXsxU6oWFDXW9HwWgtikT94iTDqkvnEthIwlr55xIQbmDk6NaGXgK9taUzuPsx9DzP4AHSyMvlo7uP8Z74XdV0ctfLLZmtG/kUSQLrqEYDAjzUZyZBHMdS+qzp5hwxpIdDLiX54J9KZ7XOEuxvbyUPTMLrUu45VCni+MVPNzWj2bFKLonvFkxjup2cD8zJYyi+kb+6ANvy4umN64zVN6zPoAFvi0HTxq/Oqakkzu3iLlORscIhkFkplRXFWj6QIlKfMcsdxYPyHrCeuhBsPcXKveHkv/aRNDwbJvl4kCRYmqii1Yq6gClGKhbxCmvZQw8XR1LP5nUIBfpWiuaObY3qEW2e5/ac+H0YyUGp7DlGSvx650SNcMYgKLpqSjAlOb+YdUidKythJaEgwURvekU7hFpjhE4bA4X8KfqR1gaBP6wqRjFEMI+picWDvGUlxF/tt+/CEv5Qjol84cDkGqejMW + MINIO_ROOT_PASSWORD: AgCGsjeZalomydWLfqfYyrgQpQafjIZYh3TdxITYboyy3T/c6qMFHIo/TDR2ifHJsGYKUrmffoAb8zu/QxvR4lX61M3E3TYxA5Lsd4/y0rJ0ckQjQvBv8bA8hpQ0vtlpkvcH3yrYGfrSOZzrzZV3OlAlqb/wp8T3MX9UCBeiVJZBQQwA3dEG5xWXsGqmm52Ezg2plmzNDyZ9R7c18zGHNzXFaAW58Gbo5RxBSijUoEFs7v5jy8ZD7LiHbGCtSE9Gsmr+yW93LNh+09x+4PpC74qJFNyDQC7lir0MbvdyXZm83wONuWWB/gZmfASqR6VgT7ZATDO/cTgmSBJ3+zoDqu6qo8aOyt/P/7DlKQw6iEy8WKVCXKTzhiydpmC3bZkQSd/fhnL6Fxw9Ei/bZsQ5+2oUbHpPC4arctUszy2/+x3IRZLJrL9MsnFL0bBGRgBUL4AVcGTCTUQCt7ZlPROFVxwvvYtCDJEQzI4akenqES4wxlOYVUGKOKnEoS8UQ4RwnCzlxSh8nlY0srQnazLOGppg2YEHpvjaDOySVpUJ3pxXdy7W9zJYYJPhVDO26IchbgtRSl4/sHbsk+5ZD9aPRXf4DqA9ZB9Bzavr07zQxFSZwZxjG/Fgt4ww+8WS92XzLGf3AYzMROnaYYArjoHNDmd7iPqk0CIz3GXtURYQN2VU6rAW2rcHLOSm3mF2dXQXwsWrrItlGno5ME9jxnKP/nYO+C9KYA== + template: + metadata: + annotations: + argocd.argoproj.io/sync-options: Prune=false + sealedsecrets.bitnami.com/cluster-wide: "true" + sealedsecrets.bitnami.com/managed: "true" + creationTimestamp: null + name: plane-doc-store-secrets + namespace: plane + type: Opaque diff --git a/resources/namespaces/env/k3s-cluster/templates/plane.yaml b/resources/namespaces/env/k3s-cluster/templates/plane.yaml new file mode 100644 index 0000000..1bcc446 --- /dev/null +++ b/resources/namespaces/env/k3s-cluster/templates/plane.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Namespace +metadata: + annotations: + argocd.argoproj.io/sync-options: Prune=false + creationTimestamp: null + name: plane +spec: {} +status: {}